crypto-js 加密库学习笔记
Posted 胖鹅68
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了crypto-js 加密库学习笔记相关的知识,希望对你有一定的参考价值。
文章目录
文章参考
- https://www.liaoxuefeng.com/wiki/1022910821149312/1023025778520640
- https://www.npmjs.com/package/crypto-js
- https://github.com/brix/crypto-js
- https://cryptojs.gitbook.io/docs/
- https://www.jianshu.com/p/7b5eb33512fd
一、现状
- 加密算法全世界都知道
- 在不安全的网络下传输
二、解决问题
在加密算法公开并且不安全的网络环境下的安全性
三、crypto是什么?
crypto 模块提供了加密功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装
四、快速入门
- 安装
npm install crypto-js
- 引入
import CryptoJS from 'crypto-js';
console.log(CryptoJS.SHA256("huangbiao68").toString());
import sha256 from 'crypto-js/sha256';
console.log(sha256("huangbiao68").toString());
五、加密方式介绍
Base64加密
对于Base64编码的,我觉得看一篇文章能够解决你的疑惑,我在这里就不赘述了。
单向散列(hash)加密
-
定义:指把任意长的输入串编码变化成固定长的输出串,并且由输出串难以得到输入串的加密方式。
-
使用场景:对敏感数据加密; 如:用户密码,请求参数,文件加密
-
常见的单向散列加密算法:MD5、SHA、MAC、CRC
-
优点
方便存储:加密后都是固定大小(32位)的字符串,能够分配固定大小的空间存储;
损耗低:加密/加密对于性能的损耗微乎其微;
文件加密:只需要32位字符串就能对一个巨大的文件验证其完整性;
不可逆:大多数的情况下不可逆,具有良好的安全性。
-
缺点
- 存在暴力破解的可能性,最好通过加盐值的方式提高安全性
- 可能存在散列冲突
对称加密
-
定义:同一个密钥可以同时用作数据的加密和解密,这种方法称为对称加密。
-
用场景:相对于大一点的数据量或关键数据的加密;如:接口参数签名验证服务
-
常见的对称加密算法有:
- DES、高级加密标准(AES,Advanced Encryption Standard)
- AES是DES的升级版,密钥长度更长,选择更多,也更灵活,安全性更高,速度更快。
-
优点: 算法公开、计算量小、加密速度快、加密效率高
-
缺点
- 发送方和接收方必须商定好密钥,然后使双方都能保存好密钥,密钥管理成为双方的负担。
- 对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。
非对称加密
-
定义:需要两个密钥来进行加密和解密,这两个密钥分别是公钥(public key)和私钥(private key)。
-
使用场景:对安全性要求很高的场景,适合加密少量数据;如:支付数据、CA数字证书
-
常见的对称加密算法有:RSA、RSA2
-
优点:
与对称加密相比,安全性更好,加解密需要不同的密钥,公钥和私钥都可以进行相互的加解密。 -
缺点:
- 加密和解密花费时间长,速度慢只适合对少量数据进行加密。
- 非对称加密算法的RSA2比RSA有更强的安全能力。蚂蚁金服,新浪微博 都在使用 RSA2 算法。
谈撒盐(salt)加密
加密(注册时)
- 用户注册,系统随机产生salt值。
- 将salt值和密码连接起来,生产Hash值。
- 将Hash值和salt值分别存储在数据库中。
解密(登陆时)
- 系统根据用户名找到与之对应的密码Hash。
- 将用户输入密码和salt值进行散列。
- 判断生成的Hash值是否和数据库中Hash相同。
Hmac
Hmac类是用于创建加密Hmac摘要的工具。
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
六、案例
散列
import CryptoJS from "crypto-js";
console.log(CryptoJS.SHA256("123456").toString());
console.log("加密结果一 MD5:" + CryptoJS.MD5("你好"));
散列 + salt
import CryptoJS from "crypto-js";
console.log("加密结果一 MD5:" + CryptoJS.HmacMD5("你好", "salt"));
console.log(CryptoJS.HmacSHA256("123456", "salt").toString());
PBKDF2
var salt = CryptoJS.enc.Utf8.parse("salt"); //盐
var iter = 1000; //迭代次数
var mi = CryptoJS.PBKDF2("你好", salt, {
keySize: parseInt(4),
iterations: parseInt(iter),
});
console.log("加密结果三:" + mi);
AES
前端 crypto-js aes 加解密,参考vue AES加密(超详细)
- 加密解密的方法封装
import CryptoJS from 'crypto-js';
export default {
//随机生成指定数量的16进制key
generatekey(num) {
let library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let key = "";
for (var i = 0; i < num; i++) {
let randomPoz = Math.floor(Math.random() * library.length);
key += library.substring(randomPoz, randomPoz + 1);
}
return key;
},
//加密
encrypt(word, keyStr) {
keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345'; //判断是否存在ksy,不存在就用定义好的key
var key = CryptoJS.enc.Utf8.parse(keyStr);
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
return encrypted.toString();
},
//解密
decrypt(word, keyStr) {
keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345';
var key = CryptoJS.enc.Utf8.parse(keyStr);
var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
}
- 测试
// var keys = AES.generatekey(16);
//如果是对象/数组的话,需要先JSON.stringify转换成字符串
// 不传key值,就默认使用上述定义好的key值
var encrypts = AES.encrypt(JSON.stringify(cars));
var dess = JSON.parse(AES.decrypt(encrypts));
// var encrypts = AES.encrypt('1234asdasd');
// var dess = AES.decrypt(encrypts);
console.log(encrypts)
console.log(encrypts.length)
console.log(dess)
RSA
JavaScript的RSA加密库(cryptico、Node-rsa、Crypto、jsrsasign、JSEncrypt)
思维导图和附件
以上是关于crypto-js 加密库学习笔记的主要内容,如果未能解决你的问题,请参考以下文章