SubtleCrypto

Baseline 广泛可用 *

此功能已成熟,可跨多种设备和浏览器版本使用。自 2017 年 9 月以来,它已在浏览器中提供。

* 此特性的某些部分可能存在不同级别的支持。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

Web Crypto API 的 SubtleCrypto 接口提供了许多低级加密功能。

该接口名称包含“subtle”(细微)一词,表示其许多算法都有细微的使用要求,因此必须谨慎使用才能提供适当的安全保证。

SubtleCrypto 的一个实例可以通过 Crypto 接口的 subtle 属性获得,该属性又可以通过 Window.crypto 属性在窗口中获得,或通过 WorkerGlobalScope.crypto 属性在 worker 中获得。

警告:此 API 提供了一些低级加密原语。很容易误用它们,并且其中的陷阱可能非常微妙。

即使您正确使用了基本的加密函数,安全的密钥管理和整体安全系统设计也极难正确实现,通常是专业安全专家的领域。

安全系统设计和实现的错误可能导致系统安全性完全无效。

请学习和实验,但在对该主题有深入了解的个人彻底审查之前,不要保证或暗示您的工作是安全的。 Crypto 101 课程是开始学习安全系统设计和实现的一个很好的起点。

实例属性

此接口不继承任何属性,因为它没有父接口。

实例方法

此接口不继承任何方法,因为它没有父接口。

SubtleCrypto.encrypt()

返回一个 Promise,该 Promise 以参数中给定的明文、算法和密钥对应的加密数据进行解析。

SubtleCrypto.decrypt()

返回一个 Promise,该 Promise 以参数中给定的加密文本、算法和密钥对应的明文数据进行解析。

SubtleCrypto.sign()

返回一个 Promise,该 Promise 以参数中给定的文本、算法和密钥对应的签名进行解析。

SubtleCrypto.verify()

返回一个 Promise,该 Promise 以一个布尔值进行解析,该值指示参数中给定的签名是否与同样作为参数给出的文本、算法和密钥匹配。

SubtleCrypto.digest()

返回一个 Promise,该 Promise 以参数中给定的算法和文本生成的摘要进行解析。

SubtleCrypto.generateKey()

返回一个 Promise,该 Promise 以一个新生成的 CryptoKey(对于对称算法)或一个包含两个新生成的密钥的 CryptoKeyPair(对于非对称算法)进行解析。这些将与参数中给定的算法、用法和可提取性相匹配。

SubtleCrypto.deriveKey()

返回一个 Promise,该 Promise 以从主密钥和参数中给定的特定算法派生出的新生成的 CryptoKey 进行解析。

SubtleCrypto.deriveBits()

返回一个 Promise,该 Promise 以从主密钥和参数中给定的特定算法派生出的新生成的伪随机比特缓冲区进行解析。

SubtleCrypto.importKey()

返回一个 Promise,该 Promise 以与参数中给定的格式、算法、原始密钥数据、用法和可提取性相对应的 CryptoKey 进行解析。

SubtleCrypto.exportKey()

返回一个 Promise,该 Promise 以包含请求格式的密钥的原始密钥数据进行解析。

SubtleCrypto.wrapKey()

返回一个 Promise,该 Promise 以一个用于在不安全环境中使用(传输和存储)的封装对称密钥进行解析。封装的密钥与给定参数中指定的格式匹配,并且使用指定的算法,由给定的封装密钥进行封装。

SubtleCrypto.unwrapKey()

返回一个 Promise,该 Promise 以与参数中给定的封装密钥相对应的 CryptoKey 进行解析。

使用 SubtleCrypto

我们可以将此 API 实现的功能分为两类:加密功能和密钥管理功能。

加密功能

这些是您可以在系统中用于实现隐私和身份验证等安全功能的函数。 SubtleCrypto API 提供以下加密功能:

密钥管理功能

除了 digest() 之外,API 中的所有加密函数都使用加密密钥。在 SubtleCrypto API 中,加密密钥使用 CryptoKey 对象表示。要执行签名和加密等操作,您需要将 CryptoKey 对象传递给 sign()encrypt() 函数。

生成和派生密钥

generateKey()deriveKey() 函数都创建一个新的 CryptoKey 对象。

区别在于,generateKey() 每次调用时都会生成一个新的、不同的密钥值,而 deriveKey() 则从某个初始密钥材料派生密钥。如果您将相同的密钥材料提供给两次单独调用 deriveKey(),您将获得两个具有相同底层值的 CryptoKey 对象。这很有用,例如,当您想从密码派生一个加密密钥,然后稍后从相同的密码派生相同的密钥来解密数据时。

导入和导出密钥

为了使密钥在您的应用程序外部可用,您需要导出密钥,这就是 exportKey() 的用途。您可以选择多种导出格式之一。

exportKey() 的反向操作是 importKey()。您可以从其他系统导入密钥,并且支持 PKCS #8JSON Web Key 等标准格式,这有助于您完成此操作。 exportKey() 函数以未加密的格式导出密钥。

如果密钥是敏感的,您应该使用 wrapKey(),它会导出密钥,然后使用另一个密钥对其进行加密;API 称之为“密钥封装密钥”。

wrapKey() 的反向操作是 unwrapKey(),它会解密然后导入密钥。

存储密钥

CryptoKey 是一个 可序列化对象,它允许使用标准的 Web 存储 API 来存储和检索密钥。

该规范期望大多数开发人员将使用 IndexedDB API,将 CryptoKey 对象存储在应用程序有意义的某个密钥字符串标识符下,以及任何其他他们认为有用的元数据。这允许在不向应用程序或 JavaScript 环境暴露其底层密钥材料的情况下存储和检索 CryptoKey

支持的算法

Web Crypto API 提供的加密功能可以由一个或多个不同的加密算法执行:函数的 algorithm 参数指示要使用的算法。某些算法需要额外的参数:在这种情况下,algorithm 参数是一个字典对象,其中包含额外的参数。

下表总结了哪些算法适用于哪些加密操作

符号
verify
encrypt
decrypt
digest deriveBits
deriveKey
wrapKey
unwrapKey
generateKey
exportKey
importKey
RSASSA-PKCS1-v1_5
RSA-PSS
ECDSA
Ed25519
HMAC
RSA-OAEP
AES-CTR
AES-CBC
AES-GCM
AES-KW
SHA-1
SHA-256
SHA-384
SHA-512
ECDH
X25519
HKDF
PBKDF2

规范

规范
Web 加密级别 2
# subtlecrypto-interface

浏览器兼容性

另见