Spec-Zone.ru › Node.js 16 LTS

API Web Crypto

Стабильность: 1 - Экспериментальная

Node.js предоставляет реализацию стандартного API Web Crypto.

Используйте require('crypto').webcrypto для доступа к этому модулю.

const { subtle } = require('crypto').webcrypto;

(async function() {

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

  const digest = await subtle.sign({
    name: 'HMAC'
  }, key, 'I love cupcakes');

})();

Примеры

Генерация ключей

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

Ключи AES
const { subtle } = require('crypto').webcrypto;

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

  return key;
}
Пары ключей кривых эллиптических кривых
const { subtle } = require('crypto').webcrypto;

async function generateEcKey(namedCurve = 'P-521') {
  const {
    publicKey,
    privateKey
  } = await subtle.generateKey({
    name: 'ECDSA',
    namedCurve,
  }, true, ['sign', 'verify']);

  return { publicKey, privateKey };
}
Пары ключей эллиптических кривых ED25519/ED448/X25519/X448
const { subtle } = require('crypto').webcrypto;

async function generateEd25519Key() {
  return subtle.generateKey({
    name: 'NODE-ED25519',
    namedCurve: 'NODE-ED25519',
  }, true, ['sign', 'verify']);
}

async function generateX25519Key() {
  return subtle.generateKey({
    name: 'ECDH',
    namedCurve: 'NODE-X25519',
  }, true, ['deriveKey']);
}
Ключи HMAC
const { subtle } = require('crypto').webcrypto;

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

  return key;
}
Пары ключей RSA
const { subtle } = require('crypto').webcrypto;
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 { subtle, getRandomValues } = require('crypto').webcrypto;

async function aesEncrypt(plaintext) {
  const ec = new TextEncoder();
  const key = await generateAesKey();
  const iv = getRandomValues(new Uint8Array(16));

  const ciphertext = await 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 subtle.decrypt({
    name: 'AES-CBC',
    iv,
  }, key, ciphertext);

  return dec.decode(plaintext);
}

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

const { subtle } = require('crypto').webcrypto;

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 } = require('crypto').webcrypto;

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

async function unwrapHmacKey(
  wrappedKey,
  wrappingKey,
  format = 'jwk',
  hash = 'SHA-512') {

  const key = await subtle.unwrapKey(
    format,
    wrappedKey,
    unwrappingKey,
    'AES-KW',
    { name: 'HMAC', hash },
    true,
    ['sign', 'verify']);

  return key;
}

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

const { subtle } = require('crypto').webcrypto;

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 } = require('crypto').webcrypto;

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: 256
  }, true, ['encrypt', 'decrypt']);
  return key;
}

Хеширование

const { subtle } = require('crypto').webcrypto;

async function digest(data, algorithm = 'SHA-512') {
  const ec = new TextEncoder();
  const digest = await subtle.digest(algorithm, ec.encode(data));
  return digest;
}

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

В таблице подробно описаны алгоритмы, поддерживаемые реализацией 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' ✔ ✔ ✔ ✔ ✔
'ECDH' ✔ ✔ ✔ ✔ ✔
'AES-CTR' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'AES-CBC' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'AES-GCM' ✔ ✔ ✔ ✔ ✔ ✔ ✔
'AES-KW' ✔ ✔ ✔ ✔ ✔
'HMAC' ✔ ✔ ✔ ✔ ✔
'HKDF' ✔ ✔ ✔ ✔
'PBKDF2' ✔ ✔ ✔ ✔
'SHA-1' ✔
'SHA-256' ✔
'SHA-384' ✔
'SHA-512' ✔
'NODE-DSA'1 ✔ ✔ ✔ ✔ ✔
'NODE-DH'1 ✔ ✔ ✔ ✔ ✔
'NODE-ED25519'1 ✔ ✔ ✔ ✔ ✔
'NODE-ED448'1 ✔ ✔ ✔ ✔ ✔

Класс: Crypto

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

Вызов require('crypto').webcrypto возвращает экземпляр класса Crypto. Crypto — это синглтон, предоставляющий доступ к остальной части API шифрования.

crypto.subtle

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

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

crypto.getRandomValues(typedArray)

Добавлен в: v15.0.0
  • typedArray <Буфер> | <TypedArray> | <DataView> | <ArrayBuffer>
  • Возвращает: <Буфер> | <TypedArray> | <DataView> | <ArrayBuffer> Возвращает typedArray.

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

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

crypto.randomUUID()

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

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

END_OF_DOCUMENT_MARKER

Класс: CryptoKey

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

