On this page

Web Crypto API

稳定性: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('我爱纸杯蛋糕');

  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
  • 'MLKEM768-P256'3
  • 'MLKEM768-X25519'3
  • 'MLKEM1024-P384'3
  • 'SHA3-256'
  • 'SHA3-384'
  • 'SHA3-512'
  • 'TurboSHAKE128'
  • 'TurboSHAKE256'

密钥格式:

  • 'raw-public'
  • 'raw-secret'
  • 'raw-seed'

方法:

稳定性: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(12));
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.importKey() 和 subtle.exportKey() 所支持的格式。

  • 'AES-CBC'、'AES-CTR'、'AES-GCM'、'AES-KW' 和 'HMAC' 可以使用 'jwk'、'raw' 和 'raw-secret'4 导入和导出。
  • 'AES-OCB'4、'ChaCha20-Poly1305'4、 'KMAC128'4 和 'KMAC256'4 可以使用 'jwk' 和 'raw-secret'4 导入和导出。
  • 'Argon2d'4、'Argon2i'4 和 'Argon2id'4 可以使用 'raw-secret'4 导入;不支持导出。
  • 'ECDH'、'ECDSA'、'Ed25519'、'Ed448'5、'X25519' 和 'X448'5 可以使用 'spki'、 'pkcs8'、'jwk'、'raw' 和 'raw-public'4 导入和导出。
  • 'HKDF' 和 'PBKDF2' 可以使用 'raw' 和 'raw-secret'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 可以使用 'spki'、'pkcs8'、'jwk'、 'raw-public'4 和 'raw-seed'4 导入和导出。
  • 'MLKEM768-P256'4、 'MLKEM768-X25519'4 和 'MLKEM1024-P384'4 可以使用 'jwk'、'raw-public'4 和 'raw-seed'4 导入和导出。
  • 'RSA-OAEP'、'RSA-PSS' 和 'RSASSA-PKCS1-v1_5' 可以使用 'spki'、'pkcs8' 和 'jwk' 导入和导出。

类:Crypto

History

globalThis.crypto 是 Crypto 类的一个实例。Crypto 是一个单例,提供对其余 crypto API 的访问。

P

crypto.subtle

History

提供对 SubtleCrypto API 的访问。

M

crypto.getRandomValues

History
crypto.getRandomValues(typedArray): void
Attributes
typedArray:Buffer | TypedArray

生成密码学安全的随机值。给定的 typedArray 将被填充随机值,并返回对 typedArray 的引用。

给定的 typedArray 必须是基于整数的 TypedArray 实例,即不接受 Float32Array 和 Float64Array。

如果给定的 typedArray 大于 65,536 字节,将抛出错误。

M

crypto.randomUUID

History
crypto.randomUUID(): void

生成一个随机的 RFC 4122 版本 4 UUID。UUID 是使用密码学伪随机数生成器生成的。

类:CryptoKey

History
P

cryptoKey.algorithm

History

一个对象,详细说明密钥可用于哪种算法以及额外的算法特定参数。

只读。

P

cryptoKey.extractable

History

当为 true 时,CryptoKey 可以使用 subtle.exportKey() 或 subtle.wrapKey() 导出。

只读。

P

cryptoKey.type

History
  • 类型:string 'secret'、'private' 或 'public' 之一。

一个字符串,标识密钥是对称('secret')还是非对称('private' 或 'public')密钥。

P

cryptoKey.usages

History

一个字符串数组,标识密钥可用于哪些操作。

可能的用途包括:

有效的密钥用途取决于密钥算法(由 cryptokey.algorithm.name 标识)。请参阅 [Crypto 操作 API][],了解每种密钥算法支持的操作。

类:CryptoKeyPair

History

CryptoKeyPair 是一个简单的字典对象,具有 publicKey 和 privateKey 属性,表示非对称密钥对。

P

cryptoKeyPair.privateKey

History
P

cryptoKeyPair.publicKey

History

类:SubtleCrypto

History

稳定性:1.1 - 积极开发中

