CryptoJS库在JavaScript中的加密应用详解
CryptoJs是一个功能强大的JavaScript加密标准库,提供了丰富的加密算法和工具,帮助开发者保护敏感信息。本文将系统梳理其核心功能、常用算法实现及关键注意事项。
核心功能概览
CryptoJs支持多种加密算法和哈希函数,涵盖以下核心能力:
| 类型 | 具体算法 |
|---|---|
| 对称加密算法 | AES、DES、RC4 |
| 哈希算法 | MD5、SHA系列(SHA-1、SHA-256、SHA-512等)、RIPEMD-160 |
| HMAC | 基于哈希的消息认证码 |
| 编码转换 | Base64、UTF-8、Hex |
| 密钥派生函数 | PBKDF2、EvpKDF |
常用加密算法实现
AES加密解密
const CryptoJS = require("crypto-js");
// 密钥和IV(初始向量)
const KEY = CryptoJS.enc.Utf8.parse("1234567890000000"); // 16位密钥
const IV = CryptoJS.enc.Utf8.parse("1234567890000000"); // 16位IV
// 加密
function encryptAES(message) {
const srcs = CryptoJS.enc.Utf8.parse(message);
const encrypted = CryptoJS.AES.encrypt(srcs, KEY, {
iv: IV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString(); // 返回Base64格式的密文
}
// 解密
function decryptAES(encryptedBase64) {
const decrypted = CryptoJS.AES.decrypt(encryptedBase64, KEY, {
iv: IV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
// 使用示例
const originalText = "Hello, World!";
const encryptedText = encryptAES(originalText);
const decryptedText = decryptAES(encryptedText);
console.log("Original:", originalText);
console.log("Encrypted:", encryptedText);
console.log("Decrypted:", decryptedText);
SHA-256哈希
const CryptoJS = require("crypto-js");
function sha256Hash(message) {
return CryptoJS.SHA256(message).toString();
}
// 使用示例
const hashResult = sha256Hash("Hello, World!");
console.log("SHA-256 Hash:", hashResult);
HMAC
const CryptoJS = require("crypto-js");
function hmacSHA256(message, secret) {
return CryptoJS.HmacSHA256(message, secret).toString();
}
// 使用示例
const secretKey = "mySecretKey";
const hmacResult = hmacSHA256("Hello, World!", secretKey);
console.log("HMAC-SHA256:", hmacResult);
关键注意事项
密钥和IV管理
- 密钥和IV应妥善保管,避免硬编码在代码中
- 建议使用环境变量或密钥管理系统来存储和管理密钥
加密模式选择
- AES支持多种加密模式(如CBC、ECB等),CBC模式相比ECB更安全,因为它使用了IV来增加加密的随机性
数据编码
- 在加密前,确保数据已正确编码(如UTF-8)
- 解密后,需要将结果从加密库的特定格式(如WordArray)转换为可读字符串
错误处理
- 在实际应用中,应添加适当的错误处理逻辑,以应对密钥不匹配、数据格式错误等情况
高级功能实现
PBKDF2密钥派生
const CryptoJS = require("crypto-js");
function deriveKey(password, salt, iterations, keySize) {
return CryptoJS.PBKDF2(password, salt, {
keySize: keySize / 32, // 转换为字(word)数
iterations: iterations
}).toString();
}
// 使用示例
const password = "myPassword";
const salt = CryptoJS.lib.WordArray.random(128 / 8); // 随机盐值
const iterations = 1000;
const keySize = 256; // 位
const derivedKey = deriveKey(password, salt, iterations, keySize);
console.log("Derived Key:", derivedKey);
Base64编码解码
const CryptoJS = require("crypto-js");
// Base64编码
function encodeBase64(message) {
const wordArray = CryptoJS.enc.Utf8.parse(message);
return CryptoJS.enc.Base64.stringify(wordArray);
}
// Base64解码
function decodeBase64(base64String) {
const wordArray = CryptoJS.enc.Base64.parse(base64String);
return wordArray.toString(CryptoJS.enc.Utf8);
}
// 使用示例
const encoded = encodeBase64("Hello, World!");
const decoded = decodeBase64(encoded);
console.log("Base64 Encoded:", encoded);
console.log("Base64 Decoded:", decoded);
https://comate.baidu.com/zh/page/jc53v42dul8
浙公网安备 33010602011771号