cryptoKey.algorithm

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

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

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

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' ✔ ✔
'ECDSA' ✔ ✔
'HDKF' ✔ ✔
'HMAC' ✔ ✔
'PBKDF2' ✔ ✔
'RSA-OAEP' ✔ ✔ ✔ ✔
'RSA-PSS' ✔ ✔
'RSASSA-PKCS1-v1_5' ✔ ✔
'NODE-DSA'1 ✔ ✔
'NODE-DH'1 ✔ ✔
'NODE-SCRYPT'1 ✔ ✔
'NODE-ED25519'1 ✔ ✔
'NODE-ED448'1 ✔ ✔

Класс: 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. При успешном выполнении возвращаемое promise будет разрешено с <ArrayBuffer>, содержащим результат в виде открытого текста.

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

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

subtle.deriveBits(algorithm, baseKey, length)

Добавлен в: v15.0.0
  • algorithm: <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> | <NodeDhDeriveBitsParams> | <NodeScryptParams>
  • baseKey: <CryptoKey>
  • length: <number>
  • Возвращает: <Promise>, содержащую <ArrayBuffer>

Используя метод и параметры, указанные в algorithm, и криптографический материал, предоставленный baseKey, subtle.deriveBits() пытается сгенерировать length бит. В реализации Node.js требуется, чтобы length было кратно 8. При успешном выполнении возвращаемое promise будет разрешено с <ArrayBuffer>, содержащим сгенерированные данные.

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

  • 'ECDH'
  • 'HKDF'
  • 'PBKDF2'
  • 'NODE-DH'1
  • 'NODE-SCRYPT'1

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

Добавлен в: v15.0.0
  • algorithm: <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> | <NodeDhDeriveBitsParams> | <NodeScryptParams>
  • 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'
  • 'HKDF'
  • 'PBKDF2'
  • 'NODE-DH'1
  • 'NODE-SCRYPT'1

subtle.digest(algorithm, data)

Добавлен в: v15.0.0
  • algorithm: <string> | <Object>
  • data: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • Возвращает: <Promise> содержащую <ArrayBuffer>

Используя метод, определенный в algorithm, subtle.digest() пытается вычислить дайджест data. При успешном выполнении возвращаемое promise разрешается с <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>
  • Возвращает: <Promise> содержащую <ArrayBuffer>

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

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

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

subtle.exportKey(format, key)

История
Версия Изменения
v15.9.0

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

v15.0.0

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

  • format: <string> Должно быть одним из 'raw', 'pkcs8', 'spki', 'jwk' или 'node.keyObject'.
  • key: <CryptoKey>
  • Возвращает: <Promise>, содержащую <ArrayBuffer>, или, если format равно 'node.keyObject', <KeyObject>.

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

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

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

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

Значение 'node.keyObject' для format — это специфичное для Node.js расширение, которое позволяет преобразовать <CryptoKey> в Node.js <KeyObject>.

Тип ключа 'spki' 'pkcs8' 'jwk' 'raw'
'AES-CBC' ✔ ✔
'AES-CTR' ✔ ✔
'AES-GCM' ✔ ✔
'AES-KW' ✔ ✔
'ECDH' ✔ ✔ ✔ ✔
'ECDSA' ✔ ✔ ✔ ✔
'HDKF'
'HMAC' ✔ ✔
'PBKDF2'
'RSA-OAEP' ✔ ✔ ✔
'RSA-PSS' ✔ ✔ ✔
'RSASSA-PKCS1-v1_5' ✔ ✔ ✔
'NODE-DSA'1 ✔ ✔
'NODE-DH'1 ✔ ✔
'NODE-SCRYPT'1
'NODE-ED25519'1 ✔ ✔ ✔ ✔
'NODE-ED448'1 ✔ ✔ ✔ ✔

subtle.generateKey(algorithm, extractable, keyUsages)

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

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

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

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'RSA-OAEP'
  • 'ECDSA'
  • 'ECDH'
  • 'NODE-DSA'1
  • 'NODE-DH'1
  • 'NODE-ED25519'1
  • 'NODE-ED448'1

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

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

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

История
Версия Изменения
v15.9.0

Убран импорт 'NODE-DSA' JWK.

v15.0.0

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

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

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

Значение 'node.keyObject' для format — это специфичное для Node.js расширение, которое позволяет преобразовать Node.js <KeyObject> в <CryptoKey>.

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

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

