Spec-Zone.ru › Node.js 22 LTS

Web Crypto API

История
Версия Изменения
v22.13.0

Алгоритмы Ed25519 и X25519 теперь имеют стабильный статус.

v19.0.0

Больше не является экспериментальным, за исключением алгоритмов Ed25519, Ed448, X25519 и X448.

v20.0.0, v18.17.0

Аргументы теперь приводятся к нужному типу и проверяются в соответствии с их определениями WebIDL, как и в других реализациях Web Crypto API.

v18.4.0, v16.17.0

Удален проприетарный формат импорта/экспорта 'node.keyObject'.

v18.4.0, v16.17.0

Удалены проприетарные алгоритмы 'NODE-DSA', 'NODE-DH' и 'NODE-SCRYPT'.

v18.4.0, v16.17.0

Добавлены алгоритмы 'Ed25519', 'Ed448', 'X25519' и 'X448'.

v18.4.0, v16.17.0

Удалены проприетарные алгоритмы 'NODE-ED25519' и 'NODE-ED448'.

v18.4.0, v16.17.0

Из алгоритма '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);

})(); copy

Примеры

Создание ключей

Класс <SubtleCrypto> можно использовать для создания симметричных (секретных) ключей или асимметричных пар ключей (открытого и закрытого ключей).

Ключи AES
const { subtle } = globalThis.crypto;

async function generateAesKey(length = 256) {
  const key = await subtle.generateKey({
    name: 'AES-CBC',
    length,
  }, true, ['encrypt', 'decrypt']);

  return key;
} copy
Пары ключей ECDSA
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 };
} copy
Пары ключей Ed25519/X25519
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']);
} copy
Ключи HMAC
const { subtle } = globalThis.crypto;

async function generateHmacKey(hash = 'SHA-256') {
  const key = await subtle.generateKey({
    name: 'HMAC',
    hash,
  }, true, ['sign', 'verify']);

  return key;
} copy
Пары ключей RSA
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 };
} copy

Шифрование и расшифрование

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);
} copy

Экспорт и импорт ключей

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;
} copy

Упаковка и распаковка ключей

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;
} copy

Подписание и проверка

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;
} copy

Получение битов и ключей

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;
} copy

Хеширование

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;
} copy

Матрица алгоритмов

В таблице подробно описаны алгоритмы, поддерживаемые реализацией Web Crypto API в Node.js, и поддерживаемые для каждого из них API:

Алгоритм generateKey exportKey importKey encrypt decrypt wrapKey unwrapKey deriveBits deriveKey sign verify digest
'RSASSA-PKCS1-v1_5' ✔ ✔ ✔ ✔ ✔
'RSA-PSS' ✔ ✔ ✔ ✔ ✔
'RSA-OAEP' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'ECDSA' ✔ ✔ ✔ ✔ ✔
'Ed25519' ✔ ✔ ✔ ✔ ✔
'Ed448' 1 ✔ ✔ ✔ ✔ ✔
'ECDH' ✔ ✔ ✔ ✔ ✔
'X25519' ✔ ✔ ✔ ✔ ✔
'X448' 1 ✔ ✔ ✔ ✔ ✔
'AES-CTR' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'AES-CBC' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'AES-GCM' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'AES-KW' ✔ ✔ ✔ ✔ ✔
'HMAC' ✔ ✔ ✔ ✔ ✔
'HKDF' ✔ ✔ ✔ ✔
'PBKDF2' ✔ ✔ ✔ ✔
'SHA-1' ✔
'SHA-256' ✔
'SHA-384' ✔
'SHA-512' ✔

Класс: Crypto

Добавлено в: v15.0.0

globalThis.crypto — это экземпляр класса Crypto. Crypto — это singleton, предоставляющий доступ к остальной части криптографического API.

crypto.subtle

Добавлено в: v15.0.0
  • Тип: <SubtleCrypto>

Предоставляет доступ к API SubtleCrypto.

crypto.getRandomValues(typedArray)

