API Web Crypto
Node.js предоставляет реализацию стандартного API Web Crypto.
Используйте require('crypto').webcrypto для доступа к этому модулю.
const { subtle } = require('crypto').webcrypto;
(async function() {
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256
}, true, ['sign', 'verify']);
const digest = await subtle.sign({
name: 'HMAC'
}, key, 'I love cupcakes');
})(); Примеры
Генерация ключей
Класс <SubtleCrypto> может использоваться для генерации симметричных (секретных) ключей или асимметричных пар ключей (открытый и закрытый ключи).
Ключи AES
const { subtle } = require('crypto').webcrypto;
async function generateAesKey(length = 256) {
const key = await subtle.generateKey({
name: 'AES-CBC',
length
}, true, ['encrypt', 'decrypt']);
return key;
} Пары ключей кривых эллиптических кривых
const { subtle } = require('crypto').webcrypto;
async function generateEcKey(namedCurve = 'P-521') {
const {
publicKey,
privateKey
} = await subtle.generateKey({
name: 'ECDSA',
namedCurve,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
} Пары ключей эллиптических кривых ED25519/ED448/X25519/X448
const { subtle } = require('crypto').webcrypto;
async function generateEd25519Key() {
return subtle.generateKey({
name: 'NODE-ED25519',
namedCurve: 'NODE-ED25519',
}, true, ['sign', 'verify']);
}
async function generateX25519Key() {
return subtle.generateKey({
name: 'ECDH',
namedCurve: 'NODE-X25519',
}, true, ['deriveKey']);
} Ключи HMAC
const { subtle } = require('crypto').webcrypto;
async function generateHmacKey(hash = 'SHA-256') {
const key = await subtle.generateKey({
name: 'HMAC',
hash
}, true, ['sign', 'verify']);
return key;
} Пары ключей RSA
const { subtle } = require('crypto').webcrypto;
const publicExponent = new Uint8Array([1, 0, 1]);
async function generateRsaKey(modulusLength = 2048, hash = 'SHA-256') {
const {
publicKey,
privateKey
} = await subtle.generateKey({
name: 'RSASSA-PKCS1-v1_5',
modulusLength,
publicExponent,
hash,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
} Шифрование и дешифрование
const { subtle, getRandomValues } = require('crypto').webcrypto;
async function aesEncrypt(plaintext) {
const ec = new TextEncoder();
const key = await generateAesKey();
const iv = getRandomValues(new Uint8Array(16));
const ciphertext = await subtle.encrypt({
name: 'AES-CBC',
iv,
}, key, ec.encode(plaintext));
return {
key,
iv,
ciphertext
};
}
async function aesDecrypt(ciphertext, key, iv) {
const dec = new TextDecoder();
const plaintext = await subtle.decrypt({
name: 'AES-CBC',
iv,
}, key, ciphertext);
return dec.decode(plaintext);
} Экспорт и импорт ключей
const { subtle } = require('crypto').webcrypto;
async function generateAndExportHmacKey(format = 'jwk', hash = 'SHA-512') {
const key = await subtle.generateKey({
name: 'HMAC',
hash
}, true, ['sign', 'verify']);
return subtle.exportKey(format, key);
}
async function importHmacKey(keyData, format = 'jwk', hash = 'SHA-512') {
const key = await subtle.importKey(format, keyData, {
name: 'HMAC',
hash
}, true, ['sign', 'verify']);
return key;
} Заворачивание и распаковывание ключей
const { subtle } = require('crypto').webcrypto;
async function generateAndWrapHmacKey(format = 'jwk', hash = 'SHA-512') {
const [
key,
wrappingKey,
] = await Promise.all([
subtle.generateKey({
name: 'HMAC', hash
}, true, ['sign', 'verify']),
subtle.generateKey({
name: 'AES-KW',
length: 256
}, true, ['wrapKey', 'unwrapKey']),
]);
const wrappedKey = await subtle.wrapKey(format, key, wrappingKey, 'AES-KW');
return wrappedKey;
}
async function unwrapHmacKey(
wrappedKey,
wrappingKey,
format = 'jwk',
hash = 'SHA-512') {
const key = await subtle.unwrapKey(
format,
wrappedKey,
unwrappingKey,
'AES-KW',
{ name: 'HMAC', hash },
true,
['sign', 'verify']);
return key;
} Подпись и проверка
const { subtle } = require('crypto').webcrypto;
async function sign(key, data) {
const ec = new TextEncoder();
const signature =
await subtle.sign('RSASSA-PKCS1-v1_5', key, ec.encode(data));
return signature;
}
async function verify(key, signature, data) {
const ec = new TextEncoder();
const verified =
await subtle.verify(
'RSASSA-PKCS1-v1_5',
key,
signature,
ec.encode(data));
return verified;
} Вычисление битов и ключей
const { subtle } = require('crypto').webcrypto;
async function pbkdf2(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const key = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveBits']);
const bits = await subtle.deriveBits({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations
}, key, length);
return bits;
}
async function pbkdf2Key(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const keyMaterial = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveKey']);
const key = await subtle.deriveKey({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations
}, keyMaterial, {
name: 'AES-GCM',
length: 256
}, true, ['encrypt', 'decrypt']);
return key;
} Хеширование
const { subtle } = require('crypto').webcrypto;
async function digest(data, algorithm = 'SHA-512') {
const ec = new TextEncoder();
const digest = await subtle.digest(algorithm, ec.encode(data));
return digest;
} Матрица алгоритмов
В таблице подробно описаны алгоритмы, поддерживаемые реализацией Node.js Web Crypto API, и поддерживаемые API для каждого из них:
| Алгоритм | generateKey |
exportKey |
importKey |
encrypt |
decrypt |
wrapKey |
unwrapKey |
deriveBits |
deriveKey |
sign |
verify |
digest |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'RSA-PSS' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'RSA-OAEP' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'ECDSA' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'ECDH' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'AES-CTR' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-CBC' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-GCM' |
✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-KW' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HMAC' |
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HKDF' |
✔ | ✔ | ✔ | ✔ | ||||||||
'PBKDF2' |
✔ | ✔ | ✔ | ✔ | ||||||||
'SHA-1' |
✔ | |||||||||||
'SHA-256' |
✔ | |||||||||||
'SHA-384' |
✔ | |||||||||||
'SHA-512' |
✔ | |||||||||||
'NODE-DSA'1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'NODE-DH'1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'NODE-ED25519'1
|
✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'NODE-ED448'1
|
✔ | ✔ | ✔ | ✔ | ✔ |
Класс: Crypto
Вызов require('crypto').webcrypto возвращает экземпляр класса Crypto. Crypto — это синглтон, предоставляющий доступ к остальной части API шифрования.
crypto.subtle
- Тип: <SubtleCrypto>
Предоставляет доступ к API SubtleCrypto.
crypto.getRandomValues(typedArray)
-
typedArray<Буфер> | <TypedArray> | <DataView> | <ArrayBuffer> - Возвращает: <Буфер> | <TypedArray> | <DataView> | <ArrayBuffer> Возвращает
typedArray.
Генерирует криптографически сильные случайные значения. Указанный typedArray заполняется случайными значениями, и возвращается ссылка на typedArray.
Ошибка будет выброшена, если указанный typedArray превышает 65 536 байт.
crypto.randomUUID()
- Возвращает: <строка>
Генерирует случайный UUID версии 4 в соответствии с RFC 4122. UUID генерируется с помощью криптографического псевдослучайного генератора.
Класс: CryptoKey
cryptoKey.algorithm
- Тип: <AesKeyGenParams> | <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams> | <NodeDsaKeyGenParams> | <NodeDhKeyGenParams>
Объект, описывающий алгоритм, для которого можно использовать ключ, вместе с дополнительными параметрами, специфичными для алгоритма.
Только для чтения.
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' |
✔ | ✔ | ||||||
'ECDSA' |
✔ | ✔ | ||||||
'HDKF' |
✔ | ✔ | ||||||
'HMAC' |
✔ | ✔ | ||||||
'PBKDF2' |
✔ | ✔ | ||||||
'RSA-OAEP' |
✔ | ✔ | ✔ | ✔ | ||||
'RSA-PSS' |
✔ | ✔ | ||||||
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ||||||
'NODE-DSA'1
|
✔ | ✔ | ||||||
'NODE-DH'1
|
✔ | ✔ | ||||||
'NODE-SCRYPT'1
|
✔ | ✔ | ||||||
'NODE-ED25519'1
|
✔ | ✔ | ||||||
'NODE-ED448'1
|
✔ | ✔ |
Класс: CryptoKeyPair
Объект 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. При успешном выполнении возвращаемое promise будет разрешено с <ArrayBuffer>, содержащим результат в виде открытого текста.
В настоящее время поддерживаются следующие алгоритмы:
'RSA-OAEP''AES-CTR''AES-CBC'-
'AES-GCM
subtle.deriveBits(algorithm, baseKey, length)
-
algorithm: <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> | <NodeDhDeriveBitsParams> | <NodeScryptParams> -
baseKey: <CryptoKey> -
length: <number> - Возвращает: <Promise>, содержащую <ArrayBuffer>
Используя метод и параметры, указанные в algorithm, и криптографический материал, предоставленный baseKey, subtle.deriveBits() пытается сгенерировать length бит. В реализации Node.js требуется, чтобы length было кратно 8. При успешном выполнении возвращаемое promise будет разрешено с <ArrayBuffer>, содержащим сгенерированные данные.
В настоящее время поддерживаются следующие алгоритмы:
subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
-
algorithm: <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2Params> | <NodeDhDeriveBitsParams> | <NodeScryptParams> -
baseKey: <CryptoKey> -
derivedKeyAlgorithm: <HmacKeyGenParams> | <AesKeyGenParams> -
extractable: <boolean> -
keyUsages: <string[]> Смотрите Использование ключей. - Возвращает: <Promise> содержащую <CryptoKey>
Используя метод и параметры, указанные в algorithm, и криптографический материал, предоставленный baseKey, subtle.deriveKey() пытается сгенерировать новый <CryptoKey> на основе метода и параметров в derivedKeyAlgorithm.
Вызов subtle.deriveKey() эквивалентен вызову subtle.deriveBits() для генерации исходного криптографического материала, а затем передаче результата в метод subtle.importKey() с параметрами deriveKeyAlgorithm, extractable и keyUsages в качестве входных данных.
В настоящее время поддерживаются следующие алгоритмы:
subtle.digest(algorithm, data)
-
algorithm: <string> | <Object> -
data: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> содержащую <ArrayBuffer>
Используя метод, определенный в algorithm, subtle.digest() пытается вычислить дайджест data. При успешном выполнении возвращаемое promise разрешается с <ArrayBuffer>, содержащим вычисленный дайджест.
Если algorithm предоставлен как <string>, он должен быть одним из:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если algorithm предоставлен как <Object>, он должен иметь свойство name, значение которого — один из вышеперечисленных.
subtle.encrypt(algorithm, key, data)
-
algorithm: <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> -
key: <CryptoKey> - Возвращает: <Promise> содержащую <ArrayBuffer>
Используя метод и параметры, указанные в algorithm, и криптографический материал, предоставленный key, subtle.encrypt() пытается зашифровать data. При успешном выполнении возвращаемое promise разрешается с <ArrayBuffer>, содержащим результат шифрования.
В настоящее время поддерживаются следующие алгоритмы:
'RSA-OAEP''AES-CTR''AES-CBC'-
'AES-GCM
subtle.exportKey(format, key)
-
format: <string> Должно быть одним из'raw','pkcs8','spki','jwk'или'node.keyObject'. -
key: <CryptoKey> - Возвращает: <Promise>, содержащую <ArrayBuffer>, или, если
formatравно'node.keyObject', <KeyObject>.
Экспортирует заданный ключ в указанный формат, если это поддерживается.
Если <CryptoKey> не является экспортируемым, возвращённое обещание отклонится.
Когда format равно либо 'pkcs8', либо 'spki' и экспорт успешен, возвращённое обещание будет выполнено с <ArrayBuffer>, содержащим данные экспортированного ключа.
Когда format равно 'jwk' и экспорт успешен, возвращённое обещание будет выполнено с объектом JavaScript, соответствующим спецификации JSON Web Key.
Значение 'node.keyObject' для format — это специфичное для Node.js расширение, которое позволяет преобразовать <CryptoKey> в Node.js <KeyObject>.
| Тип ключа | 'spki' |
'pkcs8' |
'jwk' |
'raw' |
|---|---|---|---|---|
'AES-CBC' |
✔ | ✔ | ||
'AES-CTR' |
✔ | ✔ | ||
'AES-GCM' |
✔ | ✔ | ||
'AES-KW' |
✔ | ✔ | ||
'ECDH' |
✔ | ✔ | ✔ | ✔ |
'ECDSA' |
✔ | ✔ | ✔ | ✔ |
'HDKF' |
||||
'HMAC' |
✔ | ✔ | ||
'PBKDF2' |
||||
'RSA-OAEP' |
✔ | ✔ | ✔ | |
'RSA-PSS' |
✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ | |
'NODE-DSA'1
|
✔ | ✔ | ||
'NODE-DH'1
|
✔ | ✔ | ||
'NODE-SCRYPT'1
|
||||
'NODE-ED25519'1
|
✔ | ✔ | ✔ | ✔ |
'NODE-ED448'1
|
✔ | ✔ | ✔ | ✔ |
subtle.generateKey(algorithm, extractable, keyUsages)
-
algorithm: <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams> | <AesKeyGenParams> | <NodeDsaKeyGenParams> | <NodeDhKeyGenParams> | <NodeEdKeyGenParams>
-
extractable: <boolean> -
keyUsages: <string[]> См. Использование ключей. - Возвращает: <Promise>, содержащую <CryptoKey> | <CryptoKeyPair>
Используя метод и параметры, предоставленные в algorithm, subtle.generateKey() пытается сгенерировать новые данные ключей. В зависимости от используемого метода, метод может сгенерировать либо один <CryptoKey>, либо <CryptoKeyPair>.
Поддерживаемые алгоритмы генерации <CryptoKeyPair> (открытый и закрытый ключ) включают:
'RSASSA-PKCS1-v1_5''RSA-PSS''RSA-OAEP''ECDSA''ECDH'-
'NODE-DSA'1 -
'NODE-DH'1 -
'NODE-ED25519'1 -
'NODE-ED448'1
Поддерживаемые алгоритмы генерации <CryptoKey> (секретный ключ) включают:
'HMAC''AES-CTR''AES-CBC''AES-GCM''AES-KW'
subtle.importKey(format, keyData, algorithm, extractable, keyUsages)
-
format: <string> Должно быть одним из'raw','pkcs8','spki','jwk'или'node.keyObject'. -
keyData: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <KeyObject>
-
algorithm: <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams> | <AesImportParams> | <Pbkdf2ImportParams> | <NodeDsaImportParams> | <NodeDhImportParams> | <NodeScryptImportParams> | <NodeEdKeyImportParams>
-
extractable: <boolean> -
keyUsages: <string[]> См. Использование ключей. - Возвращает: <Promise>, содержащую <CryptoKey>
Метод subtle.importKey() пытается интерпретировать предоставленный keyData как заданный format, чтобы создать экземпляр <CryptoKey> с использованием предоставленных algorithm, extractable и keyUsages аргументов. Если импорт успешен, возвращённое обещание будет выполнено с созданным <CryptoKey>.
Значение 'node.keyObject' для format — это специфичное для Node.js расширение, которое позволяет преобразовать Node.js <KeyObject> в <CryptoKey>.
При импорте ключа 'PBKDF2', extractable должно быть равно false.
В настоящее время поддерживаются следующие алгоритмы:
| Ключ Тип | 'spki' |
'pkcs8' |
'jwk' |
'raw' |
|---|---|---|---|---|
'AES-CBC' |
✔ | ✔ | ||
'AES-CTR' |
✔ | ✔ | ||
'AES-GCM' |
✔ | ✔ | ||
'AES-KW' |
✔ | ✔ | ||
'ECDH' |
✔ | ✔ | ✔ | ✔ |
'ECDSA' |
✔ | ✔ | ✔ | ✔ |
'HDKF' |
✔ | |||
'HMAC' |
✔ | ✔ | ||
'PBKDF2' |
✔ | |||
'RSA-OAEP' |
✔ | ✔ | ✔ | |
'RSA-PSS' |
✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' |
✔ | ✔ | ✔ | |
'NODE-DSA'1
|
✔ | ✔ | ||
'NODE-DH'1
|
✔ | ✔ | ||
'NODE-SCRYPT'1
|
✔ | |||
'NODE-ED25519'1
|
✔ | ✔ | ✔ | ✔ |
'NODE-ED448'1
|
✔ | ✔ | ✔ | ✔ |
subtle.sign(algorithm, key, data)
-
algorithm: <RsaSignParams> | <RsaPssParams> | <EcdsaParams> | <HmacParams> | <NodeDsaSignParams> -
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: <string> Должен быть одним из'raw','pkcs8','spki'или'jwk'. -
wrappedKey: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> -
unwrappingKey: <CryptoKey>
-
unwrapAlgo: <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> | <AesKwParams> -
unwrappedKeyAlgo: <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams> | <AesImportParams>
-
extractable: <boolean> -
keyUsages: <string[]> См. Использование ключей. - Возвращает: <Promise> содержащую <CryptoKey>
В криптографии «обертывание ключа» означает экспорт и шифрование ключа. Метод subtle.unwrapKey() пытается расшифровать обернутый ключ и создать экземпляр <CryptoKey>. Это эквивалентно вызову subtle.decrypt() сначала на зашифрованные данные ключа (используя аргументы wrappedKey, unwrapAlgo и unwrappingKey в качестве входных данных), а затем передаче результатов методу subtle.importKey() с использованием аргументов unwrappedKeyAlgo, extractable и keyUsages в качестве входных данных. В случае успеха возвращаемое обещание выполняется с объектом <CryptoKey>.
В настоящее время поддерживаются следующие алгоритмы обертывания:
Поддерживаемые алгоритмы для распаковки ключей:
'RSASSA-PKCS1-v1_5''RSA-PSS''RSA-OAEP''ECDSA''ECDH''HMAC''AES-CTR''AES-CBC''AES-GCM''AES-KW'-
'NODE-DSA'1 -
'NODE-DH'1
subtle.verify(algorithm, key, signature, data)
-
algorithm: <RsaSignParams> | <RsaPssParams> | <EcdsaParams> | <HmacParams> | <NodeDsaSignParams> -
key: <CryptoKey> -
signature: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> -
data: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> - Возвращает: <Promise> содержащую <boolean>
Используя метод и параметры, указанные в algorithm, и криптографический материал, предоставленный key, subtle.verify() пытается проверить, является ли signature действительной криптографической подписью для data. Возвращаемое обещание выполняется с true или false.
В настоящее время поддерживаются следующие алгоритмы:
subtle.wrapKey(format, key, wrappingKey, wrapAlgo)
-
format: <строка> Должно быть одно из'raw','pkcs8','spki'или'jwk'. -
key: <CryptoKey> -
wrappingKey: <CryptoKey> -
wrapAlgo: <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcmParams> | <AesKwParams> - Возвращает: <Promise> содержащий <ArrayBuffer>
В криптографии "заворачивание ключа" относится к экспорту и последующему шифрованию криптографического материала. Метод subtle.wrapKey() экспортирует криптографический материал в формат, определённый format, затем шифрует его, используя метод и параметры, указанные в wrapAlgo, и криптографический материал, предоставленный wrappingKey. Это эквивалентно вызову subtle.exportKey() с format и key в качестве аргументов, а затем передаче результата методу subtle.encrypt() с использованием wrappingKey и wrapAlgo в качестве входных данных. В случае успеха, возвращаемое обещание будет выполнено с <ArrayBuffer>, содержащим зашифрованные данные ключа.
В настоящее время поддерживаются следующие алгоритмы обертывания:
'RSA-OAEP''AES-CTR''AES-CBC''AES-GCM''AES-KW'
Параметры алгоритма
Объекты параметров алгоритма определяют методы и параметры, используемые различными методами <SubtleCrypto>. Хотя они описаны здесь как "классы", это простые объекты словарей JavaScript.
Класс: AesCbcParams
aesCbcParams.iv
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Предоставляет вектор инициализации. Он должен быть ровно 16 байт длиной и должен быть непредсказуемым и криптографически случайным.
aesCbcParams.name
- Тип: <строка> Должен быть
'AES-CBC'.
Класс: AesCtrParams
aesCtrParams.counter
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Начальное значение блока счётчика. Оно должно быть ровно 16 байт длиной.
Метод AES-CTR использует правые length бита блока в качестве счётчика, а оставшиеся биты в качестве nonce.
aesCtrParams.length
- Тип: <число> Количество битов в блоке
aesCtrParams.counter, которые будут использоваться в качестве счётчика.
aesCtrParams.name
- Тип: <строка> Должен быть
'AES-CTR'.
Класс: AesGcmParams
aesGcmParams.additionalData
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer> | <undefined>
При использовании метода AES-GCM, additionalData — это дополнительный ввод, который не шифруется, но включается в проверку подлинности данных. Использование additionalData необязательно.
aesGcmParams.iv
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Вектор инициализации должен быть уникальным для каждой операции шифрования с использованием данного ключа. В спецификации AES-GCM рекомендуется, чтобы он содержал как минимум 12 случайных байтов.
aesGcmParams.name
- Тип: <строка> Должен быть
'AES-GCM'.
aesGcmParams.tagLength
- Тип: <число> Размер сгенерированного тега аутентификации в битах. Это значение должно быть одним из
32,64,96,104,112,120или128. По умолчанию:128.
Класс: AesImportParams
aesImportParams.name
- Тип: <строка> Должен быть одним из
'AES-CTR','AES-CBC','AES-GCM'или'AES-KW'.
Класс: AesKeyGenParams
aesKeyGenParams.length
- Тип: <число>
Длина генерируемого ключа AES. Она должна быть либо 128, либо 192, либо 256.
aesKeyGenParams.name
- Тип: <строка> Должен быть одним из
'AES-CBC','AES-CTR','AES-GCM'или'AES-KW'
Класс: AesKwParams
aesKwParams.name
- Тип: <строка> Должен быть
'AES-KW'.
Класс: EcdhKeyDeriveParams
ecdhKeyDeriveParams.name
- Тип: <строка> Должен быть
'ECDH'.
ecdhKeyDeriveParams.public
- Тип: <CryptoKey>
Производные ключи 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','NODE-ED25519','NODE-ED448','NODE-X25519'или'NODE-X448'.
Класс: EcKeyImportParams
ecKeyImportParams.name
- Тип: <строка> Должен быть одним из
'ECDSA'или'ECDH'.
ecKeyImportParams.namedCurve
- Тип: <строка> Должно быть одно из
'P-256','P-384','P-521','NODE-ED25519','NODE-ED448','NODE-X25519'или'NODE-X448'.
Класс: 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'.
Класс: HmacParams
hmacParams.name
- Тип: <строка> Должно быть
'HMAC'.
Класс: Pbkdf2ImportParams
pbkdf2ImportParams.name
- Тип: <строка> Должно быть
'PBKDF2'
Класс: 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>, содержащий целое беззнаковое целое число в формате big-endian, которое должно помещаться в 32 бита. <Uint8Array> может содержать произвольное количество старших нулевых битов. Значение должно быть простым числом. Если нет причин использовать другое значение, используйте new Uint8Array([1, 0, 1]) (65537) в качестве показателя.
Класс: RsaOaepParams
rsaOaepParams.label
- Тип: <ArrayBuffer> | <TypedArray> | <DataView> | <Buffer>
Дополнительный набор байтов, который не будет шифроваться, но будет связан с сгенерированным шифрованным текстом.
Параметр rsaOaepParams.label необязателен.
rsaOaepParams.name
- Тип: <строка> должно быть
'RSA-OAEP'.
Класс: RsaPssParams
rsaPssParams.name
- Тип: <строка> Должно быть
'RSA-PSS'.
rsaPssParams.saltLength
- Тип: <число>
Длина (в байтах) случайной соли для использования.
Класс: RsaSignParams
rsaSignParams.name
- Тип: <строка> Должно быть
'RSASSA-PKCS1-v1_5'
Расширения, специфичные для Node.js
API криптографии Node.js расширяет различные аспекты API криптографии Web Crypto. Эти расширения постоянно идентифицируются путем добавления префикса node. к именам. Например, формат ключа 'node.keyObject' можно использовать с методами subtle.exportKey() и subtle.importKey() для преобразования между объектом WebCrypto <CryptoKey> и объектом Node.js <KeyObject>.
Следует проявлять осторожность при использовании расширений, специфичных для Node.js, так как они не поддерживаются другими реализациями WebCrypto и снижают переносимость кода в другие среды.
NODE-DH Алгоритм
Алгоритм NODE-DH представляет собой общепринятую реализацию согласования ключей Диффи-Хеллмана.
Класс: NodeDhImportParams
nodeDhImportParams.name
- Тип: <строка> Должен быть
'NODE-DH'.
Класс: NodeDhKeyGenParams
nodeDhKeyGenParams.generator
- Тип: <число> Пользовательский генератор.
nodeDhKeyGenParams.group
- Тип: <строка> Имя группы Диффи-Хеллмана.
nodeDhKeyGenParams.prime
- Тип: <Буфер> Параметр простого числа.
nodeDhKeyGenParams.primeLength
- Тип: <число> Длина простого числа в битах.
Класс: NodeDhDeriveBitsParams
nodeDhDeriveBitsParams.public
- Тип: <CryptoKey> Открытый ключ другой стороны.
NODE-DSA Алгоритм
Алгоритм NODE-DSA представляет собой общепринятую реализацию алгоритма цифровой подписи DSA.
Класс: NodeDsaImportParams
nodeDsaImportParams.hash
Если представлено как <строка>, значение должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <объект>, объект должен иметь свойство name со значением из перечисленных выше.
nodeDsaImportParams.name
- Тип: <строка> Должен быть
'NODE-DSA'.
Класс: NodeDsaKeyGenParams
nodeDsaKeyGenParams.divisorLength
- Тип: <число>
Необязательная длина делителя DSA в битах.
nodeDsaKeyGenParams.hash
Если представлено как <строка>, значение должно быть одним из следующих:
'SHA-1''SHA-256''SHA-384''SHA-512'
Если представлено как <объект>, объект должен иметь свойство name со значением из перечисленных выше.
nodeDsaKeyGenParams.modulusLength
- Тип: <число>
Длина модуля DSA в битах. В качестве рекомендации, эта величина должна быть не менее 2048.
nodeDsaKeyGenParams.name
- Тип: <строка> Должен быть
'NODE-DSA'.
Класс: NodeDsaSignParams
nodeDsaSignParams.name
- Тип: <строка> Должен быть
'NODE-DSA'
NODE-ED25519 и NODE-ED448 Алгоритмы
Класс: NodeEdKeyGenParams
nodeEdKeyGenParams.name
- Тип: <строка> Должен быть одним из
'NODE-ED25519','NODE-ED448'или'ECDH'.
nodeEdKeyGenParams.namedCurve
- Тип: <строка> Должен быть одним из
'NODE-ED25519','NODE-ED448','NODE-X25519'или'NODE-X448'.
Класс: NodeEdKeyImportParams
nodeEdKeyImportParams.name
- Тип: <строка> Должен быть одним из
'NODE-ED25519'или'NODE-ED448'при импорте ключаEd25519илиEd448, или'ECDH'при импорте ключаX25519илиX448.
nodeEdKeyImportParams.namedCurve
- Тип: <строка> Должен быть одним из
'NODE-ED25519','NODE-ED448','NODE-X25519'или'NODE-X448'.
nodeEdKeyImportParams.public
Параметр public используется для указания, что ключ в формате 'raw' должен интерпретироваться как открытый ключ. По умолчанию: false.
NODE-SCRYPT Алгоритм
Алгоритм NODE-SCRYPT представляет собой общепринятую реализацию алгоритма вывода ключей scrypt.
Класс: NodeScryptImportParams
nodeScryptImportParams.name
- Тип: <строка> Должен быть
'NODE-SCRYPT'.
Класс: NodeScryptParams
nodeScryptParams.encoding
- Тип: <строка> Кодировка строки, когда
saltпредставляет собой строку.
nodeScryptParams.maxmem
- Тип: <число> Верхний предел памяти. Возникает ошибка, когда (приблизительно)
127 * N * r > maxmem. По умолчанию:32 * 1024 * 1024.
nodeScryptParams.N
- Тип: <число> Параметр стоимости процессора/памяти. Должен быть степенью двойки, большей 1. По умолчанию:
16384.
nodeScryptParams.p
- Тип: <число> Параметр распараллеливания. По умолчанию:
1.
nodeScryptParams.r
- Тип: <число> Параметр размера блока. По умолчанию:
8.
nodeScryptParams.salt
- Тип: <строка> | <ArrayBuffer> | <Буфер> | <TypedArray> | <DataView>
Примечания
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v16.x/docs/api/webcrypto.html