Web Crypto API
Node.js предоставляет реализацию стандартного Web Crypto API.
Для доступа к этому модулю используйте globalThis.crypto или require('node:crypto').webcrypto.
const { subtle } = globalThis.crypto;
(async function() {
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const enc = new TextEncoder();
const message = enc.encode('I love cupcakes');
const digest = await subtle.sign({
name: 'HMAC',
}, key, message);
})(); copy Примеры
Создание ключей
Класс <SubtleCrypto> можно использовать для создания симметричных (секретных) ключей или асимметричных пар ключей (открытого и закрытого ключей).
Ключи AES
const { subtle } = globalThis.crypto;
async function generateAesKey(length = 256) {
const key = await subtle.generateKey({
name: 'AES-CBC',
length,
}, true, ['encrypt', 'decrypt']);
return key;
} copy Пары ключей ECDSA
const { subtle } = globalThis.crypto;
async function generateEcKey(namedCurve = 'P-521') {
const {
publicKey,
privateKey,
} = await subtle.generateKey({
name: 'ECDSA',
namedCurve,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
} copy Пары ключей Ed25519/X25519
const { subtle } = globalThis.crypto;
async function generateEd25519Key() {
return subtle.generateKey({
name: 'Ed25519',
}, true, ['sign', 'verify']);
}
async function generateX25519Key() {
return subtle.generateKey({
name: 'X25519',
}, true, ['deriveKey']);
} copy Ключи HMAC
const { subtle } = globalThis.crypto;
async function generateHmacKey(hash = 'SHA-256') {
const key = await subtle.generateKey({
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return key;
} copy Пары ключей RSA
const { subtle } = globalThis.crypto;
const publicExponent = new Uint8Array([1, 0, 1]);
async function generateRsaKey(modulusLength = 2048, hash = 'SHA-256') {
const {
publicKey,
privateKey,
} = await subtle.generateKey({
name: 'RSASSA-PKCS1-v1_5',
modulusLength,
publicExponent,
hash,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
} copy Шифрование и расшифрование
const crypto = globalThis.crypto;
async function aesEncrypt(plaintext) {
const ec = new TextEncoder();
const key = await generateAesKey();
const iv = crypto.getRandomValues(new Uint8Array(16));
const ciphertext = await crypto.subtle.encrypt({
name: 'AES-CBC',
iv,
}, key, ec.encode(plaintext));
return {
key,
iv,
ciphertext,
};
}
async function aesDecrypt(ciphertext, key, iv) {
const dec = new TextDecoder();
const plaintext = await crypto.subtle.decrypt({
name: 'AES-CBC',
iv,
}, key, ciphertext);
return dec.decode(plaintext);
} copy Экспорт и импорт ключей
const { subtle } = globalThis.crypto;
async function generateAndExportHmacKey(format = 'jwk', hash = 'SHA-512') {
const key = await subtle.generateKey({
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return subtle.exportKey(format, key);
}
async function importHmacKey(keyData, format = 'jwk', hash = 'SHA-512') {
const key = await subtle.importKey(format, keyData, {
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return key;
} copy Упаковка и распаковка ключей
const { subtle } = globalThis.crypto;
async function generateAndWrapHmacKey(format = 'jwk', hash = 'SHA-512') {
const [
key,
wrappingKey,
] = await Promise.all([
subtle.generateKey({
name: 'HMAC', hash,
}, true, ['sign', 'verify']),
subtle.generateKey({
name: 'AES-KW',
length: 256,
}, true, ['wrapKey', 'unwrapKey']),
]);
const wrappedKey = await subtle.wrapKey(format, key, wrappingKey, 'AES-KW');
return { wrappedKey, wrappingKey };
}
async function unwrapHmacKey(
wrappedKey,
wrappingKey,
format = 'jwk',
hash = 'SHA-512') {
const key = await subtle.unwrapKey(
format,
wrappedKey,
wrappingKey,
'AES-KW',
{ name: 'HMAC', hash },
true,
['sign', 'verify']);
return key;
} copy Подписание и проверка
const { subtle } = globalThis.crypto;
async function sign(key, data) {
const ec = new TextEncoder();
const signature =
await subtle.sign('RSASSA-PKCS1-v1_5', key, ec.encode(data));
return signature;
}
async function verify(key, signature, data) {
const ec = new TextEncoder();
const verified =
await subtle.verify(
'RSASSA-PKCS1-v1_5',
key,
signature,
ec.encode(data));
return verified;
} copy Получение битов и ключей
const { subtle } = globalThis.crypto;
async function pbkdf2(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const key = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveBits']);
const bits = await subtle.deriveBits({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations,
}, key, length);
return bits;
}
async function pbkdf2Key(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const keyMaterial = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveKey']);
const key = await subtle.deriveKey({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations,
}, keyMaterial, {
name: 'AES-GCM',
length,
}, true, ['encrypt', 'decrypt']);
return key;
} copy Хеширование
const { subtle } = globalThis.crypto;
async function digest(data, algorithm = 'SHA-512') {
const ec = new TextEncoder();
const digest = await subtle.digest(algorithm, ec.encode(data));
return digest;
} copy Матрица алгоритмов
В таблице подробно описаны алгоритмы, поддерживаемые реализацией Web Crypto API в Node.js, и поддерживаемые для каждого из них API:
| Алгоритм | generateKey |
exportKey |
importKey |
encrypt |
decrypt |
wrapKey |
unwrapKey |
deriveBits |
deriveKey |
sign |
verify |
digest |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'RSA-PSS' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'RSA-OAEP' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'ECDSA' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'Ed25519' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'Ed448' 1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'ECDH' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'X25519' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'X448' 1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'AES-CTR' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-CBC' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-GCM' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-KW' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HMAC' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HKDF' |
✔ | ✔ | ✔ | ✔ | ||||||||
'PBKDF2' |
✔ | ✔ | ✔ | ✔ | ||||||||
'SHA-1' |
✔ | |||||||||||
'SHA-256' |
✔ | |||||||||||
'SHA-384' |
✔ | |||||||||||
'SHA-512' |
✔ |
Класс: Crypto
globalThis.crypto — это экземпляр класса Crypto. Crypto — это singleton, предоставляющий доступ к остальной части криптографического API.
crypto.getRandomValues(typedArray)
-
typedArray<Buffer> | <TypedArray> - Возвращает: <Buffer> | <TypedArray>
Генерирует криптографически стойкие случайные значения. Указанный typedArray заполняется случайными значениями, после чего возвращается ссылка на typedArray.
Указанный typedArray должен быть экземпляром целочисленного типа <TypedArray>, то есть Float32Array и Float64Array не принимаются.
Если размер указанного typedArray превышает 65 536 байт, будет выброшена ошибка.
Класс: CryptoKey
cryptoKey.algorithm
- Тип: <KeyAlgorithm> | <RsaHashedKeyAlgorithm> | <EcKeyAlgorithm> | <AesKeyAlgorithm> | <HmacKeyAlgorithm>
Объект, описывающий алгоритм, для которого можно использовать ключ, а также дополнительные параметры, специфичные для алгоритма.
Только для чтения.
cryptoKey.extractable
- Тип: <boolean>
Если значение true, <CryptoKey> можно извлечь с помощью subtleCrypto.exportKey() или subtleCrypto.wrapKey().
Только для чтения.
cryptoKey.type
- Тип: <string> Одно из значений:
'secret','private'или'public'.
Строка, указывающая, является ли ключ симметричным ('secret') или асимметричным ('private' или 'public').
cryptoKey.usages
- Тип: <string[]>
Массив строк, указывающих операции, для которых можно использовать ключ.
Возможные варианты использования:
-
'encrypt'— ключ можно использовать для шифрования данных. -
'decrypt'— ключ можно использовать для расшифрования данных. -
'sign'— ключ можно использовать для создания цифровых подписей. -
'verify'— ключ можно использовать для проверки цифровых подписей. -
'deriveKey'— ключ можно использовать для получения нового ключа. -
'deriveBits'— ключ можно использовать для получения битов. -
'wrapKey'— ключ можно использовать для упаковки другого ключа. -
'unwrapKey'— ключ можно использовать для распаковки другого ключа.
Допустимые варианты использования ключа зависят от алгоритма ключа (определяемого с помощью cryptokey.algorithm.name).
| Поддерживаемый алгоритм ключа | 'encrypt' |
'decrypt' |
'sign' |
'verify' |
'deriveKey' |
'deriveBits' |
'wrapKey' |
'unwrapKey' |
|---|---|---|---|---|---|---|---|---|
'AES-CBC' |
✔ | ✔ | ✔ | ✔ | ||||
'AES-CTR' |
✔ | ✔ | ✔ | ✔ | ||||
'AES-GCM' |
✔ | ✔ | ✔ | ✔ | ||||
'AES-KW' |
✔ | ✔ | ||||||
'ECDH' |
✔ | ✔ | ||||||
'X25519' |
✔ | ✔ | ||||||
'X448' 1
|
✔ | ✔ | ||||||
'ECDSA' |
✔ | ✔ | ||||||
'Ed25519' |
✔ | ✔ | ||||||
'Ed448' 1
|
✔ | ✔ | ||||||
'HDKF' |
✔ | ✔ | ||||||
'HMAC' |
✔ | ✔ | ||||||
'PBKDF2' |
✔ | ✔ | ||||||
'RSA-OAEP' |
✔ | ✔ | ✔ | ✔ | ||||
'RSA-PSS' |
✔ | ✔ | ||||||
'RSASSA-PKCS1-v1_5' |
✔ | ✔ |
Класс: CryptoKeyPair
CryptoKeyPair — это простой объект-словарь со свойствами publicKey и privateKey, представляющий асимметричную пару ключей.
cryptoKeyPair.privateKey
- Тип: <CryptoKey> Объект <CryptoKey>, значение
typeкоторого будет'private'.
cryptoKeyPair.publicKey
- Тип: <CryptoKey> Объект <CryptoKey>, значение
typeкоторого будет'public'.
Класс: SubtleCrypto
subtle.decrypt(algorithm, key, data)
-
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])
-
algorithm<EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> -
baseKey<CryptoKey> -
length<number> | <null> По умолчанию:null - Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.
Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный baseKey, subtle.deriveBits() пытается сгенерировать length бит.
Если length не задан или null, генерируется максимально возможное для данного алгоритма число бит. Это допустимо для алгоритмов 'ECDH', 'X25519' и 'X448'; для остальных алгоритмов length должен быть числом.
В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим сгенерированные данные.
В настоящее время поддерживаются следующие алгоритмы:
'ECDH''X25519'-
'X448'1 'HKDF''PBKDF2'
subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
-
algorithm<EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> -
baseKey<CryptoKey> -
derivedKeyAlgorithm<string> | <Algorithm> | <HmacImportParams> | <AesDerivedKeyParams> -
extractable<boolean> -
keyUsages<string[]> См. Использование ключа. - Возвращает: <Promise> При успешном выполнении возвращает <CryptoKey>.
Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный baseKey, subtle.deriveKey() пытается создать новый <CryptoKey> на основе метода и параметров из derivedKeyAlgorithm.
Вызов subtle.deriveKey() эквивалентен вызову subtle.deriveBits() для генерации исходного ключевого материала с последующей передачей результата в метод subtle.importKey() в качестве входных данных с параметрами deriveKeyAlgorithm, extractable и keyUsages.
В настоящее время поддерживаются следующие алгоритмы:
'ECDH''X25519'-
'X448'1 'HKDF''PBKDF2'
subtle.digest(algorithm, data)
-
algorithm<string> | <Algorithm> -
data<ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.
Используя метод, определённый в algorithm, subtle.digest() пытается вычислить дайджест для data. В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим вычисленный дайджест.
Если algorithm задан как <string>, его значение должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если algorithm задан как <Object>, он должен иметь свойство name, значение которого должно быть одним из перечисленных выше.
subtle.encrypt(algorithm, key, data)
-
algorithm<RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> -
key<CryptoKey> -
data<ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.
Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный key, subtle.encrypt() пытается зашифровать data. В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим результат шифрования.
В настоящее время поддерживаются следующие алгоритмы:
'RSA-OAEP''AES-CTR''AES-CBC''AES-GCM'
subtle.exportKey(format, key)
-
format<string> Должно быть одним из значений'raw','pkcs8','spki'или'jwk'. -
key<CryptoKey> - Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer> | <Object>.
Экспортирует указанный ключ в заданном формате, если он поддерживается.
Если <CryptoKey> не является извлекаемым, возвращённое обещание будет отклонено.
Если format имеет значение 'pkcs8' или 'spki' и экспорт выполнен успешно, возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим экспортированные данные ключа.
Если format имеет значение 'jwk' и экспорт выполнен успешно, возвращённое обещание будет выполнено с объектом JavaScript, соответствующим спецификации JSON Web Key.
| Поддерживаемый алгоритм ключа | 'spki' |
'pkcs8' |
'jwk' |
'raw' |
|---|---|---|---|---|
'AES-CBC' |
✔ | ✔ | ||
'AES-CTR' |
✔ | ✔ | ||
'AES-GCM' |
✔ | ✔ | ||
'AES-KW' |
✔ | ✔ | ||
'ECDH' |
✔ | ✔ | ✔ | ✔ |
'ECDSA' |
✔ | ✔ | ✔ | ✔ |
'Ed25519' |
✔ | ✔ | ✔ | ✔ |
'Ed448' 1
|
✔ | ✔ | ✔ | ✔ |
'HMAC' |
✔ | ✔ | ||
'RSA-OAEP' |
✔ | ✔ | ✔ | |
'RSA-PSS' |
✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ |
subtle.generateKey(algorithm, extractable, keyUsages)
-
algorithm<string> | <Algorithm> | <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams> | <AesKeyGenParams>
-
extractable<boolean> -
keyUsages<string[]> См. Использование ключа. - Возвращает: <Promise> При успешном выполнении возвращает <CryptoKey> | <CryptoKeyPair>.
Используя метод и параметры, предоставленные в algorithm, subtle.generateKey() пытается сгенерировать новый ключевой материал. В зависимости от используемого метода он может сгенерировать либо один <CryptoKey>, либо <CryptoKeyPair>.
Поддерживаются следующие алгоритмы генерации <CryptoKeyPair> (открытого и закрытого ключей):
Поддерживаются следующие алгоритмы генерации <CryptoKey> (секретного ключа):
'HMAC''AES-CTR''AES-CBC''AES-GCM''AES-KW'
subtle.importKey(format, keyData, algorithm, extractable, keyUsages)
-
format<string> Должно быть одним из значений'raw','pkcs8','spki'или'jwk'. -
keyData<ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <Object>
-
algorithm<string> | <Algorithm> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
-
extractable<boolean> -
keyUsages<string[]> См. Использование ключа. - Возвращает: <Promise> При успешном выполнении возвращает <CryptoKey>.
Метод subtle.importKey() пытается интерпретировать предоставленный keyData как указанный format и создать экземпляр <CryptoKey> с использованием аргументов algorithm, extractable и keyUsages. Если импорт выполнен успешно, возвращённое обещание будет выполнено с созданным <CryptoKey>.
При импорте ключа 'PBKDF2' значение extractable должно быть false.
В настоящее время поддерживаются следующие алгоритмы:
| Поддерживаемый алгоритм ключа | 'spki' |
'pkcs8' |
'jwk' |
'raw' |
|---|---|---|---|---|
'AES-CBC' |
✔ | ✔ | ||
'AES-CTR' |
✔ | ✔ | ||
'AES-GCM' |
✔ | ✔ | ||
'AES-KW' |
✔ | ✔ | ||
'ECDH' |
✔ | ✔ | ✔ | ✔ |
'X25519' |
✔ | ✔ | ✔ | ✔ |
'X448' 1
|
✔ | ✔ | ✔ | ✔ |
'ECDSA' |
✔ | ✔ | ✔ | ✔ |
'Ed25519' |
✔ | ✔ | ✔ | ✔ |
'Ed448' 1
|
✔ | ✔ | ✔ | ✔ |
'HDKF' |
✔ | |||
'HMAC' |
✔ | ✔ | ||
'PBKDF2' |
✔ | |||
'RSA-OAEP' |
✔ | ✔ | ✔ | |
'RSA-PSS' |
✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ |
subtle.sign(algorithm, key, data)
-
algorithm<string> | <Algorithm> | <RsaPssParams> | <EcdsaParams> | <Ed448Params> -
key<CryptoKey> -
data<ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> При успешном выполнении возвращает <ArrayBuffer>.
Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный key, subtle.sign() пытается создать криптографическую подпись для data. В случае успеха возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим созданную подпись.
В настоящее время поддерживаются следующие алгоритмы:
'RSASSA-PKCS1-v1_5''RSA-PSS''ECDSA''Ed25519'-
'Ed448'1 'HMAC'
subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages)
-
format<string> Должно быть одним из'raw','pkcs8','spki'или'jwk'. -
wrappedKey<ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> -
unwrappingKey<CryptoKey>
-
unwrapAlgo<string> | <Algorithm> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> -
unwrappedKeyAlgo<string> | <Algorithm> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
-
extractable<boolean> -
keyUsages<string[]> См. Назначения ключа. - Возвращает: <Promise> При успешном выполнении разрешается значением <CryptoKey>.
В криптографии «обёртывание ключа» означает экспорт и последующее шифрование ключевого материала. Метод subtle.unwrapKey() пытается расшифровать обёрнутый ключ и создать экземпляр <CryptoKey>. Он эквивалентен вызову subtle.decrypt() сначала для зашифрованных данных ключа (с использованием аргументов wrappedKey, unwrapAlgo и unwrappingKey в качестве входных данных), а затем передаче результата методу subtle.importKey() с аргументами unwrappedKeyAlgo, extractable и keyUsages в качестве входных данных. При успешном выполнении возвращённый промис разрешается объектом <CryptoKey>.
В настоящее время поддерживаются следующие алгоритмы обёртывания:
'RSA-OAEP''AES-CTR''AES-CBC''AES-GCM''AES-KW'
Поддерживаются следующие алгоритмы для распакованного ключа:
subtle.verify(algorithm, key, signature, data)
-
algorithm<string> | <Algorithm> | <RsaPssParams> | <EcdsaParams> | <Ed448Params> -
key<CryptoKey> -
signature<ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> -
data<ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> При успешном выполнении разрешается значением <boolean>.
Используя метод и параметры, указанные в algorithm, а также ключевой материал, предоставленный key, метод subtle.verify() пытается проверить, является ли signature допустимой криптографической подписью data. Возвращённый промис разрешается значением true или false.
В настоящее время поддерживаются следующие алгоритмы:
'RSASSA-PKCS1-v1_5''RSA-PSS''ECDSA''Ed25519'-
'Ed448'1 'HMAC'
subtle.wrapKey(format, key, wrappingKey, wrapAlgo)
-
format<string> Должно быть одним из'raw','pkcs8','spki'или'jwk'. -
key<CryptoKey> -
wrappingKey<CryptoKey> -
wrapAlgo<string> | <Algorithm> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> - Возвращает: <Promise> При успешном выполнении разрешается значением <ArrayBuffer>.
В криптографии «обёртывание ключа» означает экспорт и последующее шифрование ключевого материала. Метод subtle.wrapKey() экспортирует ключевой материал в формате, обозначенном format, а затем шифрует его с помощью метода и параметров, указанных в wrapAlgo, и ключевого материала, предоставленного wrappingKey. Он эквивалентен вызову subtle.exportKey() с использованием format и key в качестве аргументов, а затем передаче результата методу subtle.encrypt() с использованием wrappingKey и wrapAlgo в качестве входных данных. При успешном выполнении возвращённый промис разрешается значением <ArrayBuffer>, содержащим зашифрованные данные ключа.
В настоящее время поддерживаются следующие алгоритмы обёртывания:
'RSA-OAEP''AES-CTR''AES-CBC''AES-GCM''AES-KW'
Параметры алгоритмов
Объекты параметров алгоритмов определяют методы и параметры, используемые различными методами <SubtleCrypto>. Хотя здесь они описаны как «классы», это простые объекты-словари JavaScript.
Класс: Algorithm
Algorithm.name
- Тип: <string>
Класс: AesDerivedKeyParams
aesDerivedKeyParams.name
- Тип: <string> Должно быть одним из
'AES-CBC','AES-CTR','AES-GCM'или'AES-KW'
aesDerivedKeyParams.length
- Тип: <number>
Длина производимого ключа AES. Она должна составлять 128, 192 или 256.
Класс: AesCbcParams
aesCbcParams.iv
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Задает вектор инициализации. Его длина должна составлять ровно 16 байт; он должен быть непредсказуемым и криптографически случайным.
aesCbcParams.name
- Тип: <string> Должно быть
'AES-CBC'.
Класс: AesCtrParams
aesCtrParams.counter
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Начальное значение блока счетчика. Его длина должна составлять ровно 16 байт.
Метод AES-CTR использует length крайних справа бит блока в качестве счетчика, а остальные биты — в качестве nonce.
aesCtrParams.length
- Тип: <number> Количество битов в
aesCtrParams.counter, используемых в качестве счетчика.
aesCtrParams.name
- Тип: <string> Должно быть
'AES-CTR'.
Класс: AesGcmParams
aesGcmParams.additionalData
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <undefined>
В методе AES-GCM параметр additionalData представляет собой дополнительные входные данные, которые не шифруются, но участвуют в аутентификации данных. Использование additionalData необязательно.
aesGcmParams.iv
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Вектор инициализации должен быть уникальным для каждой операции шифрования с использованием данного ключа.
В идеале это детерминированное значение длиной 12 байт, вычисляемое таким образом, чтобы гарантировать его уникальность во всех вызовах с использованием одного и того же ключа. В качестве альтернативы вектор инициализации может состоять как минимум из 12 криптографически случайных байт. Дополнительные сведения о формировании векторов инициализации для AES-GCM см. в разделе 8 документа NIST SP 800-38D.
aesGcmParams.name
- Тип: <string> Должно быть
'AES-GCM'.
aesGcmParams.tagLength
- Тип: <number> Размер генерируемого тега аутентификации в битах. Это значение должно быть одним из следующих:
32,64,96,104,112,120или128. По умолчанию:128.
Класс: AesKeyAlgorithm
aesKeyAlgorithm.name
- Тип: <string>
Класс: AesKeyGenParams
aesKeyGenParams.length
- Тип: <number>
Длина генерируемого ключа AES. Она должна составлять 128, 192 или 256.
aesKeyGenParams.name
- Тип: <string> Должно быть одним из
'AES-CBC','AES-CTR','AES-GCM'или'AES-KW'
Класс: EcdhKeyDeriveParams
ecdhKeyDeriveParams.name
- Тип: <string> Должно быть
'ECDH','X25519'или'X448'.
ecdhKeyDeriveParams.public
- Тип: <CryptoKey>
Для получения ключа ECDH в качестве входных данных используются закрытый ключ одной стороны и открытый ключ другой стороны, с помощью которых создается общий секрет. Свойству ecdhKeyDeriveParams.public присваивается открытый ключ другой стороны.
Класс: EcdsaParams
ecdsaParams.hash
- Тип: <string> | <Algorithm>
Если значение представлено как <string>, оно должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.
ecdsaParams.name
- Тип: <string> Должно быть
'ECDSA'.
Класс: 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'.
Класс: Ed448Params
ed448Params.name
- Тип: <string> Должно быть
'Ed448'.
ed448Params.context
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <undefined>
Элемент context представляет необязательные контекстные данные, связываемые с сообщением. Реализация Web Crypto API в Node.js поддерживает только контекст нулевой длины, что эквивалентно отсутствию контекста.
Класс: HkdfParams
hkdfParams.hash
- Тип: <string> | <Algorithm>
Если значение представлено как <string>, оно должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.
hkdfParams.info
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Задает контекстные входные данные, специфичные для приложения, для алгоритма HKDF. Они могут иметь нулевую длину, но должны быть указаны.
hkdfParams.name
- Тип: <string> Должно быть
'HKDF'.
hkdfParams.salt
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Значение соли значительно повышает надежность алгоритма HKDF. Оно должно быть случайным или псевдослучайным и иметь ту же длину, что и выходные данные функции хеширования (например, если в качестве дайджеста используется 'SHA-256', соль должна состоять из 256 бит случайных данных).
Класс: HmacImportParams
hmacImportParams.hash
- Тип: <string> | <Algorithm>
Если значение представлено как <string>, оно должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.
hmacImportParams.length
- Тип: <number>
Необязательное количество битов ключа HMAC. В большинстве случаев этот параметр следует опустить.
hmacImportParams.name
- Тип: <string> Должно быть
'HMAC'.
Класс: HmacKeyGenParams
hmacKeyGenParams.hash
- Тип: <string> | <Algorithm>
Если значение представлено как <string>, оно должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.
hmacKeyGenParams.length
- Тип: <number>
Количество битов, генерируемых для ключа HMAC. Если этот параметр не указан, длина определяется используемым алгоритмом хеширования. В большинстве случаев этот необязательный параметр следует опустить.
hmacKeyGenParams.name
- Тип: <string> Должно быть
'HMAC'.
Класс: KeyAlgorithm
keyAlgorithm.name
- Тип: <string>
Класс: Pbkdf2Params
pbkdf2Params.hash
- Тип: <string> | <Algorithm>
Если значение представлено как <string>, оно должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.
pbkdf2Params.name
- Тип: <string> Должно быть
'PBKDF2'.
pbkdf2Params.salt
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Должно содержать не менее 16 случайных или псевдослучайных байт.
Класс: RsaHashedImportParams
rsaHashedImportParams.hash
- Тип: <string> | <Algorithm>
Если значение представлено как <string>, оно должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если значение представлено как <Algorithm>, свойство name этого объекта должно иметь одно из перечисленных выше значений.
rsaHashedImportParams.name
- Тип: <string> Должно быть одним из
'RSASSA-PKCS1-v1_5','RSA-PSS'или'RSA-OAEP'.
Класс: RsaHashedKeyAlgorithm
rsaHashedKeyAlgorithm.hash
- Тип: <Algorithm>
rsaHashedKeyAlgorithm.name
- Тип: <string>
Класс: RsaHashedKeyGenParams
rsaHashedKeyGenParams.hash
- Тип: <string> | <Algorithm>
Если значение представлено в виде <string>, оно должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если значение представлено в виде <Algorithm>, свойство объекта name должно иметь одно из перечисленных выше значений.
rsaHashedKeyGenParams.modulusLength
- Тип: <number>
Длина модуля RSA в битах. Рекомендуется использовать значение не менее 2048.
rsaHashedKeyGenParams.name
- Тип: <string> Должно быть одним из значений
'RSASSA-PKCS1-v1_5','RSA-PSS'или'RSA-OAEP'.
rsaHashedKeyGenParams.publicExponent
- Тип: <Uint8Array>
Открытая экспонента RSA. Это должен быть <Uint8Array>, содержащий беззнаковое целое число в порядке от старшего байта к младшему, которое должно помещаться в 32 бита. <Uint8Array> может содержать произвольное количество начальных нулевых битов. Значение должно быть простым числом. Если нет причин использовать другое значение, в качестве открытой экспоненты следует использовать new Uint8Array([1, 0, 1]) (65537).
Класс: RsaOaepParams
rsaOaepParams.label
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Дополнительный набор байтов, который не будет зашифрован, но будет связан с полученным шифротекстом.
Параметр rsaOaepParams.label является необязательным.
rsaOaepParams.name
- Тип: <string> должно быть
'RSA-OAEP'.
Класс: RsaPssParams
rsaPssParams.name
- Тип: <string> Должно быть
'RSA-PSS'.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/webcrypto.html