Добавлено в: v15.0.0
  • typedArray <Buffer> | <TypedArray>
  • Возвращает: <Buffer> | <TypedArray>

Генерирует криптографически стойкие случайные значения. Указанный typedArray заполняется случайными значениями, после чего возвращается ссылка на typedArray.

Указанный typedArray должен быть экземпляром целочисленного типа <TypedArray>, то есть Float32Array и Float64Array не принимаются.

Если размер указанного typedArray превышает 65 536 байт, будет выброшена ошибка.

crypto.randomUUID()

Добавлено в: v16.7.0
  • Возвращает: <string>

Генерирует случайный UUID версии 4 согласно RFC 4122. UUID генерируется с помощью криптографического генератора псевдослучайных чисел.

Класс: CryptoKey

Добавлено в: v15.0.0

cryptoKey.algorithm

Добавлено в: v15.0.0
  • Тип: <KeyAlgorithm> | <RsaHashedKeyAlgorithm> | <EcKeyAlgorithm> | <AesKeyAlgorithm> | <HmacKeyAlgorithm>

Объект, описывающий алгоритм, для которого можно использовать ключ, а также дополнительные параметры, специфичные для алгоритма.

Только для чтения.

cryptoKey.extractable

Добавлено в: v15.0.0
  • Тип: <boolean>

Если значение true, <CryptoKey> можно извлечь с помощью subtleCrypto.exportKey() или subtleCrypto.wrapKey().

Только для чтения.

cryptoKey.type

Добавлено в: v15.0.0
  • Тип: <string> Одно из значений: 'secret', 'private' или 'public'.

Строка, указывающая, является ли ключ симметричным ('secret') или асимметричным ('private' или 'public').

cryptoKey.usages

Добавлено в: v15.0.0
  • Тип: <string[]>

Массив строк, указывающих операции, для которых можно использовать ключ.

Возможные варианты использования:

  • 'encrypt' — ключ можно использовать для шифрования данных.
  • 'decrypt' — ключ можно использовать для расшифрования данных.
  • 'sign' — ключ можно использовать для создания цифровых подписей.
  • 'verify' — ключ можно использовать для проверки цифровых подписей.
  • 'deriveKey' — ключ можно использовать для получения нового ключа.
  • 'deriveBits' — ключ можно использовать для получения битов.
  • 'wrapKey' — ключ можно использовать для упаковки другого ключа.
  • 'unwrapKey' — ключ можно использовать для распаковки другого ключа.

Допустимые варианты использования ключа зависят от алгоритма ключа (определяемого с помощью cryptokey.algorithm.name).

Поддерживаемый алгоритм ключа 'encrypt' 'decrypt' 'sign' 'verify' 'deriveKey' 'deriveBits' 'wrapKey' 'unwrapKey'
'AES-CBC' ✔ ✔ ✔ ✔
'AES-CTR' ✔ ✔ ✔ ✔
'AES-GCM' ✔ ✔ ✔ ✔
'AES-KW' ✔ ✔
'ECDH' ✔ ✔
'X25519' ✔ ✔
'X448' 1 ✔ ✔
'ECDSA' ✔ ✔
'Ed25519' ✔ ✔
'Ed448' 1 ✔ ✔
'HDKF' ✔ ✔
'HMAC' ✔ ✔
'PBKDF2' ✔ ✔
'RSA-OAEP' ✔ ✔ ✔ ✔
'RSA-PSS' ✔ ✔
'RSASSA-PKCS1-v1_5' ✔ ✔

Класс: CryptoKeyPair

Добавлено в: v15.0.0

CryptoKeyPair — это простой объект-словарь со свойствами publicKey и privateKey, представляющий асимметричную пару ключей.

cryptoKeyPair.privateKey

Добавлено в: v15.0.0
  • Тип: <CryptoKey> Объект <CryptoKey>, значение type которого будет 'private'.

cryptoKeyPair.publicKey

Добавлено в: v15.0.0
  • Тип: <CryptoKey> Объект <CryptoKey>, значение type которого будет 'public'.

Класс: SubtleCrypto

Добавлено в: v15.0.0

