On this page

Web Crypto API

稳定性:2 - 稳定

Node.js 提供了 Web Crypto API 标准的实现。

使用 globalThis.cryptorequire('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
  • '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 进行导入和导出。
  • 'RSA-OAEP''RSA-PSS''RSASSA-PKCS1-v1_5' 可以使用 'spki''pkcs8''jwk' 进行导入和导出。

类:Crypto

History

globalThis.cryptoCrypto 类的一个实例。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 实例,即不接受 Float32ArrayFloat64Array

如果给定的 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 是一个简单的字典对象,具有 publicKeyprivateKey 属性,表示非对称密钥对。

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", "encapsulateKey", "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
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
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() 生成原始密钥材料,然后使用 derivedKeyTypeextractablekeyUsages 参数作为输入,将结果传递给 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
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
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 中提供的参数,此方法尝试生成新的密钥材料。根据使用的算法,生成单个 CryptoKeyCryptoKeyPair

支持的 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(密钥)生成算法包括:

  • '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,以使用提供的 algorithmextractablekeyUsages 参数创建 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()(使用 wrappedKeyunwrapAlgorithmunwrappingKey 作为输入),然后使用 unwrappedKeyAlgorithmextractablekeyUsages 参数作为输入,将结果传递给 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
  • 'RSA-OAEP'
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'
  • 'X25519'
  • 'X448'5
subtle.verify(algorithm, key, signature, data): void
Attributes

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

目前支持的算法包括:

  • '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 提供的密钥材料对其进行加密。它等同于使用 formatkey 作为参数调用 subtle.exportKey(),然后将结果作为输入传递给 subtle.encrypt() 方法,使用 wrappingKeywrapAlgorithm 作为输入。如果成功,返回的 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 密钥的长度。必须是 128192256

类: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 密钥的长度。必须是 128192256

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 成员表示要与消息关联的可选上下文数据。

P

cShakeParams.name

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

cShakeParams.outputLength

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

functionName 成员表示 NIST 的函数名字节字符串,用于 将构建于 cSHAKE 之上的函数进行域分离。可接受的值为:

  • 空值或 undefined,在这种情况下 cSHAKE 等同于普通 SHAKE
  • ASCII 字节序列 'KMAC'
  • ASCII 字节序列 'TupleHash'
  • ASCII 字节序列 'ParallelHash'

如果你的目标是:

  1. 把这些占位符还原成真实术语/类名
  2. 翻译成完整中文
  3. 整理成可读的文档

我可以继续帮你做。
你只要回复我一句:

  • “帮我还原占位符”
  • “帮我整理成完整中文文档”
  • “帮我说明这段内容讲的是什么”

如果你愿意,我也可以直接根据上下文推断出这些条目对应的 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 密钥的可选位数。这是可选的,在大多数情况下应省略。

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 算法确定。 这是可选的,在大多数情况下应省略。

P

kmacKeyGenParams.name

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

kmacParams.algorithm

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

kmacParams.outputLength

History
  • 类型:number 表示请求的输出长度(位)。
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

  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

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