Перейти к содержанию

Web Crypto API

latest

Стабильность: 2 – Стабильная

АПИ является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.

Node.js реализует стандарт Web Crypto API.

Доступ: globalThis.crypto или require('node:crypto').webcrypto.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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);

})();

Современные алгоритмы в Web Cryptography API

Стабильность: 1.1 – Активная разработка

Изменения возможны; при необходимости проверяйте поведение в документации upstream.

Node.js поддерживает следующие возможности из предложения WICG Modern Algorithms in the Web Cryptography API:

Алгоритмы:

  • 'AES-OCB'3
  • 'Argon2d'4
  • 'Argon2i'4
  • 'Argon2id'4
  • 'ChaCha20-Poly1305'
  • 'cSHAKE128'
  • 'cSHAKE256'
  • 'KMAC128'3
  • 'KMAC256'3
  • 'KT128'
  • 'KT256'
  • 'ML-DSA-44'5
  • 'ML-DSA-65'5
  • 'ML-DSA-87'5
  • 'ML-KEM-512'5
  • 'ML-KEM-768'5
  • 'ML-KEM-1024'5
  • 'SHA3-256'
  • 'SHA3-384'
  • 'SHA3-512'
  • 'TurboSHAKE128'
  • 'TurboSHAKE256'

Форматы ключей:

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

Методы:

Безопасные кривые в Web Cryptography API

Стабильность: 1.1 – Активная разработка

Node.js поддерживает следующие возможности из предложения WICG Secure Curves in the Web Cryptography API:

Алгоритмы:

  • 'Ed448'
  • 'X448'

Примеры

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

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

Ключи AES

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const { subtle } = globalThis.crypto;

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

  return key;
}

Пары ключей ECDSA

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 };
}

Пары ключей Ed25519/X25519

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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']);
}

Ключи HMAC

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const { subtle } = globalThis.crypto;

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

  return key;
}

Пары ключей RSA

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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 };
}

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
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;
}

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
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;
}

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

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

Хеш (digest)

1
2
3
4
5
6
7
const { subtle } = globalThis.crypto;

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

Проверка поддержки алгоритмов в рантайме

SubtleCrypto.supports() позволяет определять возможности в Web Crypto API и выяснять, поддерживается ли заданный идентификатор алгоритма (вместе с его параметрами) для указанной операции.

В этом примере из пароля выводится ключ с помощью Argon2, если доступен, иначе PBKDF2; затем с ним шифруется и расшифровывается текст с помощью AES-OCB, если доступен, иначе AES-GCM.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const { SubtleCrypto, crypto } = globalThis;

const password = 'correct horse battery staple';
const derivationAlg =
  SubtleCrypto.supports?.('importKey', 'Argon2id') ?
    'Argon2id' :
    'PBKDF2';
const encryptionAlg =
  SubtleCrypto.supports?.('importKey', 'AES-OCB') ?
    'AES-OCB' :
    'AES-GCM';
const passwordKey = await crypto.subtle.importKey(
  derivationAlg === 'Argon2id' ? 'raw-secret' : 'raw',
  new TextEncoder().encode(password),
  derivationAlg,
  false,
  ['deriveKey'],
);
const nonce = crypto.getRandomValues(new Uint8Array(16));
const derivationParams =
  derivationAlg === 'Argon2id' ?
    {
      nonce,
      parallelism: 4,
      memory: 2 ** 21,
      passes: 1,
    } :
    {
      salt: nonce,
      iterations: 100_000,
      hash: 'SHA-256',
    };
const key = await crypto.subtle.deriveKey(
  {
    name: derivationAlg,
    ...derivationParams,
  },
  passwordKey,
  {
    name: encryptionAlg,
    length: 256,
  },
  false,
  ['encrypt', 'decrypt'],
);
const plaintext = 'Hello, world!';
const iv = crypto.getRandomValues(new Uint8Array(16));
const encrypted = await crypto.subtle.encrypt(
  { name: encryptionAlg, iv },
  key,
  new TextEncoder().encode(plaintext),
);
const decrypted = new TextDecoder().decode(await crypto.subtle.decrypt(
  { name: encryptionAlg, iv },
  key,
  encrypted,
));

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

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

API управления ключами