subtle.decrypt(algorithm, key, data)

Добавлено в: v15.0.0
  • algorithm <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams>
  • key <CryptoKey>
  • data <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.

Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный key, subtle.decrypt() пытается расшифровать предоставленный data. В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим результат в открытом виде.

В настоящее время поддерживаются следующие алгоритмы:

  • 'RSA-OAEP'
  • 'AES-CTR'
  • 'AES-CBC'
  • 'AES-GCM'

subtle.deriveBits(algorithm, baseKey[, length])

История
Версия Изменения
v22.5.0

Параметр длины теперь необязателен для 'ECDH', 'X25519' и 'X448'.

v18.4.0, v16.17.0

Добавлены алгоритмы 'X25519' и 'X448'.

v15.0.0

Добавлено в: v15.0.0

  • algorithm <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params>
  • baseKey <CryptoKey>
  • length <number> | <null> По умолчанию: null
  • Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.

Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный baseKey, subtle.deriveBits() пытается сгенерировать length бит.

Если length не задан или null, генерируется максимально возможное для данного алгоритма число бит. Это допустимо для алгоритмов 'ECDH', 'X25519' и 'X448'; для остальных алгоритмов length должен быть числом.

В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим сгенерированные данные.

В настоящее время поддерживаются следующие алгоритмы:

  • 'ECDH'
  • 'X25519'
  • 'X448' 1
  • 'HKDF'
  • 'PBKDF2'

subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)

История
Версия Изменения
v18.4.0, v16.17.0

Добавлены алгоритмы 'X25519' и 'X448'.

v15.0.0

Добавлено в: v15.0.0

  • algorithm <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params>
  • baseKey <CryptoKey>
  • derivedKeyAlgorithm <string> | <Algorithm> | <HmacImportParams> | <AesDerivedKeyParams>
  • extractable <boolean>
  • keyUsages <string[]> См. Использование ключа.
  • Возвращает: <Promise> При успешном выполнении возвращает <CryptoKey>.

Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный baseKey, subtle.deriveKey() пытается создать новый <CryptoKey> на основе метода и параметров из derivedKeyAlgorithm.

Вызов subtle.deriveKey() эквивалентен вызову subtle.deriveBits() для генерации исходного ключевого материала с последующей передачей результата в метод subtle.importKey() в качестве входных данных с параметрами deriveKeyAlgorithm, extractable и keyUsages.

В настоящее время поддерживаются следующие алгоритмы:

  • 'ECDH'
  • 'X25519'
  • 'X448' 1
  • 'HKDF'
  • 'PBKDF2'

subtle.digest(algorithm, data)

Добавлено в: v15.0.0
  • algorithm <string> | <Algorithm>
  • data <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.

Используя метод, определённый в algorithm, subtle.digest() пытается вычислить дайджест для data. В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим вычисленный дайджест.

Если algorithm задан как <string>, его значение должно быть одним из следующих:

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

Если algorithm задан как <Object>, он должен иметь свойство name, значение которого должно быть одним из перечисленных выше.

subtle.encrypt(algorithm, key, data)

Добавлено в: v15.0.0
  • algorithm <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams>
  • key <CryptoKey>
  • data <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.

Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный key, subtle.encrypt() пытается зашифровать data. В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим результат шифрования.

В настоящее время поддерживаются следующие алгоритмы:

  • 'RSA-OAEP'
  • 'AES-CTR'
  • 'AES-CBC'
  • 'AES-GCM'

subtle.exportKey(format, key)

История
Версия Изменения
v18.4.0, v16.17.0

Добавлены алгоритмы 'Ed25519', 'Ed448', 'X25519' и 'X448'.

v15.9.0

Удалён экспорт JWK 'NODE-DSA'.

v15.0.0

Добавлено в: v15.0.0

  • format <string> Должно быть одним из значений 'raw', 'pkcs8', 'spki' или 'jwk'.
  • key <CryptoKey>
  • Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer> | <Object>.

Экспортирует указанный ключ в заданном формате, если он поддерживается.

