Skip to content

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();
};

性能优化

  1. 大数据量处理
  • 使用分块处理
  • 考虑Web Workers
  • 选择合适的加密模式(CTR支持并行)
  1. 密钥管理
  • 使用PBKDF2派生密钥
  • 定期更换密钥
  • 安全存储密钥
  1. 缓存策略
  • 缓存WordArray对象
  • 重用加密配置
  • 预计算常用值

安全注意事项

  1. 密钥保护
  • 避免硬编码
  • 使用环境变量
  • 考虑密钥分发机制
  1. 加密模式选择
  • 避免使用ECB模式
  • CBC模式需要随机IV
  • 考虑添加认证(HMAC)
  1. 错误处理
  • 捕获解密异常
  • 验证数据完整性
  • 日志脱敏处理

面试重点

  1. CryptoJS的主要功能和应用场景
  2. WordArray对象的作用和使用方法
  3. 不同加密模式的优缺点
  4. 如何实现安全的前后端加密通信
  5. 大数据量加密的性能优化方案
  6. 密钥管理的最佳实践

扩展资源