Алгоритм subtle.generateKey() subtle.exportKey() subtle.importKey() subtle.getPublicKey()
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'
'Argon2d'
'Argon2i'
'Argon2id'
'ChaCha20-Poly1305'2
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'1
'HKDF'
'HMAC'
'KMAC128'2
'KMAC256'2
'ML-DSA-44'2
'ML-DSA-65'2
'ML-DSA-87'2
'ML-KEM-512'2
'ML-KEM-768'2
'ML-KEM-1024'2
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'X25519'
'X448'1

API криптографических операций

Условные обозначения столбцов:

Алгоритм Шифрование Подписи и MAC Вывод ключа или битов Упаковка ключа Инкапсуляция ключа Digest
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'
'Argon2d'
'Argon2i'
'Argon2id'
'ChaCha20-Poly1305'2
'cSHAKE128'2
'cSHAKE256'2
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'1
'HKDF'
'HMAC'
'KMAC128'2
'KMAC256'2
'KT128'2
'KT256'2
'ML-DSA-44'2
'ML-DSA-65'2
'ML-DSA-87'2
'ML-KEM-512'2
'ML-KEM-768'2
'ML-KEM-1024'2
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
'SHA3-256'2
'SHA3-384'2
'SHA3-512'2
'TurboSHAKE128'2
'TurboSHAKE256'2
'X25519'
'X448'1

Класс: Crypto

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

crypto.subtle

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

crypto.getRandomValues(typedArray)

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

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

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

crypto.randomUUID()

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

Класс: CryptoKey

cryptoKey.algorithm

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

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

cryptoKey.extractable

Если true, CryptoKey можно извлечь через subtle.exportKey() или subtle.wrapKey().

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

cryptoKey.type

  • Тип: <string> Одно из 'secret', 'private' или 'public'.

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

cryptoKey.usages

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

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

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

Условные обозначения столбцов:

Поддерживаемый алгоритм ключа Шифрование Подписи и MAC Вывод ключа или битов Упаковка ключа Инкапсуляция ключа
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'
'Argon2d'
'Argon2i'
'Argon2id'
'ChaCha20-Poly1305'2
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'1
'HDKF'
'HMAC'
'KMAC128'2
'KMAC256'2
'ML-DSA-44'2
'ML-DSA-65'2
'ML-DSA-87'2
'ML-KEM-512'2
'ML-KEM-768'2
'ML-KEM-1024'2
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'X25519'
'X448'1

Класс: CryptoKeyPair

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

cryptoKeyPair.privateKey

cryptoKeyPair.publicKey

Класс: SubtleCrypto

Статический метод: SubtleCrypto.supports(operation, algorithm[, lengthOrAdditionalAlgorithm])

Стабильность: 1.1 – Активная разработка

  • operation <string> "encrypt", "decrypt", "sign", "verify", "digest", "generateKey", "deriveKey", "deriveBits", "importKey", "exportKey", "getPublicKey", "wrapKey", "unwrapKey", "encapsulateBits", "encapsulateKey", "decapsulateBits" или "decapsulateKey"
  • algorithm <string> | <Algorithm>
  • lengthOrAdditionalAlgorithm null | <number> | <string> | <Algorithm> | undefined В зависимости от операции: игнорируется; либо значение аргумента длины, если операция — "deriveBits"; либо алгоритм выводимого ключа при "deriveKey"; либо алгоритм ключа, экспортируемого перед упаковкой при "wrapKey"; либо алгоритм ключа, импортируемого после распаковки при "unwrapKey"; либо алгоритм ключа, импортируемого после инкапсуляции/декапсуляции при "encapsulateKey" или "decapsulateKey". По умолчанию: null, если операция — "deriveBits", иначе undefined.
  • Возвращает: <boolean> указывает, поддерживает ли реализация заданную операцию

Позволяет определять возможности в Web Crypto API и выяснять, поддерживается ли заданный идентификатор алгоритма (вместе с его параметрами) для указанной операции.

См. раздел Checking for runtime algorithm support с примером использования этого метода.

subtle.decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext)

Стабильность: 1.1 – Активная разработка

Получатель сообщения использует свой асимметричный закрытый ключ, чтобы расшифровать «инкапсулированный ключ» (ciphertext) и восстановить временный симметричный ключ (в виде ArrayBuffer), которым затем расшифровывается сообщение.

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

  • 'ML-KEM-512'2
  • 'ML-KEM-768'2
  • 'ML-KEM-1024'2

