SubtleCrypto
基线 广泛可用
此功能已相当成熟,并在许多设备和浏览器版本中有效。它自 2015 年 7 月.
报告反馈
安全上下文:此功能仅在安全上下文(HTTPS)中可用,在部分或所有支持的浏览器中可用。
SubtleCrypto
是Web 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
我们可以将此 API 实现的功能分为两组:加密功能和密钥管理功能。
digest()
:创建某些数据的固定长度、抗冲突摘要。
密钥管理功能
除digest()
之外,API 中的所有加密功能都使用加密密钥。在SubtleCrypto
API 中,加密密钥使用CryptoKey
对象表示。要执行诸如签名和加密之类的操作,你需要将一个CryptoKey
对象传递到sign()
或encrypt()
函数中。
生成和派生密钥
generateKey()
和 deriveKey()
函数都会创建一个新的CryptoKey
对象。
区别在于,generateKey()
每次调用都会生成一个新的独特密钥值,而deriveKey()
则从一些初始密钥材料中派生密钥。如果你对deriveKey()
的两个单独调用提供相同的密钥材料,你将获得两个具有相同底层值的CryptoKey
对象。例如,如果你想从密码中派生加密密钥,然后从同一个密码中派生同一个密钥来解密数据,这很有用。
导入和导出密钥
要使密钥在你的应用程序之外可用,你需要导出密钥,这就是exportKey()
的作用。你可以选择多种导出格式。
exportKey()
的逆运算为importKey()
。你可以从其他系统导入密钥,对标准格式(如PKCS #8 和 JSON Web Key)的支持可以帮助你实现这一点。exportKey()
函数以未加密的格式导出密钥。
如果密钥敏感,你应该使用wrapKey()
,它会导出密钥,然后使用另一个密钥加密它;API 称为“密钥包装密钥”。
wrapKey()
的逆运算为unwrapKey()
,它会解密然后导入密钥。
存储密钥
CryptoKey
是一个可序列化对象,允许使用标准 Web 存储 API 存储和检索密钥。
规范预计大多数开发人员会使用IndexedDB API,根据对应用程序有意义的密钥字符串标识符存储CryptoKey
对象,以及它发现有用的任何其他元数据。这允许存储和检索CryptoKey
,而不必将其底层密钥材料暴露给应用程序或 JavaScript 环境。
支持的算法
下表总结了哪些算法适合哪些密码操作
规范
规范 |
---|
Web 密码学 API # subtlecrypto 接口 |
浏览器兼容性
BCD 表格仅在浏览器中加载