Attributes
operation:string
"encrypt"、"decrypt"、"sign"、"verify"、"digest"、"generateKey"、"deriveKey"、"deriveBits"、"importKey"、"exportKey"、"getPublicKey"、"wrapKey"、"unwrapKey"、"encapsulateBits" 或 "decapsulateBits" 或 "decapsulateKey"
algorithm:string | Algorithm
lengthOrAdditionalAlgorithm:null | number | string | Algorithm | undefined
取决于操作,这要么被忽略,要么是操作为 "deriveBits" 时的 length 参数值,要么是操作为 "deriveKey" 时要派生的密钥的算法,要么是操作为 "wrapKey" 时在包装前要导出的密钥的算法,要么是操作为 "unwrapKey" 时在解包后要导入的密钥的算法,要么是操作为 "encapsulateKey" 或 "decapsulateKey" 时在封装或解封装密钥后要导入的密钥的算法。 默认值: 当操作为 "deriveBits" 时为 null ,否则为 undefined 。

允许在 Web Crypto API 中进行功能检测, 可用于检测给定的算法标识符 (包括其参数)是否支持给定的操作。

参见 [检查运行时算法支持][] 以了解此方法的示例用法。

M

subtle.decapsulateBits

History
subtle.decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext): void

稳定性:1.1 - 积极开发中

Attributes
decapsulationAlgorithm:string | Algorithm
decapsulationKey:CryptoKey

消息接收者使用他们的非对称私钥解密“封装密钥”(密文),从而恢复一个临时对称密钥(表示为 ArrayBuffer),然后用于解密消息。

目前支持的算法包括:

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4
  • 'MLKEM768-P256'4
  • 'MLKEM768-X25519'4
  • 'MLKEM1024-P384'4
M

subtle.decapsulateKey

History
subtle.decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, keyUsages): void

稳定性:1.1 - 积极开发中

Attributes
decapsulationAlgorithm:string | Algorithm
decapsulationKey:CryptoKey
extractable:boolean
keyUsages:string[]
参见 [密钥用途][]。

消息接收者使用他们的非对称私钥解密“封装密钥”(密文),从而恢复一个临时对称密钥(表示为 CryptoKey),然后用于解密消息。

目前支持的算法包括:

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4
  • 'MLKEM768-P256'4
  • 'MLKEM768-X25519'4
  • 'MLKEM1024-P384'4
subtle.decrypt(algorithm, key, data): void
Attributes

使用 algorithm 中指定的方法和参数以及 key 提供的密钥材料,此方法尝试解密提供的 data。如果成功,返回的 Promise 将解决为一个包含明文结果的 ArrayBuffer。

目前支持的算法包括:

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'
subtle.deriveBits(algorithm, baseKey, length?): void
Attributes
baseKey:CryptoKey
length:number | null
默认值: null

使用 algorithm 中指定的方法和参数以及 baseKey 提供的密钥材料,此方法尝试生成 length 位。

当未提供 length 或为 null 时,将生成给定算法的最大位数。这对于 'ECDH'、'X25519' 和 'X448'5 算法是允许的,对于其他算法,length 必须是一个数字。

如果成功,返回的 Promise 将解决为一个包含生成数据的 ArrayBuffer。

目前支持的算法包括:

  • 'Argon2d'4
  • 'Argon2i'4
  • 'Argon2id'4
  • 'ECDH'
  • 'HKDF'
  • 'PBKDF2'
  • 'X25519'
  • 'X448'5
subtle.deriveKey(algorithm, baseKey, derivedKeyType, extractable, keyUsages): void
Attributes
baseKey:CryptoKey
extractable:boolean
keyUsages:string[]
参见 [密钥用途][]。

使用 algorithm 中指定的方法和参数,以及 baseKey 提供的密钥材料,此方法尝试基于 derivedKeyType 中的方法和参数生成一个新的 CryptoKey。

调用此方法等同于先调用 subtle.deriveBits() 生成原始密钥材料,然后使用 derivedKeyType、extractable 和 keyUsages 参数作为输入,将结果传递给 subtle.importKey() 方法。

目前支持的算法包括:

  • 'Argon2d'4
  • 'Argon2i'4
  • 'Argon2id'4
  • 'ECDH'
  • 'HKDF'
  • 'PBKDF2'
  • 'X25519'
  • 'X448'5
subtle.digest(algorithm, data): void
Attributes

使用 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 属性,其值为上述之一。

M

subtle.encapsulateBits

History
subtle.encapsulateBits(encapsulationAlgorithm, encapsulationKey): void

稳定性:1.1 - 积极开发中