Ключ Тип 'spki' 'pkcs8' 'jwk' 'raw'
'AES-CBC' ✔ ✔
'AES-CTR' ✔ ✔
'AES-GCM' ✔ ✔
'AES-KW' ✔ ✔
'ECDH' ✔ ✔ ✔ ✔
'ECDSA' ✔ ✔ ✔ ✔
'HDKF' ✔
'HMAC' ✔ ✔
'PBKDF2' ✔
'RSA-OAEP' ✔ ✔ ✔
'RSA-PSS' ✔ ✔ ✔
'RSASSA-PKCS1-v1_5' ✔ ✔ ✔
'NODE-DSA'1 ✔ ✔
'NODE-DH'1 ✔ ✔
'NODE-SCRYPT'1 ✔
'NODE-ED25519'1 ✔ ✔ ✔ ✔
'NODE-ED448'1 ✔ ✔ ✔ ✔

subtle.sign(algorithm, key, data)

Добавлена в: v15.0.0
  • algorithm: <RsaSignParams> | <RsaPssParams> | <EcdsaParams> | <HmacParams> | <NodeDsaSignParams>
  • key: <CryptoKey>
  • data: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
  • Возвращает: <Promise> содержащую <ArrayBuffer>

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

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

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'ECDSA'
  • 'HMAC'
  • 'NODE-DSA'1
  • 'NODE-ED25519'1
  • 'NODE-ED448'1

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: <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> | <AesKwParams>
  • unwrappedKeyAlgo: <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams> | <AesImportParams>
  • extractable: <boolean>
  • keyUsages: <string[]> См. Использование ключей.
  • Возвращает: <Promise> содержащую <CryptoKey>

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

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

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

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

  • 'RSASSA-PKCS1-v1_5'
  • 'RSA-PSS'
  • 'RSA-OAEP'
  • 'ECDSA'
  • 'ECDH'
  • 'HMAC'
  • 'AES-CTR'
  • 'AES-CBC'
  • 'AES-GCM'
  • 'AES-KW'
  • 'NODE-DSA'1
  • 'NODE-DH'1

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

Добавлена в: v15.0.0
  • algorithm: <RsaSignParams> | <RsaPssParams> | <EcdsaParams> | <HmacParams> | <NodeDsaSignParams>
  • 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'
  • 'HMAC'
  • 'NODE-DSA'1
  • 'NODE-ED25519'1
  • 'NODE-ED448'1

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

Добавлен в: v15.0.0
  • format: <строка> Должно быть одно из 'raw', 'pkcs8', 'spki' или 'jwk'.
  • key: <CryptoKey>
  • wrappingKey: <CryptoKey>
  • wrapAlgo: <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> | <AesKwParams>
  • Возвращает: <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'
END_OF_DOCUMENT_MARKER

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

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

Класс: AesCbcParams

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

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

aesCbcParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должен быть '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
  • Тип: <число> Количество битов в блоке aesCtrParams.counter, которые будут использоваться в качестве счётчика.
aesCtrParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должен быть '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>

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

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

Класс: AesImportParams

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

Класс: 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'

Класс: AesKwParams

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

Класс: EcdhKeyDeriveParams

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

Производные ключи 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', 'NODE-ED25519', 'NODE-ED448', 'NODE-X25519' или 'NODE-X448'.

Класс: EcKeyImportParams

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

Класс: 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'.

Класс: HmacParams

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

Класс: Pbkdf2ImportParams

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

Класс: 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>, содержащий целое беззнаковое целое число в формате big-endian, которое должно помещаться в 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
  • Тип: <строка> должно быть 'RSA-OAEP'.

Класс: RsaPssParams

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

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

Класс: RsaSignParams

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

Расширения, специфичные для Node.js

API криптографии Node.js расширяет различные аспекты API криптографии Web Crypto. Эти расширения постоянно идентифицируются путем добавления префикса node. к именам. Например, формат ключа 'node.keyObject' можно использовать с методами subtle.exportKey() и subtle.importKey() для преобразования между объектом WebCrypto <CryptoKey> и объектом Node.js <KeyObject>.

Следует проявлять осторожность при использовании расширений, специфичных для Node.js, так как они не поддерживаются другими реализациями WebCrypto и снижают переносимость кода в другие среды.

NODE-DH Алгоритм

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

Алгоритм NODE-DH представляет собой общепринятую реализацию согласования ключей Диффи-Хеллмана.

Класс: NodeDhImportParams
Добавлен в: v15.0.0
nodeDhImportParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должен быть 'NODE-DH'.
Класс: NodeDhKeyGenParams
Добавлен в: v15.0.0
nodeDhKeyGenParams.generator
Добавлен в: v15.0.0
  • Тип: <число> Пользовательский генератор.
