2026-07-23 03:35:35
在 JavaScript 中实现数据的加密、解密和哈希运算,推荐优先使用浏览器原生支持的 Web Crypto API(安全高效),若需兼容旧环境可选用第三方库 CryptoJS。以下是具体实现方法及注意事项:
一、使用 Web Crypto API(现代浏览器推荐)Web Crypto API 是浏览器内置的加密接口,支持对称加密(AES)、非对称加密(RSA)、哈希(SHA)等操作,无需引入额外库。
1. 数据加密与解密(AES-GCM 对称加密)AES-GCM 是安全的对称加密算法,适合加密本地数据或传输内容。
// 生成 AES-GCM 密钥(256位)async function generateKey() { return await crypto.subtle.generateKey( { name: "AES-GCM", length: 256 }, true, // 是否可导出 ["encrypt", "decrypt"] );}// 加密数据async function encryptData(data, key) { const encoder = new TextEncoder(); const encodedData = encoder.encode(data); const iv = crypto.getRandomValues(new Uint8Array(12)); // 初始化向量(IV) const encrypted = await crypto.subtle.encrypt( { name: "AES-GCM", iv }, key, encodedData ); return { encrypted, iv }; // 返回加密数据和IV(解密需用)}// 解密数据async function decryptData(encryptedData, key, iv) { const decrypted = await crypto.subtle.decrypt( { name: "AES-GCM", iv }, key, encryptedData ); const decoder = new TextDecoder(); return decoder.decode(decrypted);}// 使用示例(async () => { const key = await generateKey(); const { encrypted, iv } = await encryptData("Hello, 世界!", key); const result = await decryptData(encrypted, key, iv); console.log(result); // 输出: Hello, 世界!})();2. 哈希运算(SHA-256)哈希用于生成数据的唯一指纹(不可逆),常用于密码存储或数据校验。
async function hashData(data) { const encoder = new TextEncoder(); const encodedData = encoder.encode(data); const hashBuffer = await crypto.subtle.digest("SHA-256", encodedData); // 转为十六进制字符串 const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); return hashHex;}// 使用示例hashData("hello").then(console.log); // 输出: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824二、使用 CryptoJS 库(兼容旧环境)若需支持不完整 Web Crypto API 的环境(如旧浏览器),可通过 CDN 或 npm 引入 CryptoJS。
1. AES 加解密// 引入 CryptoJS(通过CDN或npm)const message = "Hello, 世界!";const secretKey = "my-secret-key"; // 实际开发中应从安全渠道获取// 加密const encrypted = CryptoJS.AES.encrypt(message, secretKey).toString();// 解密const bytes = CryptoJS.AES.decrypt(encrypted, secretKey);const decrypted = bytes.toString(CryptoJS.enc.Utf8);console.log(decrypted); // 输出: Hello, 世界!2. MD5 和 SHA 哈希console.log(CryptoJS.MD5("hello").toString()); // MD5哈希console.log(CryptoJS.SHA256("hello").toString()); // SHA-256哈希三、注意事项密钥管理
避免硬编码密钥,应通过用户输入、后端协商或密钥管理系统获取。
对称加密密钥需安全存储,非对称加密需保护私钥。
初始化向量(IV)
AES-GCM 必须使用随机 IV,且每次加密需不同 IV(通常随密文一起存储)。
数据编码
Web Crypto API 操作的是 ArrayBuffer,需通过 TextEncoder/TextDecoder 转换字符串。
安全性限制
前端加密不能替代 HTTPS,仅作为辅助安全措施(如防止明文存储)。
哈希运算需配合盐值(salt)防止彩虹表攻击。
性能与兼容性
Web Crypto API 性能优于 JavaScript 实现的库(如 CryptoJS)。
现代项目优先使用 Web Crypto API,简单场景可用 CryptoJS 快速实现。