菜单

Web 加密

相关源文件

本文档涵盖了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 API 层

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 操作层

Rust层通过一系列 op_crypto_* 函数来实现实际的加密操作,这些函数通过Deno的op系统从JavaScript调用。

关键操作

来源: ext/crypto/lib.rs86-123

错误处理

Rust层通过 CryptoError 枚举定义了一个全面的错误层级,该枚举会映射到相应的JavaScript异常类型。

错误类型JavaScript 异常
ArrayBufferViewLengthExceededQuotaExceededError
EncryptionError / DecryptionErrorOperationError
HKDFLengthTooLargeOperationError
类型错误TypeError
通用错误错误

来源: ext/crypto/lib.rs135-221

支持的算法

Deno的Web Crypto实现支持跨不同类别的全面加密算法集

对称算法

算法密钥大小操作实现
AES-CTR128, 192, 256 位加密, 解密aes + ctr crate
AES-CBC128, 192, 256 位加密, 解密aes + cbc crate
AES-GCM128, 192, 256 位加密, 解密aes-gcm crate
AES-KW128, 192, 256 位wrapKey, unwrapKeyaes-kw crate

非对称算法

算法关键类型操作实现
RSASSA-PKCS1-v1_5RSA签名, 验证rsa crate
RSA-PSSRSA签名, 验证rsa crate
RSA-OAEPRSA加密, 解密rsa crate
ECDSAP-256, P-384签名, 验证p256, p384 crates
ECDHP-256, P-384deriveBitsp256, p384 crates

现代曲线

算法操作实现
Ed25519签名, 验证ring crate
X25519deriveBitsx25519-dalek crate
X448deriveBitsx448 crate

哈希和密钥派生

算法操作实现
SHA-1, SHA-256, SHA-384, SHA-512digestring crate
HMAC签名, 验证ring crate
PBKDF2deriveBitsring crate
HKDFderiveBitsring 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 UUIDop_crypto_random_uuid

这两个函数都使用系统的安全随机数生成器(OsRng)或种子PRNG进行确定性测试。

来源: ext/crypto/lib.rs239-257 ext/crypto/lib.rs734-752

Base64URL 编码

crypto 扩展提供了Base64URL编码/解码操作,主要用于JWK(JSON Web Key)格式支持

  • op_crypto_base64url_encode - 将二进制数据编码为Base64URL字符串
  • op_crypto_base64url_decode - 将Base64URL字符串解码为二进制数据

这些操作使用URL安全的Base64编码,没有填充,如RFC 4648所述。

来源: ext/crypto/lib.rs223-237