Skip to content

参考

基于 MDN Web Crypto 官方文档 + W3C Web Cryptography API Level 2 + OWASP Cryptographic/Password Storage Cheat Sheet + RFC 5280 编写

速查

  • 加密四类:对称(AES-GCM) / 非对称(RSA-OAEP / ECC) / 哈希(SHA-2) / 密码哈希(Argon2id / bcrypt / scrypt / PBKDF2)
  • AES-GCM IV:96 位(12 字节)CSPRNG 随机、每次不重用tagLength 128
  • RSA:≥ 3072 位(2048 仅遗留),加密用 RSA-OAEP(SHA-256) 禁用 PKCS1-v1.5
  • ECC:Curve25519 / P-256,签名优先 Ed25519
  • 密码哈希:Argon2id(m=19456,t=2,p=1)> scrypt > bcrypt > PBKDF2-HMAC-SHA256(600000 次)
  • Web Crypto API:window.crypto.subtle仅 HTTPS / localhost
  • SubtleCrypto 方法:encrypt / decrypt / digest / sign / verify / generateKey / deriveKey / deriveBits / importKey / exportKey / wrapKey / unwrapKey
  • 密钥管理:HSM / KMS / Vault + DEK/KEK 分离 + 前端不持机密
  • crypto-js v4.2.0 Discontinued,迁 node:crypto 或 Web Crypto
  • PKI:X.509 v3 = Root CA → Intermediate CA → Leaf;逐层验签 + 有效期 + SAN + 吊销
  • 完整说明见 入门 / 核心算法与实践

加密算法对比表

对称加密

算法 / 模式密钥长度用途Web Crypto备注
AES-GCM128 / 192 / 256大数据加密首选支持AEAD(加密+认证),IV 96 位
AES-CBC同上仅加密支持不认证,需 Encrypt-then-MAC
AES-CTR同上仅加密支持流模式,需配 MAC
AES-ECB同上禁用不支持泄露明文模式(ECB 企鹅图)
ChaCha20-Poly1305256TLS 1.3 备选不支持移动端无 AES-NI 时优

非对称加密与签名

算法密钥 / 参数用途Web Crypto备注
RSA-OAEP≥ 3072 位加密 / 解密支持禁用 PKCS1-v1.5
RSASSA-PKCS1-v1_5≥ 3072 位签名支持JWT RS256
RSA-PSS≥ 3072 位签名(更安全)支持概率性签名
ECDSAP-256 / P-384签名支持现代 RSA 替代
Ed25519256 位签名(确定性)支持(Node 18+ / 现代浏览器)优先
ECDH / X25519P-256 / Curve25519密钥协商支持TLS 1.3 主力
RSAES-PKCS1-v1.5禁用不支持Bleichenbacher 攻击

哈希与密码哈希

算法输出长度用途Web Crypto备注
SHA-256256 位通用哈希支持SHA-2 系首选
SHA-384 / SHA-512384 / 512长寿命哈希支持SHA-2 系
SHA-1160 位禁用支持碰撞攻击已实战
MD5128 位禁用不支持已破
SHA-3224/256/384/512备选不支持Keccak
BLAKE2 / BLAKE3可变现代高性能不支持
Argon2id密码哈希首选不支持(需 WASM)m=19456,t=2,p=1
scrypt密码哈希不支持(需 WASM)N=2^17,r=8,p=1
bcrypt密码哈希不支持(需 WASM)work ≥ 10
PBKDF2-HMAC-SHA256兜底密码哈希支持600000 次迭代
HMAC-SHA256MAC(完整性+真实性)支持API 签名、CSRF、JWT HS256

Web Crypto API 完整方法表

方法参数返回说明
encrypt(algo, key, data)algo、CryptoKey、ArrayBufferPromise<ArrayBuffer>AES-CBC / GCM / CTR、RSA-OAEP
decrypt(algo, key, data)同上Promise<ArrayBuffer>解密;GCM 自动验 tag
digest(algo, data)algo、ArrayBufferPromise<ArrayBuffer>SHA-1 / 256 / 384 / 512
sign(algo, key, data)algo、CryptoKey、ArrayBufferPromise<ArrayBuffer>ECDSA、Ed25519、HMAC、RSA-PSS
verify(algo, key, sig, data)algo、key、签名、数据Promise<boolean>验签
generateKey(algo, extractable, keyUsages)算法对象、布尔、用途数组Promise<CryptoKey | CryptoKeyPair>AES、RSA、ECDSA
deriveKey(algo, baseKey, derivedKeyAlgo, extractable, usages)Promise<CryptoKey>PBKDF2、HKDF、ECDH、X25519
deriveBits(algo, baseKey, length)Promise<ArrayBuffer>派生比特串
importKey(format, keyData, algo, extractable, usages)格式、密钥数据、算法Promise<CryptoKey>raw / pkcs8 / spki / jwk
exportKey(format, key)格式、CryptoKeyPromise<ArrayBuffer>导出(extractable=true)
wrapKey(format, key, wrappingKey, algo)Promise<ArrayBuffer>包装密钥(AES-KW / RSA-OAEP)
unwrapKey(format, wrapped, unwrappingKey, ...)Promise<CryptoKey>解包
getRandomValues(array)TypedArrayTypedArray(同步)CSPRNG;非 subtle 接口