subtle.decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, usages)

Стабильность: 1.1 – Активная разработка

Получатель сообщения использует свой асимметричный закрытый ключ, чтобы расшифровать «инкапсулированный ключ» (ciphertext) и восстановить временный симметричный ключ (в виде CryptoKey), которым затем расшифровывается сообщение.

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

  • 'ML-KEM-512'2
  • 'ML-KEM-768'2
  • 'ML-KEM-1024'2

subtle.decrypt(algorithm, key, data)

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

По методу и параметрам из algorithm и ключевому материалу из key метод пытается расшифровать переданные data. При успехе промис выполняется с ArrayBuffer, содержащим открытый текст.

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

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

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

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

По методу и параметрам из algorithm и ключевому материалу из baseKey метод пытается сгенерировать length бит.

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

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

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

  • 'Argon2d'2
  • 'Argon2i'2
  • 'Argon2id'2
  • 'ECDH'
  • 'HKDF'
  • 'PBKDF2'
  • 'X25519'
  • 'X448'1

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

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

По методу и параметрам из algorithm и ключевому материалу из baseKey метод пытается сгенерировать новый CryptoKey по методу и параметрам в derivedKeyAlgorithm.

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

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

  • 'Argon2d'2
  • 'Argon2i'2
  • 'Argon2id'2
  • 'ECDH'
  • 'HKDF'
  • 'PBKDF2'
  • 'X25519'
  • 'X448'1

subtle.digest(algorithm, data)

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

По методу из algorithm метод пытается вычислить дайджест data. При успехе промис выполняется с ArrayBuffer, содержащим вычисленный дайджест.

Если algorithm задан как string, допустимы значения:

  • 'cSHAKE128'2
  • 'cSHAKE256'2
  • 'KT128'2
  • 'KT256'2
  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'2
  • 'SHA3-384'2
  • 'SHA3-512'2
  • 'TurboSHAKE128'2
  • 'TurboSHAKE256'2

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

subtle.encapsulateBits(encapsulationAlgorithm, encapsulationKey)

Стабильность: 1.1 – Активная разработка

Использует асимметричный открытый ключ получателя сообщения для шифрования временного симметричного ключа. Этот зашифрованный ключ — «инкапсулированный ключ» в виде EncapsulatedBits.

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

  • 'ML-KEM-512'2
  • 'ML-KEM-768'2
  • 'ML-KEM-1024'2

subtle.encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, usages)

Стабильность: 1.1 – Активная разработка

Использует асимметричный открытый ключ получателя сообщения для шифрования временного симметричного ключа. Этот зашифрованный ключ — «инкапсулированный ключ» в виде EncapsulatedKey.

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

  • 'ML-KEM-512'2
  • 'ML-KEM-768'2
  • 'ML-KEM-1024'2

subtle.encrypt(algorithm, key, data)

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

По методу и параметрам из algorithm и ключевому материалу из key метод пытается зашифровать data. При успехе промис выполняется с ArrayBuffer, содержащим шифротекст.

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

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

subtle.exportKey(format, key)

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

  • format <string> Должен быть одним из 'raw', 'pkcs8', 'spki', 'jwk', 'raw-secret'2, 'raw-public'2 или 'raw-seed'2.
  • key <CryptoKey>
  • Возвращает: <Promise> при успехе выполняется с ArrayBuffer | Object.

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

Если CryptoKey не извлекаемый, промис будет отклонён.

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

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

Поддерживаемый алгоритм ключа 'spki' 'pkcs8' 'jwk' 'raw' 'raw-secret' 'raw-public' 'raw-seed'
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'2
'ChaCha20-Poly1305'2
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'1
'HMAC'
'KMAC128'2
'KMAC256'2
'ML-DSA-44'2
'ML-DSA-65'2
'ML-DSA-87'2
'ML-KEM-512'2
'ML-KEM-768'2
'ML-KEM-1024'2
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'

subtle.getPublicKey(key, keyUsages)

Стабильность: 1.1 – Активная разработка

  • key <CryptoKey> Закрытый ключ, из которого выводится соответствующий открытый ключ.
  • keyUsages <string[]> См. Key usages.
  • Возвращает: <Promise> при успехе выполняется с CryptoKey.

Выводит открытый ключ из заданного закрытого ключа.