Attributes
encapsulationAlgorithm:string | Algorithm
encapsulationKey:CryptoKey

使用消息接收者的非对称公钥加密临时对称密钥。此加密密钥是表示为 EncapsulatedBits 的“封装密钥”。

目前支持的算法包括:

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4
  • 'MLKEM768-P256'4
  • 'MLKEM768-X25519'4
  • 'MLKEM1024-P384'4
M

subtle.encapsulateKey

History
subtle.encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, keyUsages): void

稳定性:1.1 - 积极开发中

Attributes
encapsulationAlgorithm:string | Algorithm
encapsulationKey:CryptoKey
extractable:boolean
keyUsages:string[]
参见 [密钥用途][]。

使用消息接收者的非对称公钥加密临时对称密钥。此加密密钥是表示为 EncapsulatedKey 的“封装密钥”。

目前支持的算法包括:

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4
  • 'MLKEM768-P256'4
  • 'MLKEM768-X25519'4
  • 'MLKEM1024-P384'4
subtle.encrypt(algorithm, key, data): void
Attributes

使用 algorithm 指定的方法和参数以及 key 提供的密钥材料,此方法尝试加密 data。如果成功,返回的 Promise 将解决为一个包含加密结果的 ArrayBuffer。

目前支持的算法包括:

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'
subtle.exportKey(format, key): void
Attributes
format:string
必须是 'raw' 、 'pkcs8' 、 'spki' 、 'jwk' 、 'raw-secret' 1 、 'raw-public' 1 或 'raw-seed' 1 之一。

将给定的密钥导出为指定的格式(如果支持)。

如果 CryptoKey 不可导出,返回的 Promise 将被拒绝。

当 format 为 'pkcs8' 或 'spki' 且导出成功时,返回的 Promise 将解决为一个包含导出密钥数据的 ArrayBuffer。

当 format 为 'jwk' 且导出成功时,返回的 Promise 将解决为一个符合 [JSON Web 密钥][] 规范的 JavaScript 对象。

请参阅[密钥格式][],了解每种算法支持的格式。

M

subtle.getPublicKey

History
subtle.getPublicKey(key, keyUsages): void

稳定性:1.1 - 积极开发中

Attributes
一个用于派生相应公钥的私钥。
keyUsages:string[]
参见 [密钥用途][]。

从给定的私钥派生公钥。

subtle.generateKey(algorithm, extractable, keyUsages): void
Attributes
Attributes
extractable:boolean
keyUsages: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
  • 'MLKEM768-P256'4
  • 'MLKEM768-X25519'4
  • 'MLKEM1024-P384'4
  • 'RSA-OAEP'
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'
  • 'X25519'
  • 'X448'5

支持的 CryptoKey(密钥)生成算法包括:

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'HMAC'
  • 'KMAC128'4
  • 'KMAC256'4
subtle.importKey(format, keyData, algorithm, extractable, keyUsages): void
Attributes
format:string
必须是 'raw' 、 'pkcs8' 、 'spki' 、 'jwk' 、 'raw-secret' 1 、 'raw-public' 1 或 'raw-seed' 1 之一。
Attributes
Attributes
extractable:boolean
keyUsages:string[]
参见 [密钥用途][]。

此方法尝试将提供的 keyData 解释为给定的 format,以使用提供的 algorithm、extractable 和 keyUsages 参数创建 CryptoKey 实例。如果导入成功,返回的 Promise 将解决为密钥材料的 CryptoKey 表示。

如果导入 KDF 算法密钥,extractable 必须为 false。

请参阅[密钥格式][],了解当前支持的算法和格式。

subtle.sign(algorithm, key, data): void
Attributes

使用 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(format, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages): void
Attributes
format:string
必须是 'raw' 、 'pkcs8' 、 'spki' 、 'jwk' 、 'raw-secret' 1 、 'raw-public' 1 或 'raw-seed' 1 之一。
unwrappingKey:CryptoKey
Attributes
Attributes
extractable:boolean
keyUsages:string[]
参见 [密钥用途][]。

在密码学中,“包装密钥”指的是导出然后加密密钥材料。此方法尝试解密一个已包装的密钥并创建一个 CryptoKey 实例。它等同于先对加密的密钥数据调用 subtle.decrypt()(使用 wrappedKey、unwrapAlgorithm 和 unwrappingKey 作为输入),然后使用 unwrappedKeyAlgorithm、extractable 和 keyUsages 参数作为输入,将结果传递给 subtle.importKey() 方法。如果成功,返回的 Promise 将以一个 CryptoKey 对象兑现。

