API криптографии веб-приложений
Node.js предоставляет реализацию стандартного API криптографии веб-приложений.
Для доступа к этому модулю используйте globalThis.crypto или require('node:crypto').webcrypto.
const { subtle } = globalThis.crypto;
(async function() {
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const enc = new TextEncoder();
const message = enc.encode('I love cupcakes');
const digest = await subtle.sign({
name: 'HMAC',
}, key, message);
})(); copy Примеры
Генерация ключей
Класс <SubtleCrypto> может использоваться для генерации симметричных (секретных) ключей или асимметричных пар ключей (открытый и закрытый ключ).
Ключи AES
const { subtle } = globalThis.crypto;
async function generateAesKey(length = 256) {
const key = await subtle.generateKey({
name: 'AES-CBC',
length,
}, true, ['encrypt', 'decrypt']);
return key;
} copy Пары ключей ECDSA
const { subtle } = globalThis.crypto;
async function generateEcKey(namedCurve = 'P-521') {
const {
publicKey,
privateKey,
} = await subtle.generateKey({
name: 'ECDSA',
namedCurve,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
} copy Пары ключей Ed25519/Ed448/X25519/X448
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 Матрица алгоритмов
В таблице перечислены поддерживаемые реализацией 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' 1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'Ed448' 1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'ECDH' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'X25519' 1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'X448' 1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'AES-CTR' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-CBC' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-GCM' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-KW' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HMAC' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HKDF' |
✔ | ✔ | ✔ | ✔ | ||||||||
'PBKDF2' |
✔ | ✔ | ✔ | ✔ | ||||||||
'SHA-1' |
✔ | |||||||||||
'SHA-256' |
✔ | |||||||||||
'SHA-384' |
✔ | |||||||||||
'SHA-512' |
✔ |
Класс: Crypto
globalThis.crypto является экземпляром класса Crypto. Crypto — это синглтон, обеспечивающий доступ к остальной части API криптографии.
crypto.subtle
- Тип: <SubtleCrypto>
Обеспечивает доступ к 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
- Тип: <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' 1
|
✔ | ✔ | ||||||
'X448' 1
|
✔ | ✔ | ||||||
'ECDSA' |
✔ | ✔ | ||||||
'Ed25519' 1
|
✔ | ✔ | ||||||
'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: <AlgorithmIdentifier> | <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> -
baseKey: <CryptoKey> -
length: <number> | <null> - Возвращает: <Promise> Выполняется с <ArrayBuffer>
Используя метод и параметры, указанные в algorithm, и криптографические данные, предоставленные baseKey, subtle.deriveBits() пытается сгенерировать length бит.
Реализация Node.js требует, чтобы length при вводе числа было кратным 8.
Если length равно null, генерируется максимальное количество бит для данного алгоритма. Это разрешено для алгоритмов 'ECDH', 'X25519', и 'X448'.
При успехе возвращаемое обещание будет выполнено с <ArrayBuffer>, содержащим сгенерированные данные.
В настоящее время поддерживаются следующие алгоритмы:
subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
-
algorithm: <AlgorithmIdentifier> | <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> -
baseKey: <CryptoKey> -
derivedKeyAlgorithm: <HmacKeyGenParams> | <AesKeyGenParams> -
extractable: <boolean> -
keyUsages: <string[]> См. Использование ключей. - Возвращает: <Promise> Выполняется с <CryptoKey>
Используя метод и параметры, указанные в algorithm, и криптографические данные, предоставленные baseKey, subtle.deriveKey() пытается сгенерировать новый <CryptoKey> на основе метода и параметров в derivedKeyAlgorithm.
Вызов subtle.deriveKey() эквивалентен вызову subtle.deriveBits() для генерации исходных криптографических данных, а затем передаче результата в метод subtle.importKey() с параметрами deriveKeyAlgorithm, extractable, и keyUsages в качестве входных данных.
В настоящее время поддерживаются следующие алгоритмы:
subtle.digest(algorithm, data)
-
algorithm: <string> | <Object> -
data: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> Выполняется с <ArrayBuffer>
Используя метод, указанный в algorithm, subtle.digest() пытается вычислить хеш data. При успехе возвращаемое обещание выполняется с <ArrayBuffer>, содержащим вычисленный хеш.
Если algorithm предоставлен как <string>, он должен быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если algorithm предоставлен как <Object>, он должен содержать свойство name, значение которого является одним из вышеперечисленных.
subtle.encrypt(algorithm, key, data)
-
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: <строка> Должно быть одно из'raw','pkcs8','spki', или'jwk'. -
key: <CryptoKey> - Возвращает: <Обещание> Выполняется с <ArrayBuffer> | <Объект>.
Экспортирует указанный ключ в указанный формат, если это поддерживается.
Если <CryptoKey> не доступен для извлечения, возвращаемое обещание отклонится.
Когда format является либо 'pkcs8', либо 'spki', и экспорт успешен, возвращаемое обещание будет разрешено с <ArrayBuffer>, содержащим данные экспортированного ключа.
Когда format равно 'jwk', и экспорт успешен, возвращаемое обещание будет разрешено с JavaScript-объектом, соответствующим спецификации JSON Web Key.
| Тип ключа | 'spki' |
'pkcs8' |
'jwk' |
'raw' |
|---|---|---|---|---|
'AES-CBC' |
✔ | ✔ | ||
'AES-CTR' |
✔ | ✔ | ||
'AES-GCM' |
✔ | ✔ | ||
'AES-KW' |
✔ | ✔ | ||
'ECDH' |
✔ | ✔ | ✔ | ✔ |
'ECDSA' |
✔ | ✔ | ✔ | ✔ |
'Ed25519' 1
|
✔ | ✔ | ✔ | ✔ |
'Ed448' 1
|
✔ | ✔ | ✔ | ✔ |
'HDKF' |
||||
'HMAC' |
✔ | ✔ | ||
'PBKDF2' |
||||
'RSA-OAEP' |
✔ | ✔ | ✔ | |
'RSA-PSS' |
✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ |
subtle.generateKey(algorithm, extractable, keyUsages)
-
algorithm: <Идентификатор алгоритма> | <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams> | <AesKeyGenParams>
-
extractable: <булево> -
keyUsages: <массив строк> См. Использование ключей. - Возвращает: <Обещание> Выполняется с <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: <строка> Должно быть одно из'raw','pkcs8','spki', или'jwk'. -
keyData: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <Объект>
-
algorithm: <Идентификатор алгоритма> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
-
extractable: <булево> -
keyUsages: <массив строк> См. Использование ключей. - Возвращает: <Обещание> Выполняется с <CryptoKey>
Метод subtle.importKey() пытается интерпретировать предоставленный keyData как указанный format, чтобы создать экземпляр <CryptoKey> с использованием предоставленных аргументов algorithm, extractable, и keyUsages. Если импорт успешен, возвращаемое обещание будет разрешено созданным <CryptoKey>.
При импорте ключа 'PBKDF2' extractable должно быть false.
В настоящее время поддерживаются следующие алгоритмы:
| Тип ключа | 'spki' |
'pkcs8' |
'jwk' |
'raw' |
|---|---|---|---|---|
'AES-CBC' |
✔ | ✔ | ||
'AES-CTR' |
✔ | ✔ | ||
'AES-GCM' |
✔ | ✔ | ||
'AES-KW' |
✔ | ✔ | ||
'ECDH' |
✔ | ✔ | ✔ | ✔ |
'X25519' 1
|
✔ | ✔ | ✔ | ✔ |
'X448' 1
|
✔ | ✔ | ✔ | ✔ |
'ECDSA' |
✔ | ✔ | ✔ | ✔ |
'Ed25519' 1
|
✔ | ✔ | ✔ | ✔ |
'Ed448' 1
|
✔ | ✔ | ✔ | ✔ |
'HDKF' |
✔ | |||
'HMAC' |
✔ | ✔ | ||
'PBKDF2' |
✔ | |||
'RSA-OAEP' |
✔ | ✔ | ✔ | |
'RSA-PSS' |
✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ |
subtle.sign(algorithm, key, data)
-
algorithm: <AlgorithmIdentifier> | <RsaPssParams> | <EcdsaParams> | <Ed448Params> -
key: <CryptoKey> -
data: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> Выполняется с <ArrayBuffer>
Используя метод и параметры, заданные algorithm, и криптографический материал, предоставленный key, subtle.sign() пытается сгенерировать криптографическую подпись data. В случае успеха возвращаемое обещание разрешается с помощью <ArrayBuffer>, содержащего сгенерированную подпись.
В настоящее время поддерживаются следующие алгоритмы:
subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages)
-
format: <строка> Должно быть одним из'raw','pkcs8','spki', или'jwk'. -
wrappedKey: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> -
unwrappingKey: <CryptoKey>
-
unwrapAlgo: <AlgorithmIdentifier> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> -
unwrappedKeyAlgo: <AlgorithmIdentifier> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
-
extractable: <boolean> -
keyUsages: <массив строк> См. Использование ключей. - Возвращает: <Promise> Выполняется с <CryptoKey>
В криптографии "обертывание ключа" означает экспорт и последующее шифрование криптографического материала. Метод subtle.unwrapKey() пытается расшифровать обернутый ключ и создать экземпляр <CryptoKey>. Он эквивалентен вызову subtle.decrypt() сначала на зашифрованные данные ключа (используя аргументы wrappedKey, unwrapAlgo, и unwrappingKey в качестве входных данных), а затем передаче результатов в метод subtle.importKey() с использованием аргументов unwrappedKeyAlgo, extractable, и keyUsages в качестве входных данных. В случае успеха возвращаемое обещание разрешается с объектом <CryptoKey>.
В настоящее время поддерживаются следующие алгоритмы обертывания:
'RSA-OAEP''AES-CTR''AES-CBC''AES-GCM''AES-KW'
Поддерживаемые алгоритмы для расшифровки ключей:
'RSASSA-PKCS1-v1_5''RSA-PSS''RSA-OAEP''ECDSA'-
'Ed25519'1 -
'Ed448'1 'ECDH'-
'X25519'1 -
'X448'1 'HMAC''AES-CTR''AES-CBC''AES-GCM''AES-KW'
subtle.verify(algorithm, key, signature, data)
-
algorithm: <AlgorithmIdentifier> | <RsaPssParams> | <EcdsaParams> | <Ed448Params> -
key: <CryptoKey> -
signature: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> -
data: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> Выполняется с <boolean>
Используя метод и параметры, указанные в algorithm, и используемый материал ключа, предоставленный key, subtle.verify() пытается проверить, является ли signature действительной криптографической подписью data. Возвращаемое обещание выполняется либо с true, либо с false.
В настоящее время поддерживаются следующие алгоритмы:
subtle.wrapKey(format, key, wrappingKey, wrapAlgo)
-
format: <string> Должно быть одним из'raw','pkcs8','spki', или'jwk'. -
key: <CryptoKey> -
wrappingKey: <CryptoKey> -
wrapAlgo: <AlgorithmIdentifier> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> - Возвращает: <Promise> Выполняется с <ArrayBuffer>
В криптографии "заворачивание ключа" относится к экспорту и последующему шифрованию используемого материала ключа. Метод subtle.wrapKey() экспортирует используемый материал ключа в формат, определенный format, затем шифрует его с помощью метода и параметров, указанных в wrapAlgo, и используемого материала ключа, предоставленного wrappingKey. Это эквивалентно вызову subtle.exportKey() с использованием format и key в качестве аргументов, а затем передаче результата методу subtle.encrypt() с wrappingKey и wrapAlgo в качестве входных данных. В случае успеха возвращаемое обещание будет выполнено с <ArrayBuffer>, содержащим зашифрованные данные ключа.
В настоящее время поддерживаются следующие алгоритмы заворачивания:
'RSA-OAEP''AES-CTR''AES-CBC''AES-GCM''AES-KW'
Параметры алгоритма
Объекты параметров алгоритма определяют методы и параметры, используемые различными методами <SubtleCrypto>. Хотя здесь они описаны как "классы", это простые объекты словарей JavaScript.
Класс: AlgorithmIdentifier
algorithmIdentifier.name
- Тип: <строка>
Класс: AesCbcParams
aesCbcParams.iv
- Тип: <ArrayBuffer> | <Массив типов> | <DataView> | <Buffer>
Предоставляет вектор инициализации. Он должен иметь длину ровно 16 байт и должен быть непредсказуемым и криптографически случайным.
aesCbcParams.name
- Тип: <строка> Должен быть
'AES-CBC'.
Класс: AesCtrParams
aesCtrParams.counter
- Тип: <ArrayBuffer> | <Массив типов> | <DataView> | <Buffer>
Начальное значение блока счётчика. Оно должно иметь длину ровно 16 байт.
Метод AES-CTR использует правые length бита блока как счётчик, а оставшиеся биты — как nonce.
aesCtrParams.length
- Тип: <число> Количество битов в
aesCtrParams.counter, которые должны использоваться в качестве счётчика.
aesCtrParams.name
- Тип: <строка> Должен быть
'AES-CTR'.
Класс: AesGcmParams
aesGcmParams.additionalData
- Тип: <ArrayBuffer> | <Массив типов> | <DataView> | <Buffer> | <неопределено>
В методе AES-GCM additionalData — это дополнительный ввод, который не шифруется, но включается в аутентификацию данных. Использование additionalData необязательно.
aesGcmParams.iv
- Тип: <ArrayBuffer> | <Массив типов> | <DataView> | <Buffer>
Вектор инициализации должен быть уникальным для каждой операции шифрования с использованием данного ключа.
В идеале это детерминированное значение длиной 12 байт, которое вычисляется таким образом, чтобы оно гарантированно было уникальным для всех вызовов, использующих один и тот же ключ. В качестве альтернативы, вектор инициализации может состоять из как минимум 12 криптографически случайных байт. Дополнительную информацию о построении векторов инициализации для AES-GCM см. в разделе 8 NIST SP 800-38D.
aesGcmParams.name
- Тип: <строка> Должен быть
'AES-GCM'.
aesGcmParams.tagLength
- Тип: <число> Размер сгенерированной метки аутентификации в битах. Это значение должно быть одним из
32,64,96,104,112,120, или128. По умолчанию:128.
Класс: AesKeyGenParams
aesKeyGenParams.length
- Тип: <число>
Длина генерируемого ключа AES. Она должна быть либо 128, либо 192, либо 256.
aesKeyGenParams.name
- Тип: <строка> Должно быть одним из
'AES-CBC','AES-CTR','AES-GCM', или'AES-KW'
Класс: EcdhKeyDeriveParams
ecdhKeyDeriveParams.name
- Тип: <строка> Должно быть
'ECDH','X25519', или'X448'.
ecdhKeyDeriveParams.public
- Тип: <КлючCrypto>
Вычисление производного ключа ECDH выполняется путем взятия в качестве входных данных закрытого ключа одной стороны и открытого ключа другой стороны — используя оба для генерации общего секрета. Свойство ecdhKeyDeriveParams.public установлено в открытый ключ другой стороны.
Класс: EcdsaParams
ecdsaParams.hash
Если представлено как <строка>, значение должно быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <объект>, объект должен иметь свойство name, значение которого — одно из вышеперечисленных значений.
ecdsaParams.name
- Тип: <строка> Должен быть
'ECDSA'.
Класс: EcKeyGenParams
ecKeyGenParams.name
- Тип: <строка> Должно быть одним из
'ECDSA'или'ECDH'.
ecKeyGenParams.namedCurve
- Тип: <строка> Должно быть одним из
'P-256','P-384', или'P-521'.
Класс: EcKeyImportParams
ecKeyImportParams.name
- Тип: <строка> Должно быть одним из
'ECDSA'или'ECDH'.
ecKeyImportParams.namedCurve
- Тип: <строка> Должен быть одним из
'P-256','P-384','P-521'.
Класс: Ed448Params
ed448Params.name
- Тип: <строка> Должен быть
'Ed448'.
ed448Params.context
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <undefined>
Член context представляет собой необязательные данные контекста для ассоциации с сообщением. Реализация Node.js Web Crypto API поддерживает только контекст нулевой длины, что эквивалентно отсутствию контекста.
Класс: HkdfParams
hkdfParams.hash
Если представлено как <строка>, значение должно быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <объект>, объект должен иметь свойство name, значение которого является одним из перечисленных выше значений.
hkdfParams.info
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Предоставляет контекстные входные данные, специфичные для приложения, для алгоритма HKDF. Может быть нулевой длины, но обязательно должен быть предоставлен.
hkdfParams.name
- Тип: <строка> Должен быть
'HKDF'.
hkdfParams.salt
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Значение соли значительно улучшает надежность алгоритма HKDF. Оно должно быть случайным или псевдослучайным и иметь длину, равную выводу функции дайджеста (например, если используется 'SHA-256', соль должна быть 256 битами случайных данных).
Класс: HmacImportParams
hmacImportParams.hash
Если представлено как <строка>, значение должно быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <объект>, объект должен иметь свойство name, значение которого является одним из перечисленных выше значений.
hmacImportParams.length
- Тип: <число>
Необязательное количество битов в ключе HMAC. Это необязательно и должно быть опущено в большинстве случаев.
hmacImportParams.name
- Тип: <строка> Должен быть
'HMAC'.
Класс: HmacKeyGenParams
hmacKeyGenParams.hash
Если представлено как <строка>, значение должно быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <объект>, объект должен иметь свойство name, значение которого является одним из перечисленных выше значений.
hmacKeyGenParams.length
- Тип: <число>
Количество битов, которые нужно сгенерировать для ключа HMAC. Если опущено, длина будет определена используемым алгоритмом хеширования. Это необязательно и должно быть опущено в большинстве случаев.
hmacKeyGenParams.name
- Тип: <строка> Должен быть
'HMAC'.
Класс: Pbkdf2Params
pbkdb2Params.hash
Если представлено как <строка>, значение должно быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <объект>, объект должен иметь свойство name, значение которого является одним из перечисленных выше значений.
pbkdf2Params.iterations
- Тип: <число>
Количество итераций, которое алгоритм PBKDF2 должен выполнить при выводе битов.
pbkdf2Params.name
- Тип: <строка> Должен быть
'PBKDF2'.
pbkdf2Params.salt
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Должен содержать не менее 16 случайных или псевдослучайных байт.
Класс: RsaHashedImportParams
rsaHashedImportParams.hash
Если представлено как <строка>, значение должно быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <Объект>, объект должен иметь свойство name со значением, указанным в списке выше.
rsaHashedImportParams.name
- Тип: <строка> Должно быть одно из
'RSASSA-PKCS1-v1_5','RSA-PSS', или'RSA-OAEP'.
Класс: RsaHashedKeyGenParams
rsaHashedKeyGenParams.hash
Если представлено как <строка>, значение должно быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <Объект>, объект должен иметь свойство name со значением, указанным в списке выше.
rsaHashedKeyGenParams.modulusLength
- Тип: <число>
Длина модуля RSA в битах. В качестве рекомендации, она должна быть не менее 2048.
rsaHashedKeyGenParams.name
- Тип: <строка> Должно быть одно из
'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> | <Массив типов> | <DataView> | <Buffer>
Дополнительная коллекция байтов, которые не будут зашифрованы, но будут связаны с сгенерированным шифрованным текстом.
Параметр rsaOaepParams.label является необязательным.
rsaOaepParams.name
- Тип: <строка> должен быть
'RSA-OAEP'.
Класс: RsaPssParams
rsaPssParams.name
- Тип: <строка> Должно быть
'RSA-PSS'.
rsaPssParams.saltLength
- Тип: <число>
Длина (в байтах) случайной соли для использования.
Примечания
© 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/api/webcrypto.html