Если <CryptoKey> не является извлекаемым, возвращённое обещание будет отклонено.

Если format имеет значение 'pkcs8' или 'spki' и экспорт выполнен успешно, возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим экспортированные данные ключа.

Если format имеет значение 'jwk' и экспорт выполнен успешно, возвращённое обещание будет выполнено с объектом JavaScript, соответствующим спецификации JSON Web Key.

Поддерживаемый алгоритм ключа 'spki' 'pkcs8' 'jwk' 'raw'
'AES-CBC' ✔ ✔
'AES-CTR' ✔ ✔
'AES-GCM' ✔ ✔
'AES-KW' ✔ ✔
'ECDH' ✔ ✔ ✔ ✔
'ECDSA' ✔ ✔ ✔ ✔
'Ed25519' ✔ ✔ ✔ ✔
'Ed448' 1 ✔ ✔ ✔ ✔
'HMAC' ✔ ✔
'RSA-OAEP' ✔ ✔ ✔
'RSA-PSS' ✔ ✔ ✔
'RSASSA-PKCS1-v1_5' ✔ ✔ ✔

subtle.generateKey(algorithm, extractable, keyUsages)

Добавлено в: v15.0.0
  • algorithm <string> | <Algorithm> | <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams> | <AesKeyGenParams>
  • extractable <boolean>
  • keyUsages <string[]> См. Использование ключа.
  • Возвращает: <Promise> При успешном выполнении возвращает <CryptoKey> | <CryptoKeyPair>.

Используя метод и параметры, предоставленные в algorithm, subtle.generateKey() пытается сгенерировать новый ключевой материал. В зависимости от используемого метода он может сгенерировать либо один <CryptoKey>, либо <CryptoKeyPair>.

Поддерживаются следующие алгоритмы генерации <CryptoKeyPair> (открытого и закрытого ключей):

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'RSA-OAEP'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448' 1
  • 'ECDH'
  • 'X25519'
  • 'X448' 1

Поддерживаются следующие алгоритмы генерации <CryptoKey> (секретного ключа):

  • 'HMAC'
  • 'AES-CTR'
  • 'AES-CBC'
  • 'AES-GCM'
  • 'AES-KW'

subtle.importKey(format, keyData, algorithm, extractable, keyUsages)

История
Версия Изменения
v18.4.0, v16.17.0

Добавлены алгоритмы 'Ed25519', 'Ed448', 'X25519' и 'X448'.

v15.9.0

Удалён импорт JWK 'NODE-DSA'.

v15.0.0

Добавлено в: v15.0.0

  • format <string> Должно быть одним из значений 'raw', 'pkcs8', 'spki' или 'jwk'.
  • keyData <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <Object>
  • algorithm <string> | <Algorithm> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
  • extractable <boolean>
  • keyUsages <string[]> См. Использование ключа.
  • Возвращает: <Promise> При успешном выполнении возвращает <CryptoKey>.

Метод subtle.importKey() пытается интерпретировать предоставленный keyData как указанный format и создать экземпляр <CryptoKey> с использованием аргументов algorithm, extractable и keyUsages. Если импорт выполнен успешно, возвращённое обещание будет выполнено с созданным <CryptoKey>.

При импорте ключа 'PBKDF2' значение extractable должно быть false.

В настоящее время поддерживаются следующие алгоритмы:

Поддерживаемый алгоритм ключа 'spki' 'pkcs8' 'jwk' 'raw'
'AES-CBC' ✔ ✔
'AES-CTR' ✔ ✔
'AES-GCM' ✔ ✔
'AES-KW' ✔ ✔
'ECDH' ✔ ✔ ✔ ✔
'X25519' ✔ ✔ ✔ ✔
'X448' 1 ✔ ✔ ✔ ✔
'ECDSA' ✔ ✔ ✔ ✔
'Ed25519' ✔ ✔ ✔ ✔
'Ed448' 1 ✔ ✔ ✔ ✔
'HDKF' ✔
'HMAC' ✔ ✔
'PBKDF2' ✔
'RSA-OAEP' ✔ ✔ ✔
'RSA-PSS' ✔ ✔ ✔
'RSASSA-PKCS1-v1_5' ✔ ✔ ✔