目前支持的包装算法包括:

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'

支持的解包密钥算法包括:

  • '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
  • 'MLKEM768-P256'4
  • 'MLKEM768-X25519'4
  • 'MLKEM1024-P384'4
  • 'RSA-OAEP'
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'
  • 'X25519'
  • 'X448'5
subtle.verify(algorithm, key, signature, data): void
Attributes

使用 algorithm 中给出的方法和参数以及 key 提供的密钥材料,此方法尝试验证 signature 是否是 data 的有效密码学签名。返回的 Promise 将解决为 true 或 false。

目前支持的算法包括:

  • '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.wrapKey(format, key, wrappingKey, wrapAlgorithm): void
Attributes
format:string
必须是 'raw' 、 'pkcs8' 、 'spki' 、 'jwk' 、 'raw-secret' 1 、 'raw-public' 1 或 'raw-seed' 1 之一。
wrappingKey:CryptoKey

在密码学中,“包装密钥”指的是导出然后加密密钥材料。此方法会将密钥材料导出为 format 标识的格式,然后使用 wrapAlgorithm 指定的方法和参数以及 wrappingKey 提供的密钥材料对其进行加密。它等同于使用 format 和 key 作为参数调用 subtle.exportKey(),然后将结果作为输入传递给 subtle.encrypt() 方法,使用 wrappingKey 和 wrapAlgorithm 作为输入。如果成功,返回的 Promise 将以一个包含加密密钥数据的 ArrayBuffer 兑现。

目前支持的包装算法包括:

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'

算法参数对象定义了各种 SubtleCrypto 方法所使用的方法和参数。虽然此处描述为“类”,但它们是简单的 JavaScript 字典对象。

类:Algorithm

History
P

Algorithm.name

History

类:AeadParams

History
P

aeadParams.additionalData

History

额外的输入,不被加密但包含在数据的认证中。additionalData 的使用是可选的。

P

aeadParams.iv

History

对于使用给定密钥的每次加密操作,初始化向量必须是唯一的。

P

aeadParams.name

History
  • 类型:string 必须是 'AES-GCM'、'AES-OCB' 或 'ChaCha20-Poly1305'。
P

aeadParams.tagLength

History
  • 类型:number 生成的认证标签的位数大小。

类:AesDerivedKeyParams

History
P

aesDerivedKeyParams.name

History
  • 类型:string 必须是 'AES-CBC'、'AES-CTR'、'AES-GCM'、'AES-OCB' 或 'AES-KW' 之一
P

aesDerivedKeyParams.length

History

要派生的 AES 密钥的长度。必须是 128、192 或 256。

类:AesCbcParams

History
P

aesCbcParams.iv

History

提供初始化向量。其长度必须恰好为 16 字节,并且应该是不可预测且密码学随机的。

P

aesCbcParams.name

History
  • 类型:string 必须是 'AES-CBC'。

类:AesCtrParams

History
P

aesCtrParams.counter

History

计数器块的初始值。其长度必须恰好为 16 字节。

AES-CTR 方法使用块的最右边 length 位作为计数器,其余位作为 nonce。

P

aesCtrParams.length

History
  • 类型:number aesCtrParams.counter 中用作计数器的位数。
P

aesCtrParams.name

History
  • 类型:string 必须是 'AES-CTR'。

类:AesKeyAlgorithm

History
P

aesKeyAlgorithm.length

History

AES 密钥的长度(位)。

P

aesKeyAlgorithm.name

History

类:AesKeyGenParams

History
P

aesKeyGenParams.length

History

要生成的 AES 密钥的长度。必须是 128、192 或 256。

P

aesKeyGenParams.name

History
  • 类型:string 必须是 'AES-CBC'、'AES-CTR'、'AES-GCM' 或 'AES-KW' 之一

类:Argon2Params

History
P

argon2Params.associatedData

History

表示可选的关联数据。

P

argon2Params.memory

History

表示内存大小(kibibytes)。必须至少是并行度的 8 倍。

P

argon2Params.name

History
  • 类型:string 必须是 'Argon2d'、'Argon2i' 或 'Argon2id' 之一。
