答案:Web Cryptography API 可通过 generateKey 或 deriveKey 生成强密钥,推荐 AES-GCM 模式加密以保障机密性与完整性,结合 PBKDF2 派生密钥增强安全性,IV 需唯一随机,密钥应设为不可提取并避免明文存储,必要时用 wrapKey 加密保存,还可利用 ECDSA 实现签名验证,确保整体方案安全可靠。

Web Cryptography API 提供了一套底层接口,用于在浏览器中执行加密操作,无需依赖第三方库。构建一个安全的加密方案需要合理使用该API提供的功能,确保数据的机密性、完整性和密钥安全性。
生成和管理加密密钥
安全加密的第一步是使用强密钥。Web Crypto API 支持生成高强度的密钥材料,推荐使用 deriveKey 或 generateKey 方法创建密钥。
例如,使用 AES-GCM 算法生成对称密钥:
const key = await crypto.subtle.generateKey(
{ name: “AES-GCM”, length: 256 },
true, // 可提取
[“encrypt”, “decrypt”]
);
若需基于密码派生密钥(如用户口令),应使用 PBKDF2:
const encoder = new TextEncoder();
const passwordKey = await crypto.subtle.importKey(
“raw”,
encoder.encode(“user-password”),
{ name: “PBKDF2” },
false,
[“deriveKey”]
);
const derivedKey = await crypto.subtle.deriveKey(
{
name: “PBKDF2”,
salt: window.crypto.getRandomValues(new Uint8Array(16)),
iterations: 100000,
hash: “SHA-256”
},
passwordKey,
{ name: “AES-GCM”, length: 256 },
true,
[“encrypt”, “decrypt”]
);
安全地加密和解密数据
使用 AES-GCM 模式可同时实现加密和认证,防止数据被篡改。
加密示例:
必应出品基于DALL·E的AI绘图工具
45
查看详情
const iv = window.crypto.getRandomValues(new Uint8Array(12)); // 初始向量
const data = encoder.encode(“敏感数据”);
const ciphertext = await crypto.subtle.encrypt(
{ name: “AES-GCM”, iv },
derivedKey,
data
);
解密时必须使用相同的 IV 和密钥:
const decrypted = await crypto.subtle.decrypt(
{ name: “AES-GCM”, iv },
derivedKey,
ciphertext
);
const decoder = new TextDecoder();
decoder.decode(decrypted); // 输出原文
注意:IV 不需要保密,但必须唯一且不可预测,每次加密都应重新生成。
保证密钥不被泄露
密钥一旦暴露,整个加密体系即失效。因此:
- 避免将密钥以明文形式存储在 localStorage 或 JavaScript 变量中
- 尽可能设置密钥为“不可提取”(extractable: false)
- 在不需要时及时清除引用,依赖浏览器的垃圾回收机制减少内存残留风险
- 若需长期保存密钥,可使用 crypto.subtle.wrapKey 加密后存储
验证数据完整性与来源(可选:非对称加密)
对于需要身份验证的场景,可结合 RSA-OAEP 或 ECDSA 实现数字签名或密钥交换。
例如生成密钥对并签名:
const keyPair = await crypto.subtle.generateKey(
{
name: “ECDSA”,
namedCurve: “P-256”
},
true,
[“sign”, “verify”]
);
const signature = await crypto.subtle.sign(
{ name: “ECDSA”, hash: { name: “SHA-256” } },
privateKey,
encoder.encode(“消息”)
);
const isValid = await crypto.subtle.verify(
{ name: “ECDSA”, hash: { name: “SHA-256” } },
publicKey,
signature,
encoder.encode(“消息”)
);
基本上就这些。只要正确使用强算法、随机参数和密钥保护机制,Web Cryptography API 能支撑起一个可靠的安全通信基础。关键是避免常见的陷阱,比如重用 IV、弱口令或暴露密钥。
































暂无评论内容