Spec-Zone.ru › Node.js 20 LTS

Web Crypto API

История
Версия Изменения
v20.0.0

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

v19.0.0

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

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

Удалены собственные имена кривых 'NODE-X25519' и 'NODE-X448' из алгоритма 'ECDH'.

Устойчивость: 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/Ed448/X25519/X448
Устойчивость: 1 - Экспериментально
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

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

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

Алгоритм generateKey exportKey importKey encrypt decrypt wrapKey unwrapKey deriveBits deriveKey sign verify digest
'RSASSA-PKCS1-v1_5' ✔ ✔ ✔ ✔ ✔
'RSA-PSS' ✔ ✔ ✔ ✔ ✔
'RSA-OAEP' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'ECDSA' ✔ ✔ ✔ ✔ ✔
'Ed25519' 1 ✔ ✔ ✔ ✔ ✔
'Ed448' 1 ✔ ✔ ✔ ✔ ✔
'ECDH' ✔ ✔ ✔ ✔ ✔
'X25519' 1 ✔ ✔ ✔ ✔ ✔
'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 — синглтон, предоставляющий доступ к остальной части API шифрования.

crypto.subtle

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

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

crypto.getRandomValues(typedArray)

Добавлен в: v15.0.0
  • typedArray <Буфер> | <Массив типизированных данных>
  • Возвращает: <Буфер> | <Массив типизированных данных>

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

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

Ошибка будет выброшена, если переданный typedArray больше 65 536 байт.

crypto.randomUUID()

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

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

Класс: CryptoKey

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

cryptoKey.algorithm

Добавлен в: v15.0.0
  • Тип: <AesKeyGenParams> | <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams>

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

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

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' 1 ✔ ✔
'X448' 1 ✔ ✔
'ECDSA' ✔ ✔
'Ed25519' 1 ✔ ✔
'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)

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

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

v15.0.0

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

  • algorithm: <AlgorithmIdentifier> | <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params>
  • baseKey: <CryptoKey>
  • length: <number> | <null>
  • Возвращает: <Promise> Выполняется с <ArrayBuffer>

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

Реализация Node.js требует, чтобы length при вводе числа было кратным 8.

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

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

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

  • 'ECDH'
  • 'X25519' 1
  • '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: <AlgorithmIdentifier> | <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params>
  • baseKey: <CryptoKey>
  • derivedKeyAlgorithm: <HmacKeyGenParams> | <AesKeyGenParams>
  • extractable: <boolean>
  • keyUsages: <string[]> См. Использование ключей.
  • Возвращает: <Promise> Выполняется с <CryptoKey>

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

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

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

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

subtle.digest(algorithm, data)

Добавлен в: v15.0.0
  • algorithm: <string> | <Object>
  • 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>
END_OF_DOCUMENT_MARKER

Используя метод и параметры, указанные в 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: <строка> Должно быть одно из 'raw', 'pkcs8', 'spki', или 'jwk'.
  • key: <CryptoKey>
  • Возвращает: <Обещание> Выполняется с <ArrayBuffer> | <Объект>.

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

Если <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' 1 ✔ ✔ ✔ ✔
'Ed448' 1 ✔ ✔ ✔ ✔
'HDKF'
'HMAC' ✔ ✔
'PBKDF2'
'RSA-OAEP' ✔ ✔ ✔
'RSA-PSS' ✔ ✔ ✔
'RSASSA-PKCS1-v1_5' ✔ ✔ ✔

subtle.generateKey(algorithm, extractable, keyUsages)

Добавлен в: v15.0.0
  • algorithm: <Идентификатор алгоритма> | <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams> | <AesKeyGenParams>
  • extractable: <булево>
  • keyUsages: <массив строк> См. Использование ключей.
  • Возвращает: <Обещание> Выполняется с <CryptoKey> | <CryptoKeyPair>

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

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

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'RSA-OAEP'
  • 'ECDSA'
  • 'Ed25519' 1
  • 'Ed448' 1
  • 'ECDH'
  • 'X25519' 1
  • '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: <строка> Должно быть одно из 'raw', 'pkcs8', 'spki', или 'jwk'.
  • keyData: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <Объект>
  • algorithm: <Идентификатор алгоритма> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
  • extractable: <булево>
  • keyUsages: <массив строк> См. Использование ключей.
  • Возвращает: <Обещание> Выполняется с <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' 1 ✔ ✔ ✔ ✔
