SubtleCrypto - 提供了一些底层的加密函数
SubtleCrypto
是 Web 加密接口,提供了一些底层的加密函数。您可以通过 crypto
属性获得 Crypto
对象,然后通过 Crypto
对象的 subtle
属性可以访问 SubtleCrypto
接口的功能。
警告: 该接口提供了大量低级加密原语。它们很容易被误用,而且其中的陷阱可能非常微妙。
即使假设您正确使用了基本的加密功能,安全密钥管理和整体安全系统设计也是非常困难的,通常都是专业安全专家的领域。
安全系统设计和实施中的错误可能会使系统的安全完全无效。
请学习和尝试,但在熟悉此主题的人彻底审查你的工作之前,不要保证或暗示您的工作的安全性。Crypto 101 课程是学习安全系统设计和实现的一个很好的起点。
属性
此接口不继承任何属性,因为它没有父接口。
方法
此接口不继承任何方法,因为它没有父接口。
SubtleCrypto.encrypt()
返回一个 Promise
,根据给出的明文、算法和密钥参数,解析为对应的加密数据。
SubtleCrypto.decrypt()
返回一个 Promise
,根据给出的加密文本、算法和密钥参数,解析为对应的明文数据。
SubtleCrypto.sign()
返回一个 Promise
,根据给出的文本、算法和密钥参数,解析为对应的签名。
SubtleCrypto.verify()
返回一个 Promise
,它解析为一个布尔值,该值表示作为参数给出的签名,是否与也作为参数给出的文本、算法和密钥匹配。
SubtleCrypto.digest()
返回一个 Promise
,根据给出的算法和文本参数,解析为对应的生成的摘要。
SubtleCrypto.generateKey()
返回一个 Promise
,根据给出的算法,用法和可提取性参数,对于对称算法,返回新生成的 CryptoKey
;对于非对称算法, 返回包含两个新生成的密钥的 CryptoKeyPair
。这些将与作为参数提供的算法、用法和可提取性相匹配。
SubtleCrypto.deriveKey()
返回一个 Promise
,它使用主密钥和特定算法作为参数,解析为为一个新生成的 CryptoKey
。
SubtleCrypto.deriveBits()
返回一个 Promise
,它使用主密钥和特定算法作为参数,解析为新生成的伪随机位缓冲区。
SubtleCrypto.importKey()
返回一个 Promise
,根据给出格式、算法、原始密钥数据、用法和可提取性,解析为一个 CryptoKey
。
SubtleCrypto.exportKey()
返回一个 Promise
,它解析为一个用包含所请求格式的键的缓冲区。
SubtleCrypto.wrapKey()
返回一个 Promise
,它解析为一个封装的对称密钥,以便在不安全的环境中使用(传输和存储)。封装的键与给定参数中指定的格式匹配,并且通过给定的封装的键使用指定的算法来完成封装。
SubtleCrypto.unwrapKey()
返回一个 Promise
,根除参数给出的已封装的键名,解析为一个 CryptoKey
。
SubtleCrypto
使用 我们可以将该接口实现的功能分为两类:加密功能和密钥管理功能。
Cryptography
功能
这些功能可用于在系统中实现隐私和身份验证等安全功能。 SubtleCrypto
接口提供以下加密函数:
密钥管理功能
除了 digest()
,接口中的所有加密函数都使用密钥。在 SubtleCrypto
接口中,使用 CryptoKey
对象表示密钥。要执行签名和加密等操作,您需要将一个 CryptoKey
对象传递给 sign()
或 encrypt()
函数。
生成和派生密钥
generateKey()
和 deriveKey()
函数都创建了一个新的 CryptoKey
对象。
不同的是,generateKey()
每次调用都会生成一个新的不同的密钥值,而 deriveKey()
则是从一些初始密钥材料中派生出一个密钥。如果您将相同的密钥材料提供给两个单独的 deriveKey()
调用,则会得到两个具有相同底层值的 CryptoKey
对象。例如,如果您想要从密码派生加密密钥,然后从相同的密码派生相同的密钥以解密数据,则这很有用。
导入和导出密钥
要使密钥在您的应用程序之外可用,您需要导出密钥,这就是 exportKey()
的作用。您可以从多种导出格式中选择一种。
exportKey()
的相反操作是 importKey()
。您可以从其他系统导入密钥,并且支持 PKCS#8 和 JSON Web Key] 等标准格式可以让你直接导入。exportKey()
函数的作用是:以未加密格式导出密钥。
如果密钥是敏感数据,则应该使用 wrapKey()
,它会导出密钥,然后使用另一个密钥进行加密;该接口称为 “密钥包装密钥”。
wrapKey()
的相反操作是 unwrapKey()
,解密后导入密钥。
存储密钥
CryptoKey
对象可以使用结构化克隆算法]来存储,即可以使用标准的 Web 存储 API 来存储和检索。该规范预计大多数开发者会使用 IndexedDB API 来存储 CryptoKey
对象。
支持的算法
Web Crypto API 提供的加密函数可以由一种或多种不同的加密算法执行:函数的 algorithm
参数指示使用哪种算法。一些算法需要额外的参数:在这些情况下,algorithm
参数是一个包含额外参数的字典对象。
下表总结了哪些算法适用于哪些加密操作:
sign() verify() | encrypt() decrypt() | digest() | deriveBits() deriveKey() | wrapKey() unwrapKey() | |
---|---|---|---|---|---|
RSASSA-PKCS1-v1_5 | ✓ | ||||
RSA-PSS | ✓ | ||||
ECDSA | ✓ | ||||
HMAC | ✓ | ||||
RSA-OAEP | ✓ | ✓ | |||
AES-CTR | ✓ | ✓ | |||
AES-CBC | ✓ | ✓ | |||
AES-GCM | ✓ | ✓ | |||
SHA-1 | ✓ | ||||
SHA-256 | ✓ | ||||
SHA-384 | ✓ | ||||
SHA-512 | ✓ | ||||
ECDH | ✓ | ||||
HKDF | ✓ | ||||
PBKDF2 | ✓ | ||||
AES-KW | ✓ |
规范
规范 |
---|
Web Cryptography API # subtlecrypto-interface |
桌面浏览器兼容性
暂无兼容数据