本文档涵盖了Deno对Web Cryptography API规范的实现,该规范通过 crypto.subtle 接口和相关API提供加密功能。这包括对称和非对称加密、数字签名、密钥派生以及加密哈希操作。
有关更广泛的Web标准支持架构的信息,请参阅 Web Standards Support。有关可能使用这些加密原语的网络层细节,请参阅 Networking。
Deno的Web Crypto实现遵循一个两层架构:一个JavaScript API层实现标准的Web Cryptography API,以及一个Rust操作层执行实际的加密计算。
来源: ext/crypto/00_crypto.js1-100 ext/crypto/lib.rs84-133
JavaScript层通过暴露给全局 crypto 对象的几个关键类和接口来实现标准的Web Cryptography API。
SubtleCrypto 类作为加密操作的主要接口
CryptoKey 类表示加密密钥,具有以下属性
| 属性 | 描述 |
|---|---|
类型 | 密钥类型: "public", "private", 或 "secret" |
extractable | 密钥是否可导出 |
algorithm | 与密钥一起使用的算法参数 |
usages | 允许的密钥操作数组 |
来源: ext/crypto/00_crypto.js350-410 ext/crypto/00_crypto.js509-1328
JavaScript层在将算法参数传递给Rust操作之前,会执行算法归一化以验证和标准化参数。
supportedAlgorithms 映射定义了每种操作类型(digest, generateKey, sign, verify等)支持的算法。
来源: ext/crypto/00_crypto.js125-212 ext/crypto/00_crypto.js239-310
Rust层通过一系列 op_crypto_* 函数来实现实际的加密操作,这些函数通过Deno的op系统从JavaScript调用。
Rust层通过 CryptoError 枚举定义了一个全面的错误层级,该枚举会映射到相应的JavaScript异常类型。
| 错误类型 | JavaScript 异常 |
|---|---|
ArrayBufferViewLengthExceeded | QuotaExceededError |
EncryptionError / DecryptionError | OperationError |
HKDFLengthTooLarge | OperationError |
| 类型错误 | TypeError |
| 通用错误 | 错误 |
Deno的Web Crypto实现支持跨不同类别的全面加密算法集
| 算法 | 密钥大小 | 操作 | 实现 |
|---|---|---|---|
| AES-CTR | 128, 192, 256 位 | 加密, 解密 | aes + ctr crate |
| AES-CBC | 128, 192, 256 位 | 加密, 解密 | aes + cbc crate |
| AES-GCM | 128, 192, 256 位 | 加密, 解密 | aes-gcm crate |
| AES-KW | 128, 192, 256 位 | wrapKey, unwrapKey | aes-kw crate |
| 算法 | 关键类型 | 操作 | 实现 |
|---|---|---|---|
| RSASSA-PKCS1-v1_5 | RSA | 签名, 验证 | rsa crate |
| RSA-PSS | RSA | 签名, 验证 | rsa crate |
| RSA-OAEP | RSA | 加密, 解密 | rsa crate |
| ECDSA | P-256, P-384 | 签名, 验证 | p256, p384 crates |
| ECDH | P-256, P-384 | deriveBits | p256, p384 crates |
| 算法 | 操作 | 实现 |
|---|---|---|
| Ed25519 | 签名, 验证 | ring crate |
| X25519 | deriveBits | x25519-dalek crate |
| X448 | deriveBits | x448 crate |
| 算法 | 操作 | 实现 |
|---|---|---|
| SHA-1, SHA-256, SHA-384, SHA-512 | digest | ring crate |
| HMAC | 签名, 验证 | ring crate |
| PBKDF2 | deriveBits | ring crate |
| HKDF | deriveBits | ring crate |
来源: ext/crypto/00_crypto.js125-212 ext/crypto/lib.rs1-52
Web Crypto实现支持多种密钥格式,并提供全面的密钥导入/导出功能。
来源: ext/crypto/import_key.rs160-177 ext/crypto/export_key.rs112-130
该图显示了典型加密操作(如加密)的数据流
来源: ext/crypto/00_crypto.js548-583 ext/crypto/encrypt.rs103-131
Web Crypto API通过多个接口提供安全的随机数生成
| 功能 | 目的 | 实现 |
|---|---|---|
crypto.getRandomValues() | 用随机值填充类型化数组 | op_crypto_get_random_values |
crypto.randomUUID() | 生成RFC 4122 UUID | op_crypto_random_uuid |
这两个函数都使用系统的安全随机数生成器(OsRng)或种子PRNG进行确定性测试。
来源: ext/crypto/lib.rs239-257 ext/crypto/lib.rs734-752
crypto 扩展提供了Base64URL编码/解码操作,主要用于JWK(JSON Web Key)格式支持
op_crypto_base64url_encode - 将二进制数据编码为Base64URL字符串op_crypto_base64url_decode - 将Base64URL字符串解码为二进制数据这些操作使用URL安全的Base64编码,没有填充,如RFC 4648所述。