Web Crypto API为常见的加解密任务提供了一组基础函数,可通过全局crypto.subtle接口访问。
支持的算法
边缘函数计划支持Web Crypto标准的所有操作,如下表所示:
Algorithm | digest() | generateKey() (即将支持) |
importKey() exportKey() (即将支持) |
sign() verify() |
encrypt() decrypt() (即将支持) |
wrapKey() unwrapKey() (即将支持) |
deriveBits() deriveKey() (即将支持) |
---|---|---|---|---|---|---|---|
MD5 | √ | ||||||
SHA1 | √ | ||||||
SHA256 | √ | ||||||
SHA384 | √ | ||||||
SHA512 | √ | ||||||
HMAC | √ | √ | √ | ||||
AES-CTR | √ | √ | √ | √ | |||
AES-CBC | √ | √ | √ | √ | |||
AES-GCM | √ | √ | √ | √ | |||
AES-KW | √ | √ | √ | ||||
RSASSAPKCS1 v1.5 | √ | √ | √ | ||||
RSA PSS | √ | √ | √ | ||||
RSA OAEP | √ | √ | √ | ||||
ECDH | √ | √ | √ | ||||
ECDSA | √ | √ | √ | ||||
HKDF | √ | √ | |||||
PBKDF2 | √ | √ |
备注:MD5不是WebCrypto标准的一部分,但支持与需要MD5的旧系统交互。MD5被认为是一种弱算法。不要依赖MD5来保证安全。
示例
一个摘要算法(也称为哈希算法)简单示例:
const myText = new TextEncoder().encode("Hello world!")
const myDigest = await crypto.subtle.digest(
{
name: "SHA-256",
},
myText, // The data you want to hash as an ArrayBuffer
)
return new Response(new Uint8Array(myDigest))
方法
- crypto.getRandomValues(buffer
ArrayBuffer
)ArrayBuffer
:使用随机值填充ArrayBuffer。
SubtleCrypto方法
这些方法都可以通过crypto.subtle调用:
digest()
-
digest(algorithm, data)
Promise<ArrayBuffer>
返回一个由算法生成的摘要和作为参数给出的文本实现的Promise。
参数:
- algorithm
string | object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - data
ArrayBuffer
- algorithm
generateKey()
-
generateKey(algorithm, extractable, keyUsages)
Promise<CryptoKey> | Promise<CryptoKeyPair>
返回一个Promise,该Promise使用新生成的CryptoKey,对于对称算法,或一个CryptoKeyPair,包含两个新生成的密钥,用于非对称算法。例如,要生成新的AES-GCM密钥:
let keyPair = await crypto.subtle.generateKey( { name: "AES-GCM", length: "256" }, true, ["encrypt", "decrypt"] )
参数:
- algorithm
object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - extractable
bool
- keyUsages
Array
:指示新密钥可能用途的字符串数组。
- algorithm
importKey()
-
importKey(format, keyData, algorithm, extractable, keyUsages)
Promise<CryptoKey>
将密钥从某种外部可移植格式转换为用于Web Crypto API的密钥。
参数:
- format
string
:描述要导入的密钥的格式。 - keyData
ArrayBuffer
- algorithm
object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - extractable
bool
- keyUsages
Array
:指示新密钥可能用途的字符串数组。
- format
exportKey()
-
exportKey(format, key)
Promise<ArrayBuffer>
将CryptoKey转换为可移植格式,如果CryptoKey是extractable(即将支持)。
参数:
- format
string
:描述导出密钥的格式。 - key
CryptoKey
- format
sign()
-
sign(algorithm, key, data)
Promise<ArrayBuffer>
返回一个Promise,该Promise具有与作为参数给出的文本、算法和密钥相对应的签名。
参数:
- algorithm
string | object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - key
CryptoKey
- data
ArrayBuffer
- algorithm
verify()
-
verify(algorithm, key, signature, data)
Promise<ArrayBuffer>
返回一个Promise,该Promise用一个布尔值来表示作为参数给出的签名是否与同样作为参数给出的文本、算法和密钥相匹配。
参数:
- algorithm
string | object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - key
CryptoKey
- signature
ArrayBuffer
- data
ArrayBuffer
- algorithm
encrypt()
-
encrypt(algorithm, key, data)
Promise<ArrayBuffer>
返回一个Promise,该Promise使用与作为参数给出的明文、算法和密钥相对应的加密数据实现(即将支持)。
参数:
- algorithm
object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - key
CryptoKey
- data
BufferSource
- algorithm
decrypt()
-
decrypt(algorithm, key, data)
Promise<ArrayBuffer>
返回一个Promise,该Promise以与作为参数给出的密文、算法和密钥相对应的明文数据实现(即将支持)。
参数:
- algorithm
object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - key
CryptoKey
- data
BufferSource
- algorithm
wrapKey()
-
wrapKey(format, key, wrappingKey, wrapAlgo)
Promise<ArrayBuffer>
将CryptoKey转换为可移植格式,然后使用另一个密钥对其进行加密。让CryptoKey适合在不受信任的环境中存储或传输(即将支持)。
参数:
- format
string
:描述在被加密之前的导出密钥的格式。 - key
CryptoKey
- wrappingKey
CryptoKey
- wrapAlgo
object
:以特定于算法的格式描述用于加密导出密钥的算法,包括任何必需的参数。
- format
unwrapKey
-
unwrapKey(format, key, unwrappingKey, unwrapAlgo,unwrappedKeyAlgo, extractable, keyUsages)
Promise<CryptoKey>
将由wrapKey()back包装的密钥转换为CryptoKey(即将支持)。
参数:
- format
string
:描述要解包的密钥的数据格式。 - key
CryptoKey
- unwrappingKey
CryptoKey
- unwrapAlgo
object
:以特定于算法的格式描述用于加密封装密钥的算法。 - unwrappedKeyAlgo
object
:以特定于算法的格式描述要解包的密钥。 - extractable
bool
- keyUsages
Array
:指示新密钥可能用途的字符串数组。
- format
deriveKey()
-
deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
Promise<CryptoKey>
返回一个Promise,该Promise使用新生成的CryptoKey派生自基本密钥和作为参数给出的特定算法(即将支持)。
参数:
- algorithm
object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - baseKey
CryptoKey
- derivedKeyAlgorithm
object
:以特定于算法的格式定义派生密钥将用于的算法。 - extractable
bool
- keyUsages
Array
:指示新密钥可能用途的字符串数组。
- algorithm
deriveBits()
-
deriveBits(algorithm, baseKey, length)
Promise<ArrayBuffer>
返回一个Promise,该Promise使用新生成的伪随机位缓冲区来实现,该缓冲区从基本密钥和作为参数给出的特定算法派生而来。它返回一个ArrayBuffer包含派生位的Promise。此方法与deriveKey()非常相似,不同之处在于deriveKey()返回一个CryptoKey对象而不是一个ArrayBuffer。本质上,deriveKey()由deriveBits()后跟importKey()(即将支持)。
参数:
- algorithm
object
:以特定算法的格式描述要使用的算法,包括任何必需的参数。 - baseKey
CryptoKey
- length
int
:要导出的位串的长度。
- algorithm