subtle.generateKey(algorithm, extractable, keyUsages)

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

По параметрам из algorithm метод пытается сгенерировать новый ключевой материал. В зависимости от алгоритма получается один CryptoKey или CryptoKeyPair.

Алгоритмы, при которых генерируется CryptoKeyPair (открытый и закрытый ключ):

  • 'ECDH'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'1
  • 'ML-DSA-44'2
  • 'ML-DSA-65'2
  • 'ML-DSA-87'2
  • 'ML-KEM-512'2
  • 'ML-KEM-768'2
  • 'ML-KEM-1024'2
  • 'RSA-OAEP'
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'
  • 'X25519'
  • 'X448'1

Алгоритмы, при которых генерируется CryptoKey (секретный ключ):

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'2
  • 'ChaCha20-Poly1305'2
  • 'HMAC'
  • 'KMAC128'2
  • 'KMAC256'2

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

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

Метод пытается интерпретировать переданные keyData в формате format и создать экземпляр CryptoKey с использованием algorithm, extractable и keyUsages. При успешном импорте промис выполняется с CryptoKey, представляющим ключевой материал.

При импорте ключей алгоритмов KDF extractable должен быть false.

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

Поддерживаемый алгоритм ключа 'spki' 'pkcs8' 'jwk' 'raw' 'raw-secret' 'raw-public' 'raw-seed'
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'2
'Argon2d'2
'Argon2i'2
'Argon2id'2
'ChaCha20-Poly1305'2
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'1
'HDKF'
'HMAC'
'KMAC128'2
'KMAC256'2
'ML-DSA-44'2
'ML-DSA-65'2
'ML-DSA-87'2
'ML-KEM-512'2
'ML-KEM-768'2
'ML-KEM-1024'2
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'X25519'
'X448'1

subtle.sign(algorithm, key, data)

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

По методу и параметрам из algorithm и ключевому материалу из key метод пытается сформировать криптографическую подпись data. При успехе промис выполняется с ArrayBuffer, содержащим подпись.

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

  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'1
  • 'HMAC'
  • 'KMAC128'2
  • 'KMAC256'2
  • 'ML-DSA-44'2
  • 'ML-DSA-65'2
  • 'ML-DSA-87'2
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'

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

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

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

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

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

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

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'2
  • 'ChaCha20-Poly1305'2
  • 'ECDH'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'1
  • 'HMAC'
  • 'KMAC128'1
  • 'KMAC256'1
  • 'ML-DSA-44'2
  • 'ML-DSA-65'2
  • 'ML-DSA-87'2
  • 'ML-KEM-512'2
  • 'ML-KEM-768'2
  • 'ML-KEM-1024'2
  • 'RSA-OAEP'
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'
  • 'X25519'
  • 'X448'1

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

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

По методу и параметрам из algorithm и ключевому материалу из key метод пытается проверить, что signature является действительной криптографической подписью data. Промис выполняется со значением true или false.

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

  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'1
  • 'HMAC'
  • 'KMAC128'1
  • 'KMAC256'1
  • 'ML-DSA-44'2
  • 'ML-DSA-65'2
  • 'ML-DSA-87'2
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'

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

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

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

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

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

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

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

Класс: Algorithm

Algorithm.name

Класс: AeadParams

aeadParams.additionalData

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

aeadParams.iv

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

aeadParams.name

  • Тип: <string> Должно быть 'AES-GCM', 'AES-OCB', или 'ChaCha20-Poly1305'.

aeadParams.tagLength

  • Тип: <number> Размер в битах сгенерированного тега аутентификации.

Класс: AesDerivedKeyParams

aesDerivedKeyParams.name

  • Тип: <string> Должно быть одним из 'AES-CBC', 'AES-CTR', 'AES-GCM', 'AES-OCB', или 'AES-KW'

aesDerivedKeyParams.length

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

Класс: AesCbcParams

aesCbcParams.iv

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

aesCbcParams.name

  • Тип: <string> Должно быть 'AES-CBC'.

Класс: AesCtrParams

aesCtrParams.counter

Начальное значение блока счётчика. Длина ровно 16 байт.

В режиме AES-CTR правые length бит блока используются как счётчик, остальные биты — как одноразовое число (nonce).

aesCtrParams.length

  • Тип: <number> Число бит в aesCtrParams.counter, используемых в качестве счётчика.