nodeDhKeyGenParams.group
Добавлен в: v15.0.0
  • Тип: <строка> Имя группы Диффи-Хеллмана.
nodeDhKeyGenParams.prime
Добавлен в: v15.0.0
  • Тип: <Буфер> Параметр простого числа.
nodeDhKeyGenParams.primeLength
Добавлен в: v15.0.0
  • Тип: <число> Длина простого числа в битах.
Класс: NodeDhDeriveBitsParams
Добавлен в: v15.0.0
nodeDhDeriveBitsParams.public
Добавлен в: v15.0.0
  • Тип: <CryptoKey> Открытый ключ другой стороны.

NODE-DSA Алгоритм

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

Алгоритм NODE-DSA представляет собой общепринятую реализацию алгоритма цифровой подписи DSA.

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

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

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

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

nodeDsaImportParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должен быть 'NODE-DSA'.
Класс: NodeDsaKeyGenParams
Добавлен в: v15.0.0
nodeDsaKeyGenParams.divisorLength
Добавлен в: v15.0.0
  • Тип: <число>

Необязательная длина делителя DSA в битах.

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

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

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

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

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

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

nodeDsaKeyGenParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должен быть 'NODE-DSA'.
Класс: NodeDsaSignParams
Добавлен в: v15.0.0
nodeDsaSignParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должен быть 'NODE-DSA'

NODE-ED25519 и NODE-ED448 Алгоритмы

Добавлен в: v15.8.0
Класс: NodeEdKeyGenParams
Добавлен в: v15.8.0
nodeEdKeyGenParams.name
Добавлен в: v15.8.0
  • Тип: <строка> Должен быть одним из 'NODE-ED25519', 'NODE-ED448' или 'ECDH'.
nodeEdKeyGenParams.namedCurve
Добавлен в: v15.8.0
  • Тип: <строка> Должен быть одним из 'NODE-ED25519', 'NODE-ED448', 'NODE-X25519' или 'NODE-X448'.
Класс: NodeEdKeyImportParams
Добавлен в: v15.8.0
nodeEdKeyImportParams.name
Добавлен в: v15.8.0
  • Тип: <строка> Должен быть одним из 'NODE-ED25519' или 'NODE-ED448' при импорте ключа Ed25519 или Ed448, или 'ECDH' при импорте ключа X25519 или X448.
nodeEdKeyImportParams.namedCurve
Добавлен в: v15.8.0
  • Тип: <строка> Должен быть одним из 'NODE-ED25519', 'NODE-ED448', 'NODE-X25519' или 'NODE-X448'.
nodeEdKeyImportParams.public
Добавлен в: v15.8.0
  • Тип: <логическое значение>

Параметр public используется для указания, что ключ в формате 'raw' должен интерпретироваться как открытый ключ. По умолчанию: false.

NODE-SCRYPT Алгоритм

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

Алгоритм NODE-SCRYPT представляет собой общепринятую реализацию алгоритма вывода ключей scrypt.

Класс: NodeScryptImportParams
Добавлен в: v15.0.0
nodeScryptImportParams.name
Добавлен в: v15.0.0
  • Тип: <строка> Должен быть 'NODE-SCRYPT'.
Класс: NodeScryptParams
Добавлен в: v15.0.0
nodeScryptParams.encoding
Добавлен в: v15.0.0
  • Тип: <строка> Кодировка строки, когда salt представляет собой строку.
nodeScryptParams.maxmem
Добавлен в: v15.0.0
  • Тип: <число> Верхний предел памяти. Возникает ошибка, когда (приблизительно) 127 * N * r > maxmem. По умолчанию: 32 * 1024 * 1024.
nodeScryptParams.N
END_OF_DOCUMENT_MARKER
Добавлен в: v15.0.0
  • Тип: <число> Параметр стоимости процессора/памяти. Должен быть степенью двойки, большей 1. По умолчанию: 16384.
nodeScryptParams.p
Добавлен в: v15.0.0
  • Тип: <число> Параметр распараллеливания. По умолчанию: 1.
nodeScryptParams.r
Добавлен в: v15.0.0
  • Тип: <число> Параметр размера блока. По умолчанию: 8.
nodeScryptParams.salt
Добавлен в: v15.0.0
  • Тип: <строка> | <ArrayBuffer> | <Буфер> | <TypedArray> | <DataView>

Примечания

  1. Нестандартное расширение Node.js ↩ ↩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

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

Spec-Zone.ru

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