没有 getKeyLength 方法——AES 默认 256 位需在算法对象里显式 length: 256

算法参数对象

AES-GCM

ts
{
  name: "AES-GCM",
  iv: ArrayBuffer | TypedArray,  // 96 位 / 12 字节,CSPRNG 随机
  additionalData?: ArrayBuffer | TypedArray,  // AAD
  tagLength?: 32 | 64 | 96 | 104 | 112 | 120 | 128,  // 默认 128
}

RSA-OAEP

ts
{
  name: "RSA-OAEP",
  label?: ArrayBuffer | TypedArray,  // 可选 AAD
}
// hash 在 generateKey / importKey 时指定:"SHA-256"

PBKDF2

ts
{
  name: "PBKDF2",
  salt: ArrayBuffer | TypedArray,
  iterations: 600000,  // OWASP 推荐
  hash: "SHA-256",
}

ECDSA

ts
{
  name: "ECDSA",
  hash: "SHA-256",
}
// 密钥生成时 namedCurve: "P-256" | "P-384" | "P-521"

HMAC

ts
{
  name: "HMAC",
  hash: "SHA-256" | "SHA-384" | "SHA-512",
  length?: number,  // 密钥位数
}

SubtleCrypto 算法矩阵

操作支持算法不支持(重要)
encrypt / decryptAES-CBC、AES-GCM、AES-CTR、RSA-OAEPAES-ECB、ChaCha20、RSAES-PKCS1-v1.5
digestSHA-1、SHA-256、SHA-384、SHA-512MD5、SHA-3、BLAKE2/3
sign / verifyRSASSA-PKCS1-v1_5、RSA-PSS、ECDSA、Ed25519、HMACEd448、RSA-PSS-MAVF1
deriveKey / deriveBitsPBKDF2、HKDF、ECDH、X25519scrypt、argon2、bcrypt
generateKeyAES-*、RSA-OAEP、RSASSA-PKCS1-v1_5、RSA-PSS、ECDSA、Ed25519、X25519、HMACDES、3DES、RSAES-PKCS1-v1.5
importKey / exportKeyraw、pkcs8、spki、jwk
wrapKey / unwrapKeyAES-KW、AES-GCM、RSA-OAEPAES-CBC(理论支持但少用)

密钥长度安全等级对比

对称RSAECC等价强度
801024160已弱
1122048224遗留
1283072256现代
1927680384长寿命
25615360512军用

ECC 256 位 ≈ RSA 3072 位 ≈ 对称 128 位——这就是为何 ECC 现代首选。

RSA-OAEP 最大明文长度

公式:max_len = (modulusLength / 8) - 2 * (hashLength / 8) - 2

RSA 密钥SHA-256SHA-384SHA-512
2048 位190 B158 B126 B
3072 位318 B286 B254 B
4096 位446 B414 B382 B

大数据必须用混合加密(AES + RSA 包裹 AES 密钥)。

密码哈希参数推荐(OWASP)

算法参数备注
Argon2idm=19456 (19 MB), t=2, p=1OWASP Cheat Sheet 最低配置
scryptN=2^17, r=8, p=1内存 16 MB
bcryptwork=10+ (2^10)适应硬件演进应逐年提升
PBKDF2-HMAC-SHA256iterations=600000Web Crypto 兜底方案
PBKDF2-HMAC-SHA1iterations=1300000仅遗留兼容

pepper(HMAC 后哈希)做纵深防御,pepper 与 hash 分库存。

X.509 v3 证书结构

字段含义
Versionv3(现代标准)
Serial NumberCA 颁发的唯一序列号
Signature Algorithm签名算法(如 ecdsa-with-SHA256)
Issuer签发者 DN(上级 CA)
ValiditynotBefore / notAfter
Subject持有者 DN(现代常为空,看 SAN)
Subject Public Key Info公钥 + 算法标识
Extensions关键:SAN(critical)
SignatureIssuer 用其私钥对本证书的签名

SAN 类型

类型含义
dNSName域名(如 example.com*.example.com
iPAddressIP 地址(v4 / v6)
rfc822Name邮箱
uniformResourceIdentifierURI
directoryNameDN

现代证书主体名常为空,SAN 标记为 critical——浏览器只看 SAN 不看 CN。

浏览器 / 运行时支持

运行时Web CryptoEd25519 / X25519
Chrome / Edge稳定支持
Firefox稳定支持
Safari稳定支持(macOS 14+)
Node 18+crypto.webcrypto.subtle支持
Deno / Bun全局 crypto.subtle支持

全部主流浏览器与运行时稳定支持 Web Crypto API 多年,是当前前端加密的官方推荐方案。

官方资源