aesCtrParams.name

  • Тип: <string> Должно быть 'AES-CTR'.

Класс: AesKeyAlgorithm

aesKeyAlgorithm.length

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

aesKeyAlgorithm.name

Класс: AesKeyGenParams

aesKeyGenParams.length

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

aesKeyGenParams.name

  • Тип: <string> Должно быть одним из 'AES-CBC', 'AES-CTR', 'AES-GCM', или 'AES-KW'

Класс: Argon2Params

argon2Params.associatedData

Необязательные связанные данные.

argon2Params.memory

Объём памяти в кибибайтах. Должен быть не меньше 8-кратной степени параллелизма.

argon2Params.name

  • Тип: <string> Должно быть одним из 'Argon2d', 'Argon2i', или 'Argon2id'.

argon2Params.nonce

Одноразовое число (nonce), в приложениях хеширования паролей используется как соль.

argon2Params.parallelism

Степень параллелизма.

argon2Params.passes

Число проходов.

argon2Params.secretValue

Необязательное секретное значение.

argon2Params.version

Номер версии Argon2. По умолчанию и сейчас единственно определённая версия — 19 (0x13).

Класс: ContextParams

contextParams.name

  • Тип: <string> Должно быть Ed4481, 'ML-DSA-44'2, 'ML-DSA-65'2, или 'ML-DSA-87'2.

contextParams.context

Добавлено в: v24.7.0

Свойство context задаёт необязательные контекстные данные, связываемые с сообщением.

Класс: CShakeParams

Добавлено в: v24.7.0

cShakeParams.name

  • Тип: <string> Должно быть 'cSHAKE128'2 или 'cSHAKE256'2

cShakeParams.outputLength

  • Тип: <number> запрашиваемая длина вывода в битах.

cShakeParams.functionName

Свойство functionName задаёт имя функции, которое NIST использует для определения функций на основе cSHAKE. Реализация Web Crypto API в Node.js поддерживает только нулевую длину functionName, что эквивалентно отсутствию functionName.

cShakeParams.customization

Свойство customization задаёт строку настройки. Реализация Web Crypto API в Node.js поддерживает только нулевую длину customization, что эквивалентно отсутствию customization.

Класс: EcdhKeyDeriveParams

ecdhKeyDeriveParams.name

  • Тип: <string> Должно быть 'ECDH', 'X25519', или 'X448'1.

ecdhKeyDeriveParams.public

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

Класс: EcdsaParams

ecdsaParams.hash

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

Если задано как string, значение должно быть одним из:

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

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

ecdsaParams.name

  • Тип: <string> Должно быть 'ECDSA'.

Класс: EcKeyAlgorithm

ecKeyAlgorithm.name

ecKeyAlgorithm.namedCurve

Класс: EcKeyGenParams

ecKeyGenParams.name

  • Тип: <string> Должно быть одним из 'ECDSA' или 'ECDH'.

ecKeyGenParams.namedCurve

  • Тип: <string> Должно быть одним из 'P-256', 'P-384', 'P-521'.

Класс: EcKeyImportParams

ecKeyImportParams.name

  • Тип: <string> Должно быть одним из 'ECDSA' или 'ECDH'.

ecKeyImportParams.namedCurve

  • Тип: <string> Должно быть одним из 'P-256', 'P-384', 'P-521'.

Класс: EncapsulatedBits

Временный симметричный секретный ключ (в виде ArrayBuffer) для шифрования сообщения и шифротекст (его можно передать получателю вместе с сообщением), зашифрованный этим общим ключом. Получатель своим закрытым ключом восстанавливает общий ключ и расшифровывает сообщение.

encapsulatedBits.ciphertext

encapsulatedBits.sharedKey

Класс: EncapsulatedKey

Временный симметричный секретный ключ (в виде CryptoKey) для шифрования сообщения и шифротекст (его можно передать получателю вместе с сообщением), зашифрованный этим общим ключом. Получатель своим закрытым ключом восстанавливает общий ключ и расшифровывает сообщение.

encapsulatedKey.ciphertext

encapsulatedKey.sharedKey

Класс: HkdfParams

hkdfParams.hash

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

Если задано как string, значение должно быть одним из:

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

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

hkdfParams.info

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

hkdfParams.name

  • Тип: <string> Должно быть 'HKDF'.

hkdfParams.salt

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