P

argon2Params.nonce

History

表示 nonce,在密码哈希应用中作为盐。

P

argon2Params.parallelism

History

表示并行度。

P

argon2Params.passes

History

表示遍数。

P

argon2Params.secretValue

History

表示可选的秘密值。

P

argon2Params.version

History

表示 Argon2 版本号。默认且当前唯一定义的版本是 19 (0x13)。

类:ContextParams

History
P

contextParams.name

History
  • 类型:string 必须是 'Ed448'5、'ML-DSA-44'4、 'ML-DSA-65'4、或 'ML-DSA-87'4。
P

context

History

context 成员表示要与消息关联的可选上下文数据。

当 functionName 和 customization 均为空或为 undefined 时,cSHAKE 等同于普通 SHAKE。

P

cShakeParams.name

History
  • 类型:string 必须是 'cSHAKE128'4 或 'cSHAKE256'4。
P

cShakeParams.outputLength

History
  • 类型:number 表示请求的输出长度(位)。必须是 8 的倍数。

functionName 成员表示用于对基于 cSHAKE 构建的函数进行域分离的 NIST 函数名称字节字符串。非空值需要 OpenSSL 4.0 或更高版本。接受的值包括:

  • 空值或 undefined
  • ASCII 字节序列 'KMAC'
  • ASCII 字节序列 'TupleHash'
  • ASCII 字节序列 'ParallelHash'

如果你的目标是:

customization 成员表示自定义数据。非空值需要 OpenSSL 4.0 或更高版本。接受的值包括:

  • 空值或 undefined
  • 最多 512 字节且不包含空字节的数据
  • “帮我还原占位符”
  • “帮我整理成完整中文文档”
  • “帮我说明这段内容讲的是什么”

如果你愿意,我也可以直接根据上下文推断出这些条目对应的 Node.js Crypto API 名称并补全。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

如果表示为 Algorithm,对象的 name 属性必须是上述列出的值之一。

P

hmacKeyGenParams.length

History

要为 HMAC 密钥生成的位数。如果省略,长度将由所用的哈希算法确定。 这是可选的,在大多数情况下应省略。

P

hmacKeyGenParams.name

History
  • 类型:string 必须是 'HMAC'。

类:KeyAlgorithm

History
P

keyAlgorithm.name

History

类:KangarooTwelveParams

History

KangarooTwelve 的可选自定义字符串。不得超过 512 字节。

P

kangarooTwelveParams.name

History
  • 类型:string 必须是 'KT128'4 或 'KT256'4。
P

kangarooTwelveParams.outputLength

History
  • 类型:number 表示请求的输出长度(位)。

类:KmacImportParams

History
P

kmacImportParams.length

History

KMAC 密钥中的可选位数。此项为可选,在大多数情况下应省略。密钥长度必须至少为 32 位,且必须是 8 的倍数。

P

kmacImportParams.name

History
  • 类型:string 必须是 'KMAC128' 或 'KMAC256'。

类:KmacKeyAlgorithm

History
P

kmacKeyAlgorithm.length

History

KMAC 密钥的长度(位)。

P

kmacKeyAlgorithm.name

History

类:KmacKeyGenParams

History
P

kmacKeyGenParams.length

History

要为 KMAC 密钥生成的位数。如果省略,长度将由所用的 KMAC 算法确定。 这是可选的,在大多数情况下应省略。必须至少为 32 位,且必须是 8 的倍数。

P

kmacKeyGenParams.name

History
  • 类型:string 必须是 'KMAC128' 或 'KMAC256'。
P

kmacParams.algorithm

History
  • 类型:string 必须是 'KMAC128' 或 'KMAC256'。
P

kmacParams.outputLength

History
  • 类型:number 表示请求的输出长度(位)。必须是 8 的倍数。
P

kmacParams.customization

History

customization 成员表示可选的自定义字符串。

类:Pbkdf2Params

History

如果表示为 string,值必须是以下之一:

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

如果表示为 Algorithm,对象的 name 属性必须是上述列出的值之一。

P

pbkdf2Params.iterations

History

PBKDF2 算法在派生位时应进行的迭代次数。

P

pbkdf2Params.name

History
  • 类型:string 必须是 'PBKDF2'。
P

pbkdf2Params.salt

History

