JavaScript中的Web Cryptography API与数据加密
字数 594 2025-11-25 04:31:29
JavaScript中的Web Cryptography API与数据加密
描述
Web Cryptography API为浏览器提供了标准的密码学操作接口,支持哈希生成、数字签名、加密解密等安全功能。它通过window.crypto.subtle提供,所有操作均异步执行且返回Promise,专为保护Web应用中的敏感数据而设计。
知识讲解
-
API基础结构
- 通过
crypto.subtle访问,仅限HTTPS环境或localhost使用 - 支持算法包括:AES(加密)、RSA(非对称加密)、SHA(哈希)、HMAC(消息认证)
- 密钥分为对称密钥(单密钥)和非对称密钥(公钥/私钥对)
- 通过
-
核心操作流程
- 生成密钥:使用
generateKey()生成CryptoKey对象 - 加密/解密:对称加密用AES,非对称加密用RSA-OAEP
- 哈希计算:通过SHA系列算法生成数据指纹
- 签名/验证:用私钥签名,公钥验证完整性
- 生成密钥:使用
实战演示:AES-GCM加密
- 生成密钥
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256, // 密钥长度
},
true, // 是否可导出
["encrypt", "decrypt"] // 密钥用途
);
- 加密数据
const encoder = new TextEncoder();
const data = encoder.encode("秘密消息");
const iv = crypto.getRandomValues(new Uint8Array(12)); // 初始化向量
const encrypted = await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv,
},
key,
data
);
- 解密数据
const decrypted = await crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: iv, // 必须使用加密时的IV
},
key,
encrypted
);
const decoder = new TextDecoder();
console.log(decoder.decode(decrypted)); // "秘密消息"
关键要点
- IV重要性:每次加密需唯一IV,防止重复攻击
- 密钥管理:敏感密钥应存储在安全后端
- 错误处理:解密失败会抛出异常,需try-catch包装
- 性能考量:大数据建议分块处理,避免阻塞主线程
应用场景
- 端到端加密聊天应用
- 客户端密码哈希处理
- JWT令牌的签名验证
- 本地敏感数据加密存储