Web Crypto API
History
现在支持 TurboSHAKE 和 KangarooTwelve 算法。
现在支持 KMAC 算法。
现在支持 Argon2 算法。
现在支持 AES-OCB 算法。
现在支持 ML-KEM 算法。
现在支持 ChaCha20-Poly1305 算法。
现在支持 SHA-3 算法。
现在支持 SHAKE 算法。
现在支持 ML-DSA 算法。
算法 Ed25519 和 X25519 现已稳定。
参数现在根据 WebIDL 定义进行强制转换和验证, 与其他 Web Crypto API 实现一样。
不再处于实验阶段,但 Ed25519、Ed448、X25519 和 X448 算法除外。
移除了专有的 'node.keyObject' 导入/导出格式。
移除了专有的 'NODE-DSA'、'NODE-DH'、和 'NODE-SCRYPT' 算法。
添加了 'Ed25519'、'Ed448'、'X25519' 和 'X448'算法。
移除了专有的 'NODE-ED25519' 和 'NODE-ED448'算法。
从 'ECDH' 算法中移除了专有的 'NODE-X25519' 和 'NODE-X448' 命名曲线。
稳定性:2 - 稳定
Node.js 提供了 Web Crypto API 标准的实现。
使用 globalThis.crypto 或 require('node:crypto').webcrypto 来访问此
模块。
const { subtle } = globalThis.crypto;
(async function() {
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const enc = new TextEncoder();
const message = enc.encode('I love cupcakes');
const digest = await subtle.sign({
name: 'HMAC',
}, key, message);
})();稳定性:1.1 - 积极开发中
Node.js 提供了以下功能的实现,来自 Web 加密 API 中的现代算法 WICG 提案:
算法:
'AES-OCB'1'Argon2d'2'Argon2i'2'Argon2id'2'ChaCha20-Poly1305''cSHAKE128''cSHAKE256''KMAC128'1'KMAC256'1'KT128''KT256''ML-DSA-44'3'ML-DSA-65'3'ML-DSA-87'3'ML-KEM-512'3'ML-KEM-768'3'ML-KEM-1024'3'SHA3-256''SHA3-384''SHA3-512''TurboSHAKE128''TurboSHAKE256'
密钥格式:
'raw-public''raw-secret''raw-seed'
方法:
subtle.decapsulateBits()subtle.decapsulateKey()subtle.encapsulateBits()subtle.encapsulateKey()subtle.getPublicKey()SubtleCrypto.supports()
稳定性:1.1 - 积极开发中
Node.js 提供了以下功能的实现,来自 Web 加密 API 中的安全曲线 WICG 提案:
算法:
'Ed448''X448'
<SubtleCrypto> 类可用于生成对称(秘密)密钥
或非对称密钥对(公钥和私钥)。
const { subtle } = globalThis.crypto;
async function generateAesKey(length = 256) {
const key = await subtle.generateKey({
name: 'AES-CBC',
length,
}, true, ['encrypt', 'decrypt']);
return key;
}const { subtle } = globalThis.crypto;
async function generateEcKey(namedCurve = 'P-521') {
const {
publicKey,
privateKey,
} = await subtle.generateKey({
name: 'ECDSA',
namedCurve,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
}const { subtle } = globalThis.crypto;
async function generateEd25519Key() {
return subtle.generateKey({
name: 'Ed25519',
}, true, ['sign', 'verify']);
}
async function generateX25519Key() {
return subtle.generateKey({
name: 'X25519',
}, true, ['deriveKey']);
}const { subtle } = globalThis.crypto;
async function generateHmacKey(hash = 'SHA-256') {
const key = await subtle.generateKey({
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return key;
}const { subtle } = globalThis.crypto;
const publicExponent = new Uint8Array([1, 0, 1]);
async function generateRsaKey(modulusLength = 2048, hash = 'SHA-256') {
const {
publicKey,
privateKey,
} = await subtle.generateKey({
name: 'RSASSA-PKCS1-v1_5',
modulusLength,
publicExponent,
hash,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
}const crypto = globalThis.crypto;
async function aesEncrypt(plaintext) {
const ec = new TextEncoder();
const key = await generateAesKey();
const iv = crypto.getRandomValues(new Uint8Array(16));
const ciphertext = await crypto.subtle.encrypt({
name: 'AES-CBC',
iv,
}, key, ec.encode(plaintext));
return {
key,
iv,
ciphertext,
};
}
async function aesDecrypt(ciphertext, key, iv) {
const dec = new TextDecoder();
const plaintext = await crypto.subtle.decrypt({
name: 'AES-CBC',
iv,
}, key, ciphertext);
return dec.decode(plaintext);
}const { subtle } = globalThis.crypto;
async function generateAndExportHmacKey(format = 'jwk', hash = 'SHA-512') {
const key = await subtle.generateKey({
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return subtle.exportKey(format, key);
}
async function importHmacKey(keyData, format = 'jwk', hash = 'SHA-512') {
const key = await subtle.importKey(format, keyData, {
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return key;
}const { subtle } = globalThis.crypto;
async function generateAndWrapHmacKey(format = 'jwk', hash = 'SHA-512') {
const [
key,
wrappingKey,
] = await Promise.all([
subtle.generateKey({
name: 'HMAC', hash,
}, true, ['sign', 'verify']),
subtle.generateKey({
name: 'AES-KW',
length: 256,
}, true, ['wrapKey', 'unwrapKey']),
]);
const wrappedKey = await subtle.wrapKey(format, key, wrappingKey, 'AES-KW');
return { wrappedKey, wrappingKey };
}
async function unwrapHmacKey(
wrappedKey,
wrappingKey,
format = 'jwk',
hash = 'SHA-512') {
const key = await subtle.unwrapKey(
format,
wrappedKey,
wrappingKey,
'AES-KW',
{ name: 'HMAC', hash },
true,
['sign', 'verify']);
return key;
}const { subtle } = globalThis.crypto;
async function sign(key, data) {
const ec = new TextEncoder();
const signature =
await subtle.sign('RSASSA-PKCS1-v1_5', key, ec.encode(data));
return signature;
}
async function verify(key, signature, data) {
const ec = new TextEncoder();
const verified =
await subtle.verify(
'RSASSA-PKCS1-v1_5',
key,
signature,
ec.encode(data));
return verified;
}const { subtle } = globalThis.crypto;
async function pbkdf2(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const key = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveBits']);
const bits = await subtle.deriveBits({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations,
}, key, length);
return bits;
}
async function pbkdf2Key(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const keyMaterial = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveKey']);
const key = await subtle.deriveKey({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations,
}, keyMaterial, {
name: 'AES-GCM',
length,
}, true, ['encrypt', 'decrypt']);
return key;
}const { subtle } = globalThis.crypto;
async function digest(data, algorithm = 'SHA-512') {
const ec = new TextEncoder();
const digest = await subtle.digest(algorithm, ec.encode(data));
return digest;
}SubtleCrypto.supports() 允许在 Web Crypto API 中进行功能检测,
可用于检测给定的操作是否支持给定的算法标识符
(包括其参数)。
此示例使用 Argon2 从密码派生密钥(如果可用), 否则使用 PBKDF2;然后使用 AES-OCB(如果可用)或 AES-GCM 用它加密和解密一些文本。
const { SubtleCrypto, crypto } = globalThis;
const password = 'correct horse battery staple';
const derivationAlg =
SubtleCrypto.supports?.('importKey', 'Argon2id') ?
'Argon2id' :
'PBKDF2';
const encryptionAlg =
SubtleCrypto.supports?.('importKey', 'AES-OCB') ?
'AES-OCB' :
'AES-GCM';
const passwordKey = await crypto.subtle.importKey(
derivationAlg === 'Argon2id' ? 'raw-secret' : 'raw',
new TextEncoder().encode(password),
derivationAlg,
false,
['deriveKey'],
);
const nonce = crypto.getRandomValues(new Uint8Array(16));
const derivationParams =
derivationAlg === 'Argon2id' ?
{
nonce,
parallelism: 4,
memory: 2 ** 21,
passes: 1,
} :
{
salt: nonce,
iterations: 100_000,
hash: 'SHA-256',
};
const key = await crypto.subtle.deriveKey(
{
name: derivationAlg,
...derivationParams,
},
passwordKey,
{
name: encryptionAlg,
length: 256,
},
false,
['encrypt', 'decrypt'],
);
const plaintext = 'Hello, world!';
const iv = crypto.getRandomValues(new Uint8Array(16));
const encrypted = await crypto.subtle.encrypt(
{ name: encryptionAlg, iv },
key,
new TextEncoder().encode(plaintext),
);
const decrypted = new TextDecoder().decode(await crypto.subtle.decrypt(
{ name: encryptionAlg, iv },
key,
encrypted,
));这些表格详细说明了 Node.js Web Crypto API 实现所支持的算法以及各自支持的 API:
| 算法 | subtle.generateKey() | subtle.exportKey() | subtle.importKey() | subtle.getPublicKey() |
|---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | ✔ | |
'AES-CTR' | ✔ | ✔ | ✔ | |
'AES-GCM' | ✔ | ✔ | ✔ | |
'AES-KW' | ✔ | ✔ | ✔ | |
'AES-OCB' | ✔ | ✔ | ✔ | |
'Argon2d' | ✔ | |||
'Argon2i' | ✔ | |||
'Argon2id' | ✔ | |||
'ChaCha20-Poly1305'4 | ✔ | ✔ | ✔ | |
'ECDH' | ✔ | ✔ | ✔ | ✔ |
'ECDSA' | ✔ | ✔ | ✔ | ✔ |
'Ed25519' | ✔ | ✔ | ✔ | ✔ |
'Ed448'5 | ✔ | ✔ | ✔ | ✔ |
'HKDF' | ✔ | |||
'HMAC' | ✔ | ✔ | ✔ | |
'KMAC128'4 | ✔ | ✔ | ✔ | |
'KMAC256'4 | ✔ | ✔ | ✔ | |
'ML-DSA-44'4 | ✔ | ✔ | ✔ | ✔ |
'ML-DSA-65'4 | ✔ | ✔ | ✔ | ✔ |
'ML-DSA-87'4 | ✔ | ✔ | ✔ | ✔ |
'ML-KEM-512'4 | ✔ | ✔ | ✔ | ✔ |
'ML-KEM-768'4 | ✔ | ✔ | ✔ | ✔ |
'ML-KEM-1024'4 | ✔ | ✔ | ✔ | ✔ |
'PBKDF2' | ✔ | |||
'RSA-OAEP' | ✔ | ✔ | ✔ | ✔ |
'RSA-PSS' | ✔ | ✔ | ✔ | ✔ |
'RSASSA-PKCS1-v1_5' | ✔ | ✔ | ✔ | ✔ |
'X25519' | ✔ | ✔ | ✔ | ✔ |
'X448'5 | ✔ | ✔ | ✔ | ✔ |
列图例:
- 加密:
subtle.encrypt()/subtle.decrypt() - 签名和 MAC:
subtle.sign()/subtle.verify() - 密钥或位派生:
subtle.deriveBits()/subtle.deriveKey() - 密钥包装:
subtle.wrapKey()/subtle.unwrapKey() - 密钥封装:
subtle.encapsulateBits()/subtle.decapsulateBits()/subtle.encapsulateKey()/subtle.decapsulateKey() - 摘要:
subtle.digest()
| 算法 | 加密 | 签名和 MAC | 密钥或位派生 | 密钥包装 | 密钥封装 | 摘要 |
|---|---|---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | ||||
'AES-CTR' | ✔ | ✔ | ||||
'AES-GCM' | ✔ | ✔ | ||||
'AES-KW' | ✔ | |||||
'AES-OCB' | ✔ | ✔ | ||||
'Argon2d' | ✔ | |||||
'Argon2i' | ✔ | |||||
'Argon2id' | ✔ | |||||
'ChaCha20-Poly1305'4 | ✔ | ✔ | ||||
'cSHAKE128'4 | ✔ | |||||
'cSHAKE256'4 | ✔ | |||||
'ECDH' | ✔ | |||||
'ECDSA' | ✔ | |||||
'Ed25519' | ✔ | |||||
'Ed448'5 | ✔ | |||||
'HKDF' | ✔ | |||||
'HMAC' | ✔ | |||||
'KMAC128'4 | ✔ | |||||
'KMAC256'4 | ✔ | |||||
'KT128'4 | ✔ | |||||
'KT256'4 | ✔ | |||||
'ML-DSA-44'4 | ✔ | |||||
'ML-DSA-65'4 | ✔ | |||||
'ML-DSA-87'4 | ✔ | |||||
'ML-KEM-512'4 | ✔ | |||||
'ML-KEM-768'4 | ✔ | |||||
'ML-KEM-1024'4 | ✔ | |||||
'PBKDF2' | ✔ | |||||
'RSA-OAEP' | ✔ | ✔ | ||||
'RSA-PSS' | ✔ | |||||
'RSASSA-PKCS1-v1_5' | ✔ | |||||
'SHA-1' | ✔ | |||||
'SHA-256' | ✔ | |||||
'SHA-384' | ✔ | |||||
'SHA-512' | ✔ | |||||
'SHA3-256'4 | ✔ | |||||
'SHA3-384'4 | ✔ | |||||
'SHA3-512'4 | ✔ | |||||
'TurboSHAKE128'4 | ✔ | |||||
'TurboSHAKE256'4 | ✔ | |||||
'X25519' | ✔ | |||||
'X448'5 | ✔ |
类:Crypto
History
globalThis.crypto 是 Crypto 类的一个实例。Crypto 是一个单例,提供对其余 crypto API 的访问。
提供对 SubtleCrypto API 的访问。
crypto.getRandomValues(typedArray): void<TypedArray><TypedArray>生成密码学安全的随机值。给定的 typedArray 将被填充随机值,并返回对 typedArray 的引用。
给定的 typedArray 必须是基于整数的 <TypedArray> 实例,即不接受 Float32Array 和 Float64Array。
如果给定的 typedArray 大于 65,536 字节,将抛出错误。
crypto.randomUUID(): void- 返回:
<string>
生成一个随机的 RFC 4122 版本 4 UUID。UUID 是使用密码学伪随机数生成器生成的。
类:CryptoKey
History
- 类型:{KeyAlgorithm|RsaHashedKeyAlgorithm|EcKeyAlgorithm|AesKeyAlgorithm|HmacKeyAlgorithm|KmacKeyAlgorithm}
一个对象,详细说明密钥可用于哪种算法以及额外的算法特定参数。
只读。
- 类型:
<boolean>
当为 true 时,<CryptoKey> 可以使用 subtle.exportKey() 或 subtle.wrapKey() 导出。
只读。
- 类型:
<string>'secret'、'private'或'public'之一。
一个字符串,标识密钥是对称('secret')还是非对称('private' 或 'public')密钥。
- 类型:
<string[]>
一个字符串数组,标识密钥可用于哪些操作。
可能的用途包括:
'encrypt'- 启用密钥与subtle.encrypt()一起使用'decrypt'- 启用密钥与subtle.decrypt()一起使用'sign'- 启用密钥与subtle.sign()一起使用'verify'- 启用密钥与subtle.verify()一起使用'deriveKey'- 启用密钥与subtle.deriveKey()一起使用'deriveBits'- 启用密钥与subtle.deriveBits()一起使用'encapsulateBits'- 启用密钥与subtle.encapsulateBits()一起使用'decapsulateBits'- 启用密钥与subtle.decapsulateBits()一起使用'encapsulateKey'- 启用密钥与subtle.encapsulateKey()一起使用'decapsulateKey'- 启用密钥与subtle.decapsulateKey()一起使用'wrapKey'- 启用密钥与subtle.wrapKey()一起使用'unwrapKey'- 启用密钥与subtle.unwrapKey()一起使用
有效的密钥用途取决于密钥算法(由 cryptokey.algorithm.name 标识)。
图例:
- 加密:
subtle.encrypt()/subtle.decrypt() - 签名和 MAC:
subtle.sign()/subtle.verify() - 密钥或位派生:
subtle.deriveBits()/subtle.deriveKey() - 密钥包装:
subtle.wrapKey()/subtle.unwrapKey() - 密钥封装:
subtle.encapsulateBits()/subtle.decapsulateBits()/subtle.encapsulateKey()/subtle.decapsulateKey()
| 支持的密钥算法 | 加密 | 签名和 MAC | 密钥或位派生 | 密钥包装 | 密钥封装 |
|---|---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | |||
'AES-CTR' | ✔ | ✔ | |||
'AES-GCM' | ✔ | ✔ | |||
'AES-KW' | ✔ | ||||
'AES-OCB' | ✔ | ✔ | |||
'Argon2d' | ✔ | ||||
'Argon2i' | ✔ | ||||
'Argon2id' | ✔ | ||||
'ChaCha20-Poly1305'4 | ✔ | ✔ | |||
'ECDH' | ✔ | ||||
'ECDSA' | ✔ | ||||
'Ed25519' | ✔ | ||||
'Ed448'5 | ✔ | ||||
'HDKF' | ✔ | ||||
'HMAC' | ✔ | ||||
'KMAC128'4 | ✔ | ||||
'KMAC256'4 | ✔ | ||||
'ML-DSA-44'4 | ✔ | ||||
'ML-DSA-65'4 | ✔ | ||||
'ML-DSA-87'4 | ✔ | ||||
'ML-KEM-512'4 | ✔ | ||||
'ML-KEM-768'4 | ✔ | ||||
'ML-KEM-1024'4 | ✔ | ||||
'PBKDF2' | ✔ | ||||
'RSA-OAEP' | ✔ | ✔ | |||
'RSA-PSS' | ✔ | ||||
'RSASSA-PKCS1-v1_5' | ✔ | ||||
'X25519' | ✔ | ||||
'X448'5 | ✔ |
类:CryptoKeyPair
History
CryptoKeyPair 是一个简单的字典对象,具有 publicKey 和 privateKey 属性,表示非对称密钥对。
- 类型:
<CryptoKey>一个type为'private'的<CryptoKey>。
- 类型:
<CryptoKey>一个type为'public'的<CryptoKey>。
类:SubtleCrypto
History
静态方法:SubtleCrypto.supports(operation, algorithm[, lengthOrAdditionalAlgorithm])
History
稳定性:1.1 - 积极开发中
<string><string><null>
|
<number>
|
<string>
|
<undefined>null
,否则为
undefined
。<boolean>
指示实现是否支持给定的操作允许在 Web Crypto API 中进行功能检测, 可用于检测给定的算法标识符 (包括其参数)是否支持给定的操作。
参见 检查运行时算法支持 以了解此方法的示例用法。
subtle.decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext): void稳定性:1.1 - 积极开发中
<string><CryptoKey><ArrayBuffer>
|
<TypedArray>
|
<DataView><Promise>
成功时兑现为
<ArrayBuffer>
。消息接收者使用他们的非对称私钥解密“封装密钥”(密文),从而恢复一个临时对称密钥(表示为 <ArrayBuffer>),然后用于解密消息。
目前支持的算法包括:
subtle.decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, usages): void稳定性:1.1 - 积极开发中
<string><CryptoKey><ArrayBuffer>
|
<TypedArray>
|
<DataView><string><boolean><string[]><Promise>
成功时兑现为
<CryptoKey>
。消息接收者使用他们的非对称私钥解密“封装密钥”(密文),从而恢复一个临时对称密钥(表示为 <CryptoKey>),然后用于解密消息。
目前支持的算法包括:
subtle.decrypt
History
AES-OCB algorithm is now supported.
ChaCha20-Poly1305 algorithm is now supported.
subtle.decrypt(algorithm, key, data): voidalgorithm{RsaOaepParams|AesCtrParams|AesCbcParams|AeadParams}key<CryptoKey>data<ArrayBuffer>|<TypedArray>|<DataView>- 返回:
<Promise>成功时兑现为<ArrayBuffer>。
使用 algorithm 中指定的方法和参数以及 key 提供的密钥材料,此方法尝试解密提供的 data。如果成功,返回的 Promise 将解决为一个包含明文结果的 <ArrayBuffer>。
目前支持的算法包括:
subtle.deriveBits(algorithm, baseKey, length?): voidalgorithm{EcdhKeyDeriveParams|HkdfParams|Pbkdf2Params|Argon2Params}baseKey<CryptoKey>length<number>|<null>默认值:null- 返回:
<Promise>成功时兑现为<ArrayBuffer>。
使用 algorithm 中指定的方法和参数以及 baseKey 提供的密钥材料,此方法尝试生成 length 位。
当未提供 length 或为 null 时,将生成给定算法的最大位数。这对于 'ECDH'、'X25519' 和 'X448'5 算法是允许的,对于其他算法,length 必须是一个数字。
如果成功,返回的 Promise 将解决为一个包含生成数据的 <ArrayBuffer>。
目前支持的算法包括:
subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages): voidalgorithm{EcdhKeyDeriveParams|HkdfParams|Pbkdf2Params|Argon2Params}baseKey<CryptoKey>derivedKeyAlgorithm<string>extractable<boolean>keyUsages<string[]>参见 [密钥用途][]。- 返回:
<Promise>成功时兑现为<CryptoKey>。
使用 algorithm 中指定的方法和参数以及 baseKey 提供的密钥材料,此方法尝试基于 derivedKeyAlgorithm 中的方法和参数生成一个新的 <CryptoKey>。
调用此方法等效于调用 subtle.deriveBits() 生成原始密钥材料,然后将结果传入 subtle.importKey() 方法,使用 deriveKeyAlgorithm、extractable 和 keyUsages 参数作为输入。
目前支持的算法包括:
subtle.digest(algorithm, data): void<string><ArrayBuffer>
|
<TypedArray>
|
<DataView><Promise>
成功时兑现为
<ArrayBuffer>
。使用 algorithm 标识的方法,此方法尝试生成 data 的摘要。如果成功,返回的 Promise 将解决为一个包含计算摘要的 <ArrayBuffer>。
如果 algorithm 作为 <string> 提供,它必须是以下之一:
'cSHAKE128'4'cSHAKE256'4'KT128'4'KT256'4'SHA-1''SHA-256''SHA-384''SHA-512''SHA3-256'4'SHA3-384'4'SHA3-512'4'TurboSHAKE128'4'TurboSHAKE256'4
如果 algorithm 作为 <Object> 提供,它必须具有一个 name 属性,其值为上述之一。
subtle.encapsulateBits(encapsulationAlgorithm, encapsulationKey): void稳定性:1.1 - 积极开发中
使用消息接收者的非对称公钥加密临时对称密钥。此加密密钥是表示为 {EncapsulatedBits} 的“封装密钥”。
目前支持的算法包括:
subtle.encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, usages): void稳定性:1.1 - 积极开发中
<string><CryptoKey><string><boolean><string[]><Promise>
成功时兑现为 {EncapsulatedKey}。使用消息接收者的非对称公钥加密临时对称密钥。此加密密钥是表示为 {EncapsulatedKey} 的“封装密钥”。
目前支持的算法包括:
subtle.encrypt
History
AES-OCB algorithm is now supported.
ChaCha20-Poly1305 algorithm is now supported.
subtle.encrypt(algorithm, key, data): voidalgorithm{RsaOaepParams|AesCtrParams|AesCbcParams|AeadParams}key<CryptoKey>data<ArrayBuffer>|<TypedArray>|<DataView>- 返回:
<Promise>成功时兑现为<ArrayBuffer>。
使用 algorithm 指定的方法和参数以及 key 提供的密钥材料,此方法尝试加密 data。如果成功,返回的 Promise 将解决为一个包含加密结果的 <ArrayBuffer>。
目前支持的算法包括:
subtle.exportKey
History
KMAC algorithms are now supported.
ML-KEM algorithms are now supported.
ChaCha20-Poly1305 algorithm is now supported.
ML-DSA algorithms are now supported.
Added 'Ed25519', 'Ed448', 'X25519', and 'X448'algorithms.
Removed 'NODE-DSA' JWK export.
subtle.exportKey(format, key): void将给定的密钥导出为指定的格式(如果支持)。
如果 <CryptoKey> 不可导出,返回的 Promise 将被拒绝。
当 format 为 'pkcs8' 或 'spki' 且导出成功时,返回的 Promise 将解决为一个包含导出密钥数据的 <ArrayBuffer>。
当 format 为 'jwk' 且导出成功时,返回的 Promise 将解决为一个符合 JSON Web Key 规范的 JavaScript 对象。
| 支持的密钥算法 | 'spki' | 'pkcs8' | 'jwk' | 'raw' | 'raw-secret' | 'raw-public' | 'raw-seed' |
|---|---|---|---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | ✔ | ||||
'AES-CTR' | ✔ | ✔ | ✔ | ||||
'AES-GCM' | ✔ | ✔ | ✔ | ||||
'AES-KW' | ✔ | ✔ | ✔ | ||||
'AES-OCB'4 | ✔ | ✔ | |||||
'ChaCha20-Poly1305'4 | ✔ | ✔ | |||||
'ECDH' | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ECDSA' | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'Ed25519' | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'Ed448'5 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'HMAC' | ✔ | ✔ | ✔ | ||||
'KMAC128'4 | ✔ | ✔ | |||||
'KMAC256'4 | ✔ | ✔ | |||||
'ML-DSA-44'4 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ML-DSA-65'4 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ML-DSA-87'4 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ML-KEM-512'4 | ✔ | ✔ | ✔ | ✔ | |||
'ML-KEM-768'4 | ✔ | ✔ | ✔ | ✔ | |||
'ML-KEM-1024'4 | ✔ | ✔ | ✔ | ✔ | |||
'RSA-OAEP' | ✔ | ✔ | ✔ | ||||
'RSA-PSS' | ✔ | ✔ | ✔ | ||||
'RSASSA-PKCS1-v1_5' | ✔ | ✔ | ✔ |
subtle.getPublicKey(key, keyUsages): void稳定性:1.1 - 积极开发中
从给定的私钥派生公钥。
subtle.generateKey(algorithm, extractable, keyUsages): void<string>使用 algorithm 中提供的参数,此方法尝试生成新的密钥材料。根据使用的算法,生成单个 <CryptoKey> 或 {CryptoKeyPair}。
支持的 {CryptoKeyPair}(公钥和私钥)生成算法包括:
'ECDH''ECDSA''Ed25519''Ed448'5'ML-DSA-44'4'ML-DSA-65'4'ML-DSA-87'4'ML-KEM-512'4'ML-KEM-768'4'ML-KEM-1024'4'RSA-OAEP''RSA-PSS''RSASSA-PKCS1-v1_5''X25519''X448'5
支持的 <CryptoKey>(密钥)生成算法包括:
subtle.importKey
History
Importing ML-DSA and ML-KEM PKCS#8 keys without a seed is no longer supported.
KMAC algorithms are now supported.
ML-KEM algorithms are now supported.
ChaCha20-Poly1305 algorithm is now supported.
ML-DSA algorithms are now supported.
Added 'Ed25519', 'Ed448', 'X25519', and 'X448'algorithms.
Removed 'NODE-DSA' JWK import.
subtle.importKey(format, keyData, algorithm, extractable, keyUsages): void<string><ArrayBuffer>
|
<TypedArray>
|
<DataView>
|
<Object><string>此方法尝试将提供的 keyData 解释为给定的 format,以使用提供的 algorithm、extractable 和 keyUsages 参数创建 <CryptoKey> 实例。如果导入成功,返回的 Promise 将解决为密钥材料的 <CryptoKey> 表示。
如果导入 KDF 算法密钥,extractable 必须为 false。
目前支持的算法包括:
| 支持的密钥算法 | 'spki' | 'pkcs8' | 'jwk' | 'raw' | 'raw-secret' | 'raw-public' | 'raw-seed' |
|---|---|---|---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | ✔ | ||||
'AES-CTR' | ✔ | ✔ | ✔ | ||||
'AES-GCM' | ✔ | ✔ | ✔ | ||||
'AES-KW' | ✔ | ✔ | ✔ | ||||
'AES-OCB'4 | ✔ | ✔ | |||||
'Argon2d'4 | ✔ | ||||||
'Argon2i'4 | ✔ | ||||||
'Argon2id'4 | ✔ | ||||||
'ChaCha20-Poly1305'4 | ✔ | ✔ | |||||
'ECDH' | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ECDSA' | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'Ed25519' | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'Ed448'5 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'HDKF' | ✔ | ✔ | |||||
'HMAC' | ✔ | ✔ | ✔ | ||||
'KMAC128'4 | ✔ | ✔ | |||||
'KMAC256'4 | ✔ | ✔ | |||||
'ML-DSA-44'4 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ML-DSA-65'4 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ML-DSA-87'4 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'ML-KEM-512'4 | ✔ | ✔ | ✔ | ✔ | |||
'ML-KEM-768'4 | ✔ | ✔ | ✔ | ✔ | |||
'ML-KEM-1024'4 | ✔ | ✔ | ✔ | ✔ | |||
'PBKDF2' | ✔ | ✔ | |||||
'RSA-OAEP' | ✔ | ✔ | ✔ | ||||
'RSA-PSS' | ✔ | ✔ | ✔ | ||||
'RSASSA-PKCS1-v1_5' | ✔ | ✔ | ✔ | ||||
'X25519' | ✔ | ✔ | ✔ | ✔ | ✔ | ||
'X448'5 | ✔ | ✔ | ✔ | ✔ | ✔ |
subtle.sign(algorithm, key, data): void<string><CryptoKey><ArrayBuffer>
|
<TypedArray>
|
<DataView><Promise>
成功时兑现为
<ArrayBuffer>
。使用 algorithm 给出的方法和参数以及 key 提供的密钥材料,此方法尝试生成 data 的密码学签名。如果成功,返回的 Promise 将解决为一个包含生成签名的 <ArrayBuffer>。
目前支持的算法包括:
'ECDSA''Ed25519''Ed448'5'HMAC''KMAC128'4'KMAC256'4'ML-DSA-44'4'ML-DSA-65'4'ML-DSA-87'4'RSA-PSS''RSASSA-PKCS1-v1_5'
subtle.unwrapKey
History
AES-OCB algorithm is now supported.
ChaCha20-Poly1305 algorithm is now supported.
subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages): void在密码学中,“包装密钥”指的是导出然后加密密钥材料。此方法尝试解密包装的密钥并创建 <CryptoKey> 实例。它等效于先对加密的密钥数据调用 subtle.decrypt()(使用 wrappedKey、unwrapAlgo 和 unwrappingKey 参数作为输入),然后将结果传递给 subtle.importKey() 方法,使用 unwrappedKeyAlgo、extractable 和 keyUsages 参数作为输入。如果成功,返回的 Promise 将解决为 <CryptoKey> 对象。
目前支持的包装算法包括:
支持的解包密钥算法包括:
'AES-CBC''AES-CTR''AES-GCM''AES-KW''AES-OCB'4'ChaCha20-Poly1305'4'ECDH''ECDSA''Ed25519''Ed448'5'HMAC''KMAC128'5'KMAC256'5'ML-DSA-44'4'ML-DSA-65'4'ML-DSA-87'4'ML-KEM-512'4'ML-KEM-768'4'ML-KEM-1024'4v'RSA-OAEP''RSA-PSS''RSASSA-PKCS1-v1_5''X25519''X448'5
subtle.verify(algorithm, key, signature, data): void<string><CryptoKey><ArrayBuffer>
|
<TypedArray>
|
<DataView><ArrayBuffer>
|
<TypedArray>
|
<DataView>使用 algorithm 中给出的方法和参数以及 key 提供的密钥材料,此方法尝试验证 signature 是否是 data 的有效密码学签名。返回的 Promise 将解决为 true 或 false。
目前支持的算法包括:
'ECDSA''Ed25519''Ed448'5'HMAC''KMAC128'5'KMAC256'5'ML-DSA-44'4'ML-DSA-65'4'ML-DSA-87'4'RSA-PSS''RSASSA-PKCS1-v1_5'
subtle.wrapKey
History
AES-OCB algorithm is now supported.
ChaCha20-Poly1305 algorithm is now supported.
subtle.wrapKey(format, key, wrappingKey, wrapAlgo): void<string><CryptoKey><CryptoKey><string><Promise>
成功时兑现为
<ArrayBuffer>
。在密码学中,“包装密钥”指的是导出然后加密密钥材料。此方法将密钥材料导出为 format 标识的格式,然后使用 wrapAlgo 指定的方法和参数以及 wrappingKey 提供的密钥材料对其进行加密。它等效于使用 format 和 key 作为参数调用 subtle.exportKey(),然后将结果传递给 subtle.encrypt() 方法,使用 wrappingKey 和 wrapAlgo 作为输入。如果成功,返回的 Promise 将解决为一个包含加密密钥数据的 <ArrayBuffer>。
目前支持的包装算法包括:
算法参数对象定义了各种 <SubtleCrypto> 方法所使用的方法和参数。虽然此处描述为“类”,但它们是简单的 JavaScript 字典对象。
类:Algorithm
History
- 类型:
<string>
类:AeadParams
History
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>|<undefined>
额外的输入,不被加密但包含在数据的认证中。additionalData 的使用是可选的。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
对于使用给定密钥的每次加密操作,初始化向量必须是唯一的。
- 类型:
<string>必须是'AES-GCM'、'AES-OCB'或'ChaCha20-Poly1305'。
- 类型:
<number>生成的认证标签的位数大小。
类:AesDerivedKeyParams
History
- 类型:
<string>必须是'AES-CBC'、'AES-CTR'、'AES-GCM'、'AES-OCB'或'AES-KW'之一
- 类型:
<number>
要派生的 AES 密钥的长度。必须是 128、192 或 256。
类:AesCbcParams
History
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
提供初始化向量。其长度必须恰好为 16 字节,并且应该是不可预测且密码学随机的。
- 类型:
<string>必须是'AES-CBC'。
类:AesCtrParams
History
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
计数器块的初始值。其长度必须恰好为 16 字节。
AES-CTR 方法使用块的最右边 length 位作为计数器,其余位作为 nonce。
- 类型:
<number>aesCtrParams.counter中用作计数器的位数。
- 类型:
<string>必须是'AES-CTR'。
类:AesKeyAlgorithm
History
- 类型:
<number>
AES 密钥的长度(位)。
- 类型:
<string>
类:AesKeyGenParams
History
- 类型:
<number>
要生成的 AES 密钥的长度。必须是 128、192 或 256。
- 类型:
<string>必须是'AES-CBC'、'AES-CTR'、'AES-GCM'或'AES-KW'之一
类:Argon2Params
History
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
表示可选的关联数据。
- 类型:
<number>
表示内存大小(kibibytes)。必须至少是并行度的 8 倍。
- 类型:
<string>必须是'Argon2d'、'Argon2i'或'Argon2id'之一。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
表示 nonce,在密码哈希应用中作为盐。
- 类型:
<number>
表示并行度。
- 类型:
<number>
表示遍数。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
表示可选的秘密值。
- 类型:
<number>
表示 Argon2 版本号。默认且当前唯一定义的版本是 19 (0x13)。
类:ContextParams
History
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>|<undefined>
context 成员表示要与消息关联的可选上下文数据。
类:CShakeParams
History
Renamed cShakeParams.length to cShakeParams.outputLength.
- 类型:
<number>表示请求的输出长度(位)。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>|<undefined>
functionName 成员表示函数名称,由 NIST 用于定义基于 cSHAKE 的函数。
Node.js Web Crypto API 实现仅支持零长度的 functionName,这等价于根本不提供 functionName。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>|<undefined>
customization 成员表示自定义字符串。
Node.js Web Crypto API 实现仅支持零长度的 customization,这等价于根本不提供 customization。
类:EcdhKeyDeriveParams
History
- 类型:
<CryptoKey>
ECDH 密钥派生通过输入一方的私钥和另一方的公钥来操作——使用两者生成一个共同的共享秘密。
ecdhKeyDeriveParams.public 属性设置为另一方的公钥。
类:EcdsaParams
History
- 类型:
<string>
如果表示为 <string>,值必须是以下之一:
如果表示为 {Algorithm},对象的 name 属性必须是上述列出的值之一。
- 类型:
<string>必须是'ECDSA'。
类:EcKeyAlgorithm
History
- 类型:
<string>
- 类型:
<string>
类:EcKeyGenParams
History
- 类型:
<string>必须是'ECDSA'或'ECDH'之一。
- 类型:
<string>必须是'P-256'、'P-384'、'P-521'之一。
类:EcKeyImportParams
History
- 类型:
<string>必须是'ECDSA'或'ECDH'之一。
- 类型:
<string>必须是'P-256'、'P-384'、'P-521'之一。
类:EncapsulatedBits
History
用于消息加密的临时对称密钥(表示为 <ArrayBuffer>)以及由此共享密钥加密的密文(可以随消息一起传输给消息接收者)。接收者使用其私钥来确定共享密钥是什么,从而允许他们解密消息。
类:EncapsulatedKey
History
用于消息加密的临时对称密钥(表示为 <CryptoKey>)以及由此共享密钥加密的密文(可以随消息一起传输给消息接收者)。接收者使用其私钥来确定共享密钥是什么,从而允许他们解密消息。
- 类型:
<CryptoKey>
类:HkdfParams
History
- 类型:
<string>
如果表示为 <string>,值必须是以下之一:
如果表示为 {Algorithm},对象的 name 属性必须是上述列出的值之一。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
为 HKDF 算法提供特定于应用程序的上下文输入。 这可以是零长度,但必须提供。
- 类型:
<string>必须是'HKDF'。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
盐值显著提高了 HKDF 算法的强度。
它应该是随机或伪随机的,并且长度应与摘要函数的输出相同(例如,如果使用 'SHA-256' 作为摘要,盐应该是 256 位的随机数据)。
类:HmacImportParams
History
- 类型:
<string>
如果表示为 <string>,值必须是以下之一:
如果表示为 {Algorithm},对象的 name 属性必须是上述列出的值之一。
- 类型:
<number>
HMAC 密钥的可选位数。这是可选的,在大多数情况下应省略。
- 类型:
<string>必须是'HMAC'。
类:HmacKeyAlgorithm
History
- 类型:{Algorithm}
- 类型:
<number>
HMAC 密钥的长度(位)。
- 类型:
<string>
类:HmacKeyGenParams
History
- 类型:
<string>
如果表示为 <string>,值必须是以下之一:
如果表示为 {Algorithm},对象的 name 属性必须是上述列出的值之一。
- 类型:
<number>
要为 HMAC 密钥生成的位数。如果省略,长度将由使用的哈希算法确定。 这是可选的,在大多数情况下应省略。
- 类型:
<string>必须是'HMAC'。
类:KeyAlgorithm
History
- 类型:
<string>
类:KangarooTwelveParams
History
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>|<undefined>
KangarooTwelve 的可选自定义字符串。
- 类型:
<number>表示请求的输出长度(位)。
类:KmacImportParams
History
- 类型:
<number>
KMAC 密钥的可选位数。这是可选的,在大多数情况下应省略。
- 类型:
<string>必须是'KMAC128'或'KMAC256'。
类:KmacKeyAlgorithm
History
- 类型:
<number>
KMAC 密钥的长度(位)。
- 类型:
<string>
类:KmacKeyGenParams
History
- 类型:
<number>
要为 KMAC 密钥生成的位数。如果省略,长度将由使用的 KMAC 算法确定。 这是可选的,在大多数情况下应省略。
- 类型:
<string>必须是'KMAC128'或'KMAC256'。
类:KmacParams
History
Renamed kmacParams.length to kmacParams.outputLength.
- 类型:
<string>必须是'KMAC128'或'KMAC256'。
- 类型:
<number>
输出的长度(字节)。这必须是正整数。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>|<undefined>
customization 成员表示可选的自定义字符串。
类:Pbkdf2Params
History
- 类型:
<string>
如果表示为 <string>,值必须是以下之一:
如果表示为 {Algorithm},对象的 name 属性必须是上述列出的值之一。
- 类型:
<number>
PBKDF2 算法在派生位时应进行的迭代次数。
- 类型:
<string>必须是'PBKDF2'。
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
应至少为 16 个随机或伪随机字节。
类:RsaHashedImportParams
History
rsaHashedImportParams.hash
History
SHA-3 algorithms are now supported.
- 类型:
<string>
如果表示为 <string>,值必须是以下之一:
如果表示为 {Algorithm},对象的 name 属性必须是上述列出的值之一。
- 类型:
<string>必须是'RSASSA-PKCS1-v1_5'、'RSA-PSS'或'RSA-OAEP'之一。
类:RsaHashedKeyAlgorithm
History
- 类型:{Algorithm}
- 类型:
<number>
RSA 模数的长度(位)。
- 类型:
<string>
- 类型:
<Uint8Array>
RSA 公钥指数。
类:RsaHashedKeyGenParams
History
rsaHashedKeyGenParams.hash
History
SHA-3 algorithms are now supported.
- 类型:
<string>
如果表示为 <string>,值必须是以下之一:
如果表示为 {Algorithm},对象的 name 属性必须是上述列出的值之一。
- 类型:
<number>
RSA 模数的长度(位)。作为最佳实践,这应至少为 2048。
- 类型:
<string>必须是'RSASSA-PKCS1-v1_5'、'RSA-PSS'或'RSA-OAEP'之一。
- 类型:
<Uint8Array>
RSA 公钥指数。这必须是一个 <Uint8Array>,包含一个大端无符号整数,该整数必须适合 32 位。<Uint8Array> 可能包含任意数量的前导零位。该值必须是质数。除非有理由使用不同的值,否则使用 new Uint8Array([1, 0, 1]) (65537) 作为公钥指数。
类:RsaOaepParams
History
- 类型:
<ArrayBuffer>|<TypedArray>|<DataView>
额外的字节集合,不会被加密,但将绑定到生成的密文。
rsaOaepParams.label 参数是可选的。
- 类型:
<string>必须是'RSA-OAEP'。
类:RsaPssParams
History
- 类型:
<string>必须是'RSA-PSS'。
- 类型:
<number>
要使用的随机盐的长度(字节)。
类:TurboShakeParams
History
- 类型:
<number>|<undefined>
可选的域分离字节 (0x01-0x7f)。默认为 0x1f。
- 类型:
<number>表示请求的输出长度(位)。