subtle.sign(algorithm, key, data)

История
Версия Изменения
v18.4.0, v16.17.0

Добавлены алгоритмы 'Ed25519' и 'Ed448'.

v15.0.0

Добавлено в: v15.0.0

  • algorithm <string> | <Algorithm> | <RsaPssParams> | <EcdsaParams> | <Ed448Params>
  • key <CryptoKey>
  • data <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.

Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный key, subtle.sign() пытается создать криптографическую подпись для data. В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим созданную подпись.

В настоящее время поддерживаются следующие алгоритмы:

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448' 1
  • 'HMAC'

subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages)

Добавлено в: v15.0.0
  • format <string> Должно быть одним из 'raw', 'pkcs8', 'spki' или 'jwk'.
  • wrappedKey <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • unwrappingKey <CryptoKey>
  • unwrapAlgo <string> | <Algorithm> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams>
  • unwrappedKeyAlgo <string> | <Algorithm> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
  • extractable <boolean>
  • keyUsages <string[]> См. Назначения ключа.
  • Возвращает: <Promise> При успешном выполнении разрешается значением <CryptoKey>.

В криптографии «обёртывание ключа» означает экспорт и последующее шифрование ключевого материала. Метод subtle.unwrapKey() пытается расшифровать обёрнутый ключ и создать экземпляр <CryptoKey>. Он эквивалентен вызову subtle.decrypt() сначала для зашифрованных данных ключа (с использованием аргументов wrappedKey, unwrapAlgo и unwrappingKey в качестве входных данных), а затем передаче результата методу subtle.importKey() с аргументами unwrappedKeyAlgo, extractable и keyUsages в качестве входных данных. При успешном выполнении возвращённый промис разрешается объектом <CryptoKey>.

В настоящее время поддерживаются следующие алгоритмы обёртывания:

  • 'RSA-OAEP'
  • 'AES-CTR'
  • 'AES-CBC'
  • 'AES-GCM'
  • 'AES-KW'

Поддерживаются следующие алгоритмы для распакованного ключа:

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'RSA-OAEP'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448' 1
  • 'ECDH'
  • 'X25519'
  • 'X448' 1
  • 'HMAC'
  • 'AES-CTR'
  • 'AES-CBC'
  • 'AES-GCM'
  • 'AES-KW'

subtle.verify(algorithm, key, signature, data)

История
Версия Изменения
v18.4.0, v16.17.0

Добавлены алгоритмы 'Ed25519' и 'Ed448'.

v15.0.0

Добавлено в: v15.0.0

  • algorithm <string> | <Algorithm> | <RsaPssParams> | <EcdsaParams> | <Ed448Params>
  • key <CryptoKey>
  • signature <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • data <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • Возвращает: <Promise> При успешном выполнении разрешается значением <boolean>.

Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный key, метод subtle.verify() пытается проверить, является ли signature допустимой криптографической подписью data. Возвращённый промис разрешается значением true или false.

В настоящее время поддерживаются следующие алгоритмы:

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448' 1
  • 'HMAC'

subtle.wrapKey(format, key, wrappingKey, wrapAlgo)

Добавлено в: v15.0.0
  • format <string> Должно быть одним из 'raw', 'pkcs8', 'spki' или 'jwk'.
  • key <CryptoKey>
  • wrappingKey <CryptoKey>
  • wrapAlgo <string> | <Algorithm> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams>
  • Возвращает: <Promise> При успешном выполнении разрешается значением <ArrayBuffer>.

В криптографии «обёртывание ключа» означает экспорт и последующее шифрование ключевого материала. Метод subtle.wrapKey() экспортирует ключевой материал в формате, обозначенном format, а затем шифрует его с помощью метода и параметров, указанных в wrapAlgo, и ключевого материала, предоставленного wrappingKey. Он эквивалентен вызову subtle.exportKey() с использованием format и key в качестве аргументов, а затем передаче результата методу subtle.encrypt() с использованием wrappingKey и wrapAlgo в качестве входных данных. При успешном выполнении возвращённый промис разрешается значением <ArrayBuffer>, содержащим зашифрованные данные ключа.

