- 导入 crypto-js 库;
npm install crypto-js --save-dev
-
定义密钥 key 和密钥偏移量 iv ;
-
创建一个名为 crypto 的对象;
加密实现过程
-
首先将待加密的数据转换为 CryptoJS.enc.Utf8 格式的字节序列。
-
使用相应的加密算法(如 AES、DES、Triple DES、Rabbit 或 RC4)对字节序列进行加密,使用给定的密钥、密钥偏移量;
-
将加密结果转换为字符串形式,并返回加密后的结果;
解密实现过程
-
对于每个解密函数,首先将密文转换为 CryptoJS 支持的格式;
-
使用相应的解密算法对密文进行解密,使用给定的密钥、密钥偏移量;
-
将解密结果转换为字符串形式,返回解密的结果;
-
对于哈希函数 hashSHA256 ,使用 SHA256 算法对给定的数据进行哈希计算,并将结果转换为字符串形式返回;
-
最后,将 crypto 对象作为默认导出,放入main.js中全局注册或按需导入。
import CryptoJS from 'crypto-js';
const key = CryptoJS.enc.Utf8.parse('your key'); // 密钥
const iv = CryptoJS.enc.Utf8.parse('your iv'); // 添加密钥偏移量
const crypto = {
// AES(高级加密标准)
// AES 是一种对称加密算法,被广泛应用于保护数据的机密性
// 它支持不同的密钥长度(128位、192位和256位)和多种加密模式(如 ECB、CBC 等)
// AES 加密
encryptAES(encryptData) {
const srcs = CryptoJS.enc.Utf8.parse(encryptData);
const encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv, // 使用密钥偏移量
mode: CryptoJS.mode.CBC, // 使用 CBC 模式
// 除了CBC(密码块链模式)之外
// crypto-js 库还支持:
// 1. ECB(电子密码本模式)2. CFB(密码反馈模式)3. OFB(输出反馈模式)4. CTR(计数器模式)
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
},
// AES 解密
decryptAES(encryptData) {
try {
const decrypt = CryptoJS.AES.decrypt(encryptData, key, {
iv, // 使用密钥偏移量
mode: CryptoJS.mode.CBC, // 使用 CBC 模式
padding: CryptoJS.pad.Pkcs7,
});
return CryptoJS.enc.Utf8.stringify(decrypt);
} catch (error) {
console.error('解密失败:', error.message);
return null; // 返回 null 或其他自定义的错误标识
}
},
// DES(数据加密标准)
// DES 是一种对称加密算法,使用 56 位密钥对数据进行加密和解密
// 它的密钥长度相对较短,易受到暴力破解等攻击方式的影响
// DES 加密
encryptDES(encryptData) {
const srcs = CryptoJS.enc.Utf8.parse(encryptData);
const encrypted = CryptoJS.DES.encrypt(srcs, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
},
// DES 解密
decryptDES(encryptedData) {
const decrypt = CryptoJS.DES.decrypt(encryptedData, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return CryptoJS.enc.Utf8.stringify(decrypt);
},
// Triple DES(三重数据加密标准)
// Triple DES 是对 DES 算法的改进,通过多次应用 DES 算法来增加密钥长度和安全性
// 它使用两个或三个 56 位密钥,以不同的方式对数据进行加密和解密
// 由于其较慢的处理速度,逐渐被 AES 替代。
// Triple DES 加密
encryptTripleDES(encryptData) {
const srcs = CryptoJS.enc.Utf8.parse(encryptData);
const encrypted = CryptoJS.TripleDES.encrypt(srcs, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
},
// Triple DES 解密
decryptTripleDES(encryptedData) {
const decrypt = CryptoJS.TripleDES.decrypt(encryptedData, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return CryptoJS.enc.Utf8.stringify(decrypt);
},
// Rabbit 是一种对称加密算法,它使用变长密钥和变长分组,具有较高的加密速度。
// Rabbit 算法被设计为安全且高效的加密算法,适用于多种应用场景
// Rabbit 加密
encryptRabbit(encryptData) {
const srcs = CryptoJS.enc.Utf8.parse(encryptData);
const encrypted = CryptoJS.Rabbit.encrypt(srcs, key, {
iv,
});
return encrypted.toString();
},
// Rabbit 解密
decryptRabbit(encryptedData) {
const decrypt = CryptoJS.Rabbit.decrypt(encryptedData, key, {
iv,
});
return CryptoJS.enc.Utf8.stringify(decrypt);
},
// RC4 是一种流密码算法,用于生成伪随机流,然后将其与数据进行异或运算以进行加密
// RC4 算法简单且易于实现,但由于其存在一些安全漏洞,已经不再被广泛使用
// RC4 加密
encryptRC4(encryptData) {
const encrypted = CryptoJS.RC4.encrypt(encryptData, key);
return encrypted.toString();
},
// RC4 解密
decryptRC4(encryptedData) {
const decrypted = CryptoJS.RC4.decrypt(encryptedData, key);
return decrypted.toString(CryptoJS.enc.Utf8);
},
// SHA256 哈希
hashSHA256(data) {
const hash = CryptoJS.SHA256(data);
return hash.toString();
},
};
export default crypto;
调用实现
let password = "BMW!123^^^4'0033@@@@()&&&34444\\****"
console.log(crypto.encryptAES(password))
// 加密结果:RCeW5/J/omqHZ4pi59HDI6i/T/FrAJ+BEN0R/nVLSZuQmJyUsNOAwjQWsfM4sxAm
console.log(crypto.decryptAES(crypto.encryptAES(password)))
// 解密结果:BMW!123^^^4'0033@@@@()&&&34444\****