关键词:Crypto-js、AES 加密、SHA256、JavaScript 加密库、Node.js Crypto 模块、浏览器端加密、PBKDF2、HMAC
尽管 Crypto-js 的开发已经停止,它依然是许多项目仍在使用的经典 JavaScript 加密库。本文将系统梳理其加密能力、典型用法,并提供平稳过渡到原生 Crypto 模块的技巧,帮助你持续提升代码安全性。
为什么选择 Crypto-js?
Crypto-js 为前端与 Node.js 提供了统一的加密算法封装,支持 AES、DES、Triple DES、RSA、SHA 系列、HMAC、PBKDF2 等 20+ 算法。它的优势体现在:
- 浏览器零配置:通过
<script>标签或模块化加载即可使用。 - 模块化引入:按需引入算法,减少 bundle 体积。
- API 简单易用:一行代码即可完成加密、解密、签名等操作。
然而,自 4.x 起维护者表示「它最终会演成一个对原生 Crypto 的薄包装」,于是选择归档。因此,理解它并学会迁移是现代开发者必备的技能。
如何安装及快速开始
环境与安装
- Node.js ≥ v12
- npm ≥ v6
npm install crypto-js --save最简示例:AES 加密与解密
import AES from 'crypto-js/aes';
import Utf8 from 'crypto-js/enc-utf8';
const plaintext = '你好,世界';
const secretKey = 'my-32-char-secret-key-1234';
// 加密
const encrypted = AES.encrypt(plaintext, secretKey).toString();
// 解密
const decrypted = AES.decrypt(encrypted, secretKey).toString(Utf8);
console.log(decrypted); // 你好,世界👉 现在就来体验原生 AES 的高效实现,提交公开代码即可领取性能提升技巧。
模块化用法:只引入需要的算法
在实际场景中,我们通常只使用到部分加密方法,Crypto-js 的模块化设计能显著减小打包体积。
浏览器端(RequireJS)
require.config({ packages: [{ name: 'crypto-js', location: 'path-to/crypto-js', main: 'index' }] }); require(['crypto-js/sha256', 'crypto-js/hmac-sha512'], (SHA256, HmacSHA512) => { console.log(SHA256('hello').toString()); });Node.js(CommonJS)
const SHA256 = require('crypto-js/sha256'); console.log(SHA256('hello').toString());
核心算法速查表
| 类别 | 示例函数 | 典型场景 |
| 散列 | SHA256, SHA3, RIPEMD160 | 数据指纹、区块链地址 |
| HMAC | HmacSHA256, HmacMD5 | API 签名 |
| 对称加密 | AES, TripleDES | 本地存储加密 |
| 密码推导 | PBKDF2 | 保存用户密码 |
| 编码 | Base64, Hex | 格式转换 |
实际案例:Web API 签名
场景:向交易所发送 GET 请求并附加签名。
import sha256 from 'crypto-js/sha256';
import hmacSHA512 from 'crypto-js/hmac-sha512';
import Base64 from 'crypto-js/enc-base64';
const message = 'amount=100&pair=BTC_USDT';
const nonce = Date.now();
const path = '/api/v1/order';
const secret = 'YOUR_SECRET_KEY';
const hashDigest = sha256(nonce + message).toString();
const hmacDigest = Base64.stringify(
hmacSHA512(path + hashDigest, secret)
);
// 最终在 HTTP 头添加:
// 'api-signature': hmacDigest从 Crypto-js 平滑迁移到 Node.js 原生 Crypto
| Crypto-js 写法 | 原生替代 | 注意点 |
|---|---|---|
SHA256(msg) | crypto.createHash('sha256').update(msg).digest('hex') | Node.js ≥ v10 |
HmacSHA256(msg, key) | crypto.createHmac('sha256', key).update(msg).digest() | key为Buffer或string |
AES.encrypt(plain, pwd) | crypto.createCipher('aes-256-cbc', pwd) | Node.js 默认sha1 KDF,更安全方式用crypto.createCipheriv |
PBKDF2(pwd, salt) | crypto.pbkdf2Sync(pwd, salt, iters, keylen, 'sha512') | 迭代次数≥10 000 |
迁移小贴士:
- 若项目历史包袱较重,可先用「门面模式」封装一层 Crypto,将底层实现从 Crypto-js 透明替换为原生 Crypto。
- 对新项目直接拥抱 Node.js
crypto.subtle或 Web Crypto API,以便利用操作系统级加速与持续的 CVE 补丁。
FAQ:常见问题与解答
1. Crypto-js 还值得学习吗?
依旧值得。大量老项目仍在使用,掌握其 API 有助于 maintenance。同时熟悉过渡方案后再迁移,可减少回滚风险。
2. 旧版 IE 无法使用需放弃 Crypto-js 吗?
4.x 起依赖原生 Crypto 模块,IE 10 及以下将报错。若必须支持旧浏览器,可锁定 3.1.x,但请注意 Math.random() 存在安全性问题。
3. 随机数安全性如何保证?
从 4.0.0 开始,Crypto-js 调用原生 crypto.getRandomValues()。切换到原生后请始终使用 crypto.randomBytes()/crypto.getRandomValues() 替代任何自行实现的随机算法。
4. 如何验证迁移前后输出一致?
利用单元测试框架(如 Jest)写 diff test,将相同输入的 Crypto-js 输出与原生 Crypto 输出 hex 比较,确保业务逻辑不被破坏。
5. 浏览器支持的情况如何?
现代浏览器全部兼容 Web Crypto API,覆盖 95% 以上用户。剩下的小部分老旧环境建议通过升级浏览器或提示风险等方式下线支援。
6. 有现成脚本批量替换 Crypto-js 吗?
暂无官方脚本,但可自写 AST 代码转换工具,识别 require('crypto-js/*') 模式并自动生成替换代码,极大节约人力。
以后该怎么做?
长期来看,直接使用原生加密模块或 Web Crypto API 是更安全且性能更好的路径。
👉 立即查看如何用 20 行代码完成 AES-GCM 加密,速通现代浏览器安全方案。
结语
Crypto-js 曾是 JavaScript 加密界的启蒙之作,见证了浏览器端密码学从 “玩具” 到 “工业级” 的飞跃;如今功成身退,把接力棒交给原生的 Crypto 模块。理解它的来路与去路,才能在技术演变中始终站稳脚跟。祝你在新旧交替中稳步前行。