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 |
桌面浏览器兼容性
暂无兼容数据