В настоящее время поддерживаются следующие алгоритмы обёртывания:

  • 'RSA-OAEP'
  • 'AES-CTR'
  • 'AES-CBC'
  • 'AES-GCM'
  • 'AES-KW'

Параметры алгоритмов

Объекты параметров алгоритмов определяют методы и параметры, используемые различными методами <SubtleCrypto>. Хотя здесь они описаны как «классы», это простые объекты-словари JavaScript.

Класс: Algorithm

Добавлено в: v15.0.0
Algorithm.name
Добавлено в: v15.0.0
  • Тип: <string>

Класс: AesDerivedKeyParams

Добавлено в: v15.0.0
aesDerivedKeyParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из 'AES-CBC', 'AES-CTR', 'AES-GCM' или 'AES-KW'
aesDerivedKeyParams.length
Добавлено в: v15.0.0
  • Тип: <number>

Длина производимого ключа AES. Она должна составлять 128, 192 или 256.

Класс: AesCbcParams

Добавлено в: v15.0.0
aesCbcParams.iv
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>

Задает вектор инициализации. Его длина должна составлять ровно 16 байт; он должен быть непредсказуемым и криптографически случайным.

aesCbcParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'AES-CBC'.

Класс: AesCtrParams

Добавлено в: v15.0.0
aesCtrParams.counter
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>

Начальное значение блока счетчика. Его длина должна составлять ровно 16 байт.

Метод AES-CTR использует length крайних справа бит блока в качестве счетчика, а остальные биты — в качестве nonce.

aesCtrParams.length
Добавлено в: v15.0.0
  • Тип: <number> Количество битов в aesCtrParams.counter, используемых в качестве счетчика.
aesCtrParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'AES-CTR'.

Класс: AesGcmParams

Добавлено в: v15.0.0
aesGcmParams.additionalData
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <undefined>

В методе AES-GCM параметр additionalData представляет собой дополнительные входные данные, которые не шифруются, но участвуют в аутентификации данных. Использование additionalData необязательно.

aesGcmParams.iv
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>

Вектор инициализации должен быть уникальным для каждой операции шифрования с использованием данного ключа.

В идеале это детерминированное значение длиной 12 байт, вычисляемое таким образом, чтобы гарантировать его уникальность во всех вызовах с использованием одного и того же ключа. В качестве альтернативы вектор инициализации может состоять как минимум из 12 криптографически случайных байт. Дополнительные сведения о формировании векторов инициализации для AES-GCM см. в разделе 8 документа NIST SP 800-38D.

aesGcmParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'AES-GCM'.
aesGcmParams.tagLength
Добавлено в: v15.0.0
  • Тип: <number> Размер генерируемого тега аутентификации в битах. Это значение должно быть одним из следующих: 32, 64, 96, 104, 112, 120 или 128. По умолчанию: 128.

Класс: AesKeyAlgorithm

Добавлено в: v15.0.0
aesKeyAlgorithm.length
Добавлено в: v15.0.0
  • Тип: <number>

Длина ключа AES в битах.

aesKeyAlgorithm.name
Добавлено в: v15.0.0
  • Тип: <string>

Класс: AesKeyGenParams

Добавлено в: v15.0.0
aesKeyGenParams.length
Добавлено в: v15.0.0
  • Тип: <number>

Длина генерируемого ключа AES. Она должна составлять 128, 192 или 256.

aesKeyGenParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из 'AES-CBC', 'AES-CTR', 'AES-GCM' или 'AES-KW'

Класс: EcdhKeyDeriveParams

Добавлено в: v15.0.0
ecdhKeyDeriveParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'ECDH', 'X25519' или 'X448'.
ecdhKeyDeriveParams.public
Добавлено в: v15.0.0
  • Тип: <CryptoKey>