Класс: HmacImportParams

hmacImportParams.hash

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

Если задано как string, значение должно быть одним из:

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

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

hmacImportParams.length

Необязательное число бит в ключе HMAC. Обычно не указывается.

hmacImportParams.name

  • Тип: <string> Должно быть 'HMAC'.

Класс: HmacKeyAlgorithm

hmacKeyAlgorithm.hash

hmacKeyAlgorithm.length

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

hmacKeyAlgorithm.name

Класс: HmacKeyGenParams

hmacKeyGenParams.hash

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

Если задано как string, значение должно быть одним из:

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

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

hmacKeyGenParams.length

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

hmacKeyGenParams.name

  • Тип: <string> Должно быть 'HMAC'.

Класс: KeyAlgorithm

keyAlgorithm.name

Класс: KangarooTwelveParams

kangarooTwelveParams.customization

Необязательная строка настройки для KangarooTwelve.

kangarooTwelveParams.name

  • Тип: <string> Должно быть 'KT128'2 или 'KT256'2

kangarooTwelveParams.outputLength

  • Тип: <number> запрашиваемая длина вывода в битах.

Класс: KmacImportParams

kmacImportParams.length

Необязательное число бит в ключе KMAC. Обычно не указывается.

kmacImportParams.name

  • Тип: <string> Должно быть 'KMAC128' или 'KMAC256'.

Класс: KmacKeyAlgorithm

kmacKeyAlgorithm.length

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

kmacKeyAlgorithm.name

Класс: KmacKeyGenParams

kmacKeyGenParams.length

Число бит для генерируемого ключа KMAC. Если не указано, длина определяется используемым алгоритмом KMAC. Обычно не указывается.

kmacKeyGenParams.name

  • Тип: <string> Должно быть 'KMAC128' или 'KMAC256'.

Класс: KmacParams

Добавлено в: v24.8.0

kmacParams.algorithm

  • Тип: <string> Должно быть 'KMAC128' или 'KMAC256'.

kmacParams.outputLength

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

kmacParams.customization

Свойство customization задаёт необязательную строку настройки.

Класс: Pbkdf2Params

pbkdf2Params.hash

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

Если задано как string, значение должно быть одним из:

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

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

pbkdf2Params.iterations

Число итераций PBKDF2 при выводе битов.

pbkdf2Params.name

  • Тип: <string> Должно быть 'PBKDF2'.

pbkdf2Params.salt

Рекомендуется не менее 16 случайных или псевдослучайных байт.

Класс: RsaHashedImportParams

rsaHashedImportParams.hash

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

Если задано как string, значение должно быть одним из:

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

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

rsaHashedImportParams.name

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

Класс: RsaHashedKeyAlgorithm

rsaHashedKeyAlgorithm.hash

rsaHashedKeyAlgorithm.modulusLength

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

rsaHashedKeyAlgorithm.name

rsaHashedKeyAlgorithm.publicExponent

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

Класс: RsaHashedKeyGenParams

rsaHashedKeyGenParams.hash

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

Если задано как string, значение должно быть одним из:

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

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

rsaHashedKeyGenParams.modulusLength

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

rsaHashedKeyGenParams.name

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

rsaHashedKeyGenParams.publicExponent

Открытая экспонента RSA. Должна быть Uint8Array с целым без знака в формате big-endian, помещающимся в 32 бита. В Uint8Array допустимы ведущие нулевые биты. Значение должно быть простым. Если нет причин выбирать другое, используйте new Uint8Array([1, 0, 1]) (65537) в качестве открытой экспоненты.

Класс: RsaOaepParams

rsaOaepParams.label

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

Параметр rsaOaepParams.label необязателен.

rsaOaepParams.name

  • Тип: <string> Должно быть 'RSA-OAEP'.

Класс: RsaPssParams

rsaPssParams.name

  • Тип: <string> Должно быть 'RSA-PSS'.

rsaPssParams.saltLength

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

Класс: TurboShakeParams

turboShakeParams.domainSeparation

Необязательный байт разделения доменов (0x01–0x7f). По умолчанию: 0x1f.

turboShakeParams.name

  • Тип: <string> Должно быть 'TurboSHAKE128'2 или 'TurboSHAKE256'2

turboShakeParams.outputLength

  • Тип: <number> запрашиваемая длина вывода в битах.

Комментарии