SubtleCrypto

基线 广泛可用

此功能已相当成熟,并在许多设备和浏览器版本中有效。它自 2015 年 7 月.

报告反馈

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在部分或所有支持的浏览器中可用。

SubtleCryptoWeb Crypto API的接口,它提供了一些底层的加密功能。

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

SubtleCrypto的实例可作为subtle属性,通过Crypto接口访问,该接口在窗口中通过Window.crypto属性访问,在工作线程中通过WorkerGlobalScope.crypto属性访问。

警告:此 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()

使用 SubtleCrypto

返回一个Promise,该 Promise 解析为一个CryptoKey,对应于参数中给定的包装后的密钥。

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

加密功能

  • 这些功能可用于实现诸如隐私和身份验证之类的系统安全功能。SubtleCrypto API 提供以下加密功能
  • sign()verify():创建和验证数字签名。
  • encrypt()decrypt():加密和解密数据。

digest():创建某些数据的固定长度、抗冲突摘要。

密钥管理功能

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对象,以及它发现有用的任何其他元数据。这允许存储和检索CryptoKey,而不必将其底层密钥材料暴露给应用程序或 JavaScript 环境。

支持的算法

下表总结了哪些算法适合哪些密码操作

签名
验证
加密
解密
摘要 导出位
导出密钥
包装密钥
解包密钥
生成密钥
导出密钥
导入密钥
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 密码学 API
# subtlecrypto 接口

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参见