Для получения ключа ECDH в качестве входных данных используются закрытый ключ одной стороны и открытый ключ другой стороны, с помощью которых создается общий секрет. Свойству ecdhKeyDeriveParams.public присваивается открытый ключ другой стороны.

Класс: EcdsaParams

Добавлено в: v15.0.0
ecdsaParams.hash
Добавлено в: v15.0.0
  • Тип: <string> | <Algorithm>

Если значение представлено как <string>, оно должно быть одним из следующих:

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

Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.

ecdsaParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'ECDSA'.

Класс: EcKeyAlgorithm

Добавлено в: v15.0.0
ecKeyAlgorithm.name
Добавлено в: v15.0.0
  • Тип: <string>
ecKeyAlgorithm.namedCurve
Добавлено в: v15.0.0
  • Тип: <string>

Класс: EcKeyGenParams

Добавлено в: v15.0.0
ecKeyGenParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из 'ECDSA' или 'ECDH'.
ecKeyGenParams.namedCurve
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из 'P-256', 'P-384' или 'P-521'.

Класс: EcKeyImportParams

Добавлено в: v15.0.0
ecKeyImportParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из 'ECDSA' или 'ECDH'.
ecKeyImportParams.namedCurve
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из 'P-256', 'P-384' или 'P-521'.

Класс: Ed448Params

Добавлено в: v15.0.0
ed448Params.name
Добавлено в: v18.4.0, v16.17.0
  • Тип: <string> Должно быть 'Ed448'.
ed448Params.context
Добавлено в: v18.4.0, v16.17.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <undefined>

Элемент context представляет необязательные контекстные данные, связываемые с сообщением. Реализация Web Crypto API в Node.js поддерживает только контекст нулевой длины, что эквивалентно отсутствию контекста.

Класс: HkdfParams

Добавлено в: v15.0.0
hkdfParams.hash
Добавлено в: v15.0.0
  • Тип: <string> | <Algorithm>

Если значение представлено как <string>, оно должно быть одним из следующих:

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

Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.

hkdfParams.info
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>

Задает контекстные входные данные, специфичные для приложения, для алгоритма HKDF. Они могут иметь нулевую длину, но должны быть указаны.

hkdfParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'HKDF'.
hkdfParams.salt
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>

Значение соли значительно повышает надежность алгоритма HKDF. Оно должно быть случайным или псевдослучайным и иметь ту же длину, что и выходные данные функции хеширования (например, если в качестве дайджеста используется 'SHA-256', соль должна состоять из 256 бит случайных данных).

Класс: HmacImportParams

Добавлено в: v15.0.0
hmacImportParams.hash
Добавлено в: v15.0.0
  • Тип: <string> | <Algorithm>

Если значение представлено как <string>, оно должно быть одним из следующих:

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

Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.

hmacImportParams.length
Добавлено в: v15.0.0
  • Тип: <number>

Необязательное количество битов ключа HMAC. В большинстве случаев этот параметр следует опустить.

hmacImportParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'HMAC'.

Класс: HmacKeyAlgorithm

Добавлено в: v15.0.0
hmacKeyAlgorithm.hash
Добавлено в: v15.0.0
  • Тип: <Algorithm>
hmacKeyAlgorithm.length
Добавлено в: v15.0.0
  • Тип: <number>

Длина ключа HMAC в битах.

hmacKeyAlgorithm.name
Добавлено в: v15.0.0
  • Тип: <string>

Класс: HmacKeyGenParams

Добавлено в: v15.0.0
hmacKeyGenParams.hash
Добавлено в: v15.0.0
  • Тип: <string> | <Algorithm>

Если значение представлено как <string>, оно должно быть одним из следующих:

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

Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.

hmacKeyGenParams.length
Добавлено в: v15.0.0
  • Тип: <number>

Количество битов, генерируемых для ключа HMAC. Если этот параметр не указан, длина определяется используемым алгоритмом хеширования. В большинстве случаев этот необязательный параметр следует опустить.

hmacKeyGenParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'HMAC'.

