CryptoJS使用笔记
基本介绍
CryptoJS是一个JavaScript加密库,提供了多种加密算法的标准实现:
- 哈希函数: MD5、SHA-1、SHA-256等
- 对称加密: AES、DES、3DES等
- 编码转换: Base64、UTF-8等
- 其他功能: HMAC、PBKDF2等
常用API
1. 哈希运算
javascript
// MD5
const hash = CryptoJS.MD5('message').toString();
// SHA-256
const hash = CryptoJS.SHA256('message').toString();
// 带盐值的哈希
const salt = CryptoJS.lib.WordArray.random(128/8);
const key = CryptoJS.PBKDF2('password', salt, {
keySize: 256/32,
iterations: 1000
});
2. AES加密
javascript
// 加密
const ciphertext = CryptoJS.AES.encrypt('message', 'secret key').toString();
// 解密
const bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key');
const plaintext = bytes.toString(CryptoJS.enc.Utf8);
// 使用配置选项
const encrypted = CryptoJS.AES.encrypt('message', key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: iv
});
3. 编码转换
javascript
// Base64编码
const wordArray = CryptoJS.enc.Utf8.parse('Hello World');
const base64 = CryptoJS.enc.Base64.stringify(wordArray);
// Base64解码
const parsedWordArray = CryptoJS.enc.Base64.parse(base64);
const parsedStr = parsedWordArray.toString(CryptoJS.enc.Utf8);
核心概念
1. WordArray对象
- CryptoJS的基本数据类型
- 用于表示字节数组
- 可以和各种编码格式互转
javascript
// 创建WordArray
const wordArray = CryptoJS.lib.WordArray.random(16);
// 转换为十六进制
const hexString = wordArray.toString();
// 转换为Base64
const base64String = wordArray.toString(CryptoJS.enc.Base64);
2. 加密模式
- ECB: 最简单但安全性较低
- CBC: 需要IV,安全性较高
- CFB: 适合流数据加密
- OFB: 可预处理IV
- CTR: 支持并行处理
3. 填充方式
- Pkcs7: 最常用的填充方式
- ZeroPadding: 使用0填充
- NoPadding: 不进行填充
- ISO10126: 随机填充
实际应用示例
1. 前后端数据加密传输
javascript
// 前端加密
const encrypt = (data, key) => {
const iv = CryptoJS.lib.WordArray.random(16);
const encrypted = CryptoJS.AES.encrypt(
JSON.stringify(data),
key,
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return {
ciphertext: encrypted.toString(),
iv: iv.toString()
};
};
// 后端解密(伪代码)
const decrypt = (ciphertext, iv, key) => {
const decrypted = CryptoJS.AES.decrypt(
ciphertext,
key,
{
iv: CryptoJS.enc.Hex.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8));
};
2. 密码加密存储
javascript
const hashPassword = (password, salt) => {
return CryptoJS.PBKDF2(password, salt, {
keySize: 256/32,
iterations: 10000
}).toString();
};
性能优化
- 大数据量处理
- 使用分块处理
- 考虑Web Workers
- 选择合适的加密模式(CTR支持并行)
- 密钥管理
- 使用PBKDF2派生密钥
- 定期更换密钥
- 安全存储密钥
- 缓存策略
- 缓存WordArray对象
- 重用加密配置
- 预计算常用值
安全注意事项
- 密钥保护
- 避免硬编码
- 使用环境变量
- 考虑密钥分发机制
- 加密模式选择
- 避免使用ECB模式
- CBC模式需要随机IV
- 考虑添加认证(HMAC)
- 错误处理
- 捕获解密异常
- 验证数据完整性
- 日志脱敏处理
面试重点
- CryptoJS的主要功能和应用场景
- WordArray对象的作用和使用方法
- 不同加密模式的优缺点
- 如何实现安全的前后端加密通信
- 大数据量加密的性能优化方案
- 密钥管理的最佳实践