'X448' 1 ✔ ✔ ✔ ✔
'ECDSA' ✔ ✔ ✔ ✔
'Ed25519' 1 ✔ ✔ ✔ ✔
'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: <AlgorithmIdentifier> | <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' 1
  • 'Ed448' 1
  • 'HMAC'

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

Добавлен в: v15.0.0
  • format: <строка> Должно быть одним из 'raw', 'pkcs8', 'spki', или 'jwk'.
  • wrappedKey: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • unwrappingKey: <CryptoKey>
  • unwrapAlgo: <AlgorithmIdentifier> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams>
  • unwrappedKeyAlgo: <AlgorithmIdentifier> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
  • extractable: <boolean>
  • keyUsages: <массив строк> См. Использование ключей.
  • Возвращает: <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' 1
  • 'Ed448' 1
  • 'ECDH'
  • 'X25519' 1
  • '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: <AlgorithmIdentifier> | <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' 1
  • 'Ed448' 1
  • 'HMAC'

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

Добавлена в: v15.0.0
  • format: <string> Должно быть одним из 'raw', 'pkcs8', 'spki', или 'jwk'.
  • key: <CryptoKey>
  • wrappingKey: <CryptoKey>
  • wrapAlgo: <AlgorithmIdentifier> | <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.

Класс: AlgorithmIdentifier

Добавлен в: v18.4.0, v16.17.0
algorithmIdentifier.name
Добавлен в: v18.4.0, v16.17.0
  • Тип: <строка>

Класс: AesCbcParams

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

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

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

Класс: AesCtrParams

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

Начальное значение блока счётчика. Оно должно иметь длину ровно 16 байт.

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

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

Класс: AesGcmParams

Добавлен в: v15.0.0
aesGcmParams.additionalData
Добавлен в: v15.0.0
  • Тип: <ArrayBuffer> | <Массив типов> | <DataView> | <Buffer> | <неопределено>

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

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

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

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

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

Класс: AesKeyGenParams

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

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

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

Класс: EcdhKeyDeriveParams

Добавлен в: v15.0.0
ecdhKeyDeriveParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должно быть 'ECDH', 'X25519', или 'X448'.
ecdhKeyDeriveParams.public
Добавлен в: v15.0.0
  • Тип: <КлючCrypto>

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

Класс: EcdsaParams

Добавлен в: v15.0.0
ecdsaParams.hash
Добавлен в: v15.0.0
  • Тип: <строка> | <объект>

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

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

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

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

Класс: EcKeyGenParams

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

Класс: EcKeyImportParams

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

Класс: Ed448Params

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

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

Класс: HkdfParams

Добавлен в: v15.0.0
hkdfParams.hash
Добавлен в: v15.0.0
  • Тип: <строка> | <объект>

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

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

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

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

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

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

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

Класс: HmacImportParams

Добавлен в: v15.0.0
hmacImportParams.hash
Добавлен в: v15.0.0
  • Тип: <строка> | <объект>

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

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

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

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

Необязательное количество битов в ключе HMAC. Это необязательно и должно быть опущено в большинстве случаев.

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

Класс: HmacKeyGenParams

Добавлен в: v15.0.0
hmacKeyGenParams.hash
Добавлен в: v15.0.0
  • Тип: <строка> | <объект>

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

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

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

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

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

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

Класс: Pbkdf2Params

Добавлен в: v15.0.0
pbkdb2Params.hash
Добавлен в: v15.0.0
  • Тип: <строка> | <объект>

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

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

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

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

Количество итераций, которое алгоритм PBKDF2 должен выполнить при выводе битов.

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

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

Класс: RsaHashedImportParams

Добавлен в: v15.0.0
rsaHashedImportParams.hash
Добавлен в: v15.0.0
  • Тип: <строка> | <объект>

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

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

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

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

Класс: RsaHashedKeyGenParams

Добавлена в: v15.0.0
rsaHashedKeyGenParams.hash
Добавлена в: v15.0.0
  • Тип: <строка> | <Объект>

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

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

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

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

Длина модуля RSA в битах. В качестве рекомендации, она должна быть не менее 2048.

rsaHashedKeyGenParams.name
Добавлена в: v15.0.0
  • Тип: <строка> Должно быть одно из '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> | <Массив типов> | <DataView> | <Buffer>

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

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

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

Класс: RsaPssParams

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

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

Примечания

  1. Экспериментальная реализация Безопасных кривых в API криптографии веб-браузера на 30 августа 2023 ↩ ↩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

© 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-v20.x/docs/api/webcrypto.html

Spec-Zone.ru

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