Класс: KeyAlgorithm

Добавлено в: v15.0.0
keyAlgorithm.name
Добавлено в: v15.0.0
  • Тип: <string>

Класс: Pbkdf2Params

Добавлено в: v15.0.0
pbkdf2Params.hash
Добавлено в: v15.0.0
  • Тип: <string> | <Algorithm>

Если значение представлено как <string>, оно должно быть одним из следующих:

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

Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.

pbkdf2Params.iterations
Добавлено в: v15.0.0
  • Тип: <number>

Количество итераций алгоритма PBKDF2 при получении битов.

pbkdf2Params.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'PBKDF2'.
pbkdf2Params.salt
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>

Должно содержать не менее 16 случайных или псевдослучайных байт.

Класс: RsaHashedImportParams

Добавлено в: v15.0.0
rsaHashedImportParams.hash
Добавлено в: v15.0.0
  • Тип: <string> | <Algorithm>

Если значение представлено как <string>, оно должно быть одним из следующих:

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

Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.

rsaHashedImportParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из 'RSASSA-PKCS1-v1_5', 'RSA-PSS' или 'RSA-OAEP'.

Класс: RsaHashedKeyAlgorithm

Добавлено в: v15.0.0
rsaHashedKeyAlgorithm.hash
Добавлено в: v15.0.0
  • Тип: <Algorithm>
rsaHashedKeyAlgorithm.modulusLength
Добавлено в: v15.0.0
  • Тип: <number>

Длина модуля RSA в битах.

rsaHashedKeyAlgorithm.name
Добавлено в: v15.0.0
  • Тип: <string>
rsaHashedKeyAlgorithm.publicExponent
Добавлено в: v15.0.0
  • Тип: <Uint8Array>

Открытая экспонента RSA.

Класс: RsaHashedKeyGenParams

Добавлено в: v15.0.0
rsaHashedKeyGenParams.hash
Добавлено в: v15.0.0
  • Тип: <string> | <Algorithm>

Если значение представлено в виде <string>, оно должно быть одним из следующих:

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

Если значение представлено в виде <Algorithm>, свойство объекта name должно иметь одно из перечисленных выше значений.

rsaHashedKeyGenParams.modulusLength
Добавлено в: v15.0.0
  • Тип: <number>

Длина модуля RSA в битах. Рекомендуется использовать значение не менее 2048.

rsaHashedKeyGenParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть одним из значений 'RSASSA-PKCS1-v1_5', 'RSA-PSS' или 'RSA-OAEP'.
rsaHashedKeyGenParams.publicExponent
Добавлено в: v15.0.0
  • Тип: <Uint8Array>

Открытая экспонента RSA. Это должен быть <Uint8Array>, содержащий беззнаковое целое число в порядке от старшего байта к младшему, которое должно помещаться в 32 бита. <Uint8Array> может содержать произвольное количество начальных нулевых битов. Значение должно быть простым числом. Если нет причин использовать другое значение, в качестве открытой экспоненты следует использовать new Uint8Array([1, 0, 1]) (65537).

Класс: RsaOaepParams

Добавлено в: v15.0.0
rsaOaepParams.label
Добавлено в: v15.0.0
  • Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>

Дополнительный набор байтов, который не будет зашифрован, но будет связан с полученным шифротекстом.

Параметр rsaOaepParams.label является необязательным.

rsaOaepParams.name
Добавлено в: v15.0.0
  • Тип: <string> должно быть 'RSA-OAEP'.

Класс: RsaPssParams

Добавлено в: v15.0.0
rsaPssParams.name
Добавлено в: v15.0.0
  • Тип: <string> Должно быть 'RSA-PSS'.
rsaPssParams.saltLength
Добавлено в: v15.0.0
  • Тип: <number>

Длина (в байтах) используемой случайной соли.

Сноски

  1. Экспериментальная реализация алгоритмов Ed448 и X448 из спецификации «Безопасные кривые в API веб-криптографии» по состоянию на 21 октября 2024 года ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/webcrypto.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API