MDN Web Crypto API 技术详解:现代Web应用的安全基石
2025-07-07 02:39:32作者:何将鹤
什么是Web Crypto API?
Web Crypto API是现代浏览器提供的一套JavaScript接口,它允许开发者在Web应用中使用基础的加密功能。这套API为开发者提供了密码学原语,可以用来构建各种需要加密功能的系统。
核心概念
1. 接口架构
Web Crypto API主要由三个核心接口组成:
-
Crypto接口:提供基础加密功能,包括:
- 密码学安全的随机数生成器
- 通过subtle属性访问SubtleCrypto对象
-
SubtleCrypto接口:提供底层加密操作,包括:
- 密钥生成
- 加密/解密
- 数字签名
- 密钥派生
- 密钥包装/解包
-
CryptoKey接口:表示加密密钥,可通过以下方式获得:
- generateKey()生成新密钥
- deriveKey()派生密钥
- importKey()导入现有密钥
- unwrapKey()解包密钥
2. 算法支持
Web Crypto API支持多种加密算法,主要分为以下几类:
对称加密算法
- AES-CBC (AES分组密码的CBC模式)
- AES-CTR (AES计数器模式)
- AES-GCM (AES伽罗瓦/计数器模式)
- AES-KW (AES密钥包装算法)
非对称加密算法
- RSA (包括RSASSA-PKCS1-v1_5、RSA-PSS和RSA-OAEP)
- ECDSA (椭圆曲线数字签名算法)
- ECDH (椭圆曲线Diffie-Hellman密钥交换)
哈希和消息认证
- HMAC (基于哈希的消息认证码)
- SHA家族哈希函数 (SHA-1、SHA-256、SHA-384、SHA-512)
密钥派生函数
- PBKDF2 (基于密码的密钥派生函数2)
- HKDF (HMAC-based Extract-and-Expand Key Derivation Function)
使用注意事项
-
安全警告:
- Web Crypto API提供的是底层加密原语,非常容易被误用
- 密钥管理和整体安全系统设计极其复杂,通常需要安全专家参与
- 设计和实现中的错误可能导致整个安全系统失效
-
最佳实践:
- 学习和实验是可以的,但在未经安全专家审查前,不要声称或暗示你的系统是安全的
- 考虑使用经过验证的高级加密库,而不是直接使用这些底层API
- 始终使用最新的加密标准和算法
实际应用示例
生成随机数
const array = new Uint8Array(10);
window.crypto.getRandomValues(array);
console.log(array); // 输出10个密码学安全的随机字节
使用AES-GCM加密数据
async function encryptData(plaintext) {
const key = await window.crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
const iv = window.crypto.getRandomValues(new Uint8Array(12));
const ciphertext = await window.crypto.subtle.encrypt(
{ name: "AES-GCM", iv },
key,
plaintext
);
return { key, iv, ciphertext };
}
浏览器兼容性
Web Crypto API在现代浏览器中得到广泛支持,包括:
- Chrome 37+
- Firefox 34+
- Safari 11+
- Edge 12+
- Opera 24+
总结
Web Crypto API为Web应用提供了强大的加密功能,使开发者能够在客户端实现各种安全功能,如数据加密、数字签名和安全通信等。然而,正确使用这些API需要深入理解密码学原理和安全最佳实践。对于大多数应用场景,建议考虑使用构建在这些底层API之上的高级安全库,除非你有特殊需求或具备足够的安全专业知识。