背景与价值原生加密与签名避免将敏感数据暴露给 JS 库实现,提升安全与性能。AES-GCM 加密/解密async function importAESKey(raw: ArrayBuffer) { return crypto.subtle.importKey('raw', raw, 'AES-GCM', false, ['encrypt', 'decrypt']); } async function encryptAES(data: Uint8Array, key: CryptoKey) { const iv = crypto.getRandomValues(new Uint8Array(12)); const cipher = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, data); return { iv, cipher: new Uint8Array(cipher) }; } async function decryptAES(cipher: Uint8Array, key: CryptoKey, iv: Uint8Array) { const plain = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, cipher); return new Uint8Array(plain); } ECDSA 签名/验证(P-256)async function genECDSA() { return crypto.subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']); } async function signECDSA(privateKey: CryptoKey, data: Uint8Array) { const sig = await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, privateKey, data); return new Uint8Array(sig); } async function verifyECDSA(publicKey: CryptoKey, data: Uint8Array, sig: Uint8Array) { return crypto.subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, publicKey, sig, data); } 密钥派生与存储建议使用 `PBKDF2`/`HKDF` 进行密钥派生;避免将明文密钥写入本地存储。使用非导出 `CryptoKey` 并通过会话或硬件密钥(平台依赖)管理生命周期。指标验证(Chrome 128/Edge 130)AES-GCM 吞吐:1MB 数据加密耗时(P95) ≤ 15ms。ECDSA 签名:单次签名 ≤ 8ms;验证 ≤ 6ms。可靠性:解密失败率 ≤ 0.1%(随机 IV 与完整性校验)。回退策略不支持环境:后端加密/签名或使用成熟库(谨慎评估);数据量大时优先后端。测试清单加/解密一致性与错误处理;签名/验证正确性与边界条件。

发表评论 取消回复