应至少为 16 个随机或伪随机字节。

类:RsaHashedImportParams

History

如果表示为 string,值必须是以下之一:

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

如果表示为 Algorithm,对象的 name 属性必须是上述列出的值之一。

P

rsaHashedImportParams.name

History
  • 类型:string 必须是 'RSASSA-PKCS1-v1_5'、'RSA-PSS' 或 'RSA-OAEP' 之一。

类:RsaHashedKeyAlgorithm

History
P

rsaHashedKeyAlgorithm.hash

History
P

rsaHashedKeyAlgorithm.modulusLength

History

RSA 模数的长度(位)。

P

rsaHashedKeyAlgorithm.name

History
P

rsaHashedKeyAlgorithm.publicExponent

History

RSA 公钥指数。

类:RsaHashedKeyGenParams

History

如果表示为 string,值必须是以下之一:

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

如果表示为 Algorithm,对象的 name 属性必须是上述列出的值之一。

P

rsaHashedKeyGenParams.modulusLength

History

RSA 模数的长度(位)。作为最佳实践,这应至少为 2048。

P

rsaHashedKeyGenParams.name

History
  • 类型:string 必须是 'RSASSA-PKCS1-v1_5'、'RSA-PSS' 或 'RSA-OAEP' 之一。
P

rsaHashedKeyGenParams.publicExponent

History

RSA 公钥指数。这必须是一个 Uint8Array,包含一个大端无符号整数,该整数必须适合 32 位。Uint8Array 可能包含任意数量的前导零位。该值必须是质数。除非有理由使用不同的值,否则使用 new Uint8Array([1, 0, 1]) (65537) 作为公钥指数。

类:RsaOaepParams

History
P

rsaOaepParams.label

History

额外的字节集合,不会被加密,但将绑定到生成的密文。

rsaOaepParams.label 参数是可选的。

P

rsaOaepParams.name

History
  • 类型:string 必须是 'RSA-OAEP'。

类:RsaPssParams

History
P

rsaPssParams.name

History
  • 类型:string 必须是 'RSA-PSS'。
P

rsaPssParams.saltLength

History

要使用的随机盐的长度(字节)。

类:TurboShakeParams

History
P

turboShakeParams.domainSeparation

History

可选的域分离字节 (0x01-0x7f)。默认为 0x1f。

P

turboShakeParams.name

History
  • 类型:string 必须是 'TurboSHAKE128'4 或 'TurboSHAKE256'4。
P

turboShakeParams.outputLength

History
  • 类型:number 表示请求的输出长度(位)。

Footnotes

  1. 需要 OpenSSL >= 3.0 ↩ ↩2 ↩3

  2. 需要 OpenSSL >= 3.2 ↩ ↩2 ↩3

  3. 需要 OpenSSL >= 3.5 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  4. 参见 [Web Cryptography API 中的现代算法][] ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51 ↩52 ↩53 ↩54 ↩55 ↩56 ↩57 ↩58 ↩59 ↩60 ↩61 ↩62 ↩63 ↩64 ↩65 ↩66 ↩67 ↩68 ↩69 ↩70 ↩71 ↩72 ↩73 ↩74 ↩75 ↩76 ↩77 ↩78 ↩79 ↩80 ↩81 ↩82 ↩83 ↩84 ↩85 ↩86 ↩87 ↩88 ↩89 ↩90 ↩91 ↩92 ↩93 ↩94 ↩95 ↩96 ↩97 ↩98 ↩99 ↩100 ↩101 ↩102 ↩103 ↩104 ↩105 ↩106 ↩107 ↩108 ↩109 ↩110 ↩111 ↩112 ↩113 ↩114 ↩115 ↩116 ↩117 ↩118 ↩119 ↩120 ↩121 ↩122 ↩123 ↩124 ↩125 ↩126 ↩127 ↩128 ↩129 ↩130 ↩131 ↩132 ↩133 ↩134 ↩135 ↩136 ↩137 ↩138 ↩139 ↩140 ↩141 ↩142 ↩143 ↩144 ↩145 ↩146 ↩147 ↩148 ↩149 ↩150 ↩151 ↩152 ↩153 ↩154 ↩155 ↩156 ↩157 ↩158 ↩159 ↩160 ↩161 ↩162 ↩163

  5. 参见 Web Cryptography API 中的安全曲线 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16