Crypto
[Stable: 2 - Stable]
Stable: 2 Стабильность: 2 - Stable
Исходный код: lib/crypto.js
Модуль node:crypto
предоставляет криптографическую функциональность, которая включает в себя набор обёрток для функций хэширования, HMAC, шифрования, расшифровки, подписи и проверки OpenSSL.
const { createHmac } = await import('node:crypto');
const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
const { createHmac } = require('node:crypto');
const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
Определение недоступности поддержки crypto
Возможно, Node.js собран без поддержки модуля node:crypto
. В таких случаях попытка import
из crypto
или вызов require('node:crypto')
приведет к ошибке.
При использовании CommonJS ошибку можно перехватить с помощью try/catch:
let crypto;
try {
crypto = require('node:crypto');
} catch (err) {
console.error('crypto support is disabled!');
}
При использовании лексического ESM import
ошибку можно перехватить только в том случае, если обработчик для process.on('uncaughtException')
зарегистрирован до любой попытки загрузки модуля (например, с помощью модуля предварительной загрузки).
При использовании ESM, если есть вероятность, что код может быть запущен в сборке Node.js, где поддержка crypto не включена, рассмотрите возможность использования функции import()
вместо лексического ключевого слова import
:
let crypto;
try {
crypto = await import('node:crypto');
} catch (err) {
console.error('crypto support is disabled!');
}
Класс: Certificate
Добавлено в версии: v0.11.8
SPKAC - это механизм запроса подписи сертификата, первоначально реализованный Netscape и формально определенный как часть элемента keygen
HTML5.
\<keygen\>
устарел с HTML 5.2, и новые проекты больше не должны использовать этот элемент.
Модуль node:crypto
предоставляет класс Certificate
для работы с данными SPKAC. Наиболее распространенным вариантом использования является обработка вывода, генерируемого элементом HTML5 \<keygen\>
. Node.js использует реализацию SPKAC OpenSSL внутри.
Статический метод: Certificate.exportChallenge(spkac[, encoding])
[История]
Версия | Изменения |
---|---|
v15.0.0 | Аргумент spkac может быть ArrayBuffer. Ограничен размер аргумента spkac до максимума в 2**31 - 1 байт. |
v9.0.0 | Добавлено в версии: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиspkac
.- Возвращает: <Buffer> Компонент challenge структуры данных
spkac
, который включает открытый ключ и challenge.
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Выводит: challenge в виде строки UTF8
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Выводит: challenge в виде строки UTF8
Статический метод: Certificate.exportPublicKey(spkac[, encoding])
[История]
Версия | Изменения |
---|---|
v15.0.0 | Аргумент spkac может быть ArrayBuffer. Ограничен размер аргумента spkac до максимума в 2**31 - 1 байт. |
v9.0.0 | Добавлено в: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиspkac
.- Возвращает: <Buffer> Компонент открытого ключа структуры данных
spkac
, который включает открытый ключ и challenge.
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// Выводит: открытый ключ как <Buffer ...>
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// Выводит: открытый ключ как <Buffer ...>
Статический метод: Certificate.verifySpkac(spkac[, encoding])
[История]
Версия | Изменения |
---|---|
v15.0.0 | Аргумент spkac может быть ArrayBuffer. Добавлена кодировка. Ограничен размер аргумента spkac до максимума в 2**31 - 1 байт. |
v9.0.0 | Добавлено в: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиspkac
.- Возвращает: <boolean>
true
, если данная структура данныхspkac
является валидной,false
в противном случае.
import { Buffer } from 'node:buffer';
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// Выводит: true или false
const { Buffer } = require('node:buffer');
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// Выводит: true или false
Устаревший API
[Stable: 0 - Deprecated]
Stable: 0 Stability: 0 - Устаревший
В качестве устаревшего интерфейса можно создавать новые экземпляры класса crypto.Certificate
, как показано в примерах ниже.
new crypto.Certificate()
Экземпляры класса Certificate
можно создавать с помощью ключевого слова new
или путем вызова crypto.Certificate()
как функции:
const { Certificate } = await import('node:crypto');
const cert1 = new Certificate();
const cert2 = Certificate();
const { Certificate } = require('node:crypto');
const cert1 = new Certificate();
const cert2 = Certificate();
certificate.exportChallenge(spkac[, encoding])
Добавлено в: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиspkac
.- Возвращает: <Buffer> Компонент challenge структуры данных
spkac
, который включает открытый ключ и challenge.
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Выводит: challenge как строку UTF8
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Выводит: challenge как строку UTF8
certificate.exportPublicKey(spkac[, encoding])
Добавлено в версии: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиspkac
.- Возвращает: <Buffer> Компонент открытого ключа структуры данных
spkac
, который включает в себя открытый ключ и запрос.
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>
certificate.verifySpkac(spkac[, encoding])
Добавлено в версии: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиspkac
.- Возвращает: <boolean>
true
, если данная структура данныхspkac
является валидной,false
в противном случае.
import { Buffer } from 'node:buffer';
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// Prints: true or false
const { Buffer } = require('node:buffer');
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// Prints: true or false
Класс: Cipher
Добавлено в: v0.1.94
- Расширяет: <stream.Transform>
Экземпляры класса Cipher
используются для шифрования данных. Класс может использоваться одним из двух способов:
- Как поток, который является одновременно читаемым и записываемым, где обычные незашифрованные данные записываются для получения зашифрованных данных на читаемой стороне, или
- С использованием методов
cipher.update()
иcipher.final()
для получения зашифрованных данных.
Метод crypto.createCipheriv()
используется для создания экземпляров Cipher
. Объекты Cipher
не должны создаваться напрямую с использованием ключевого слова new
.
Пример: Использование объектов Cipher
в качестве потоков:
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
// Once we have the key and iv, we can create and use the cipher...
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = '';
cipher.setEncoding('hex');
cipher.on('data', (chunk) => encrypted += chunk);
cipher.on('end', () => console.log(encrypted));
cipher.write('some clear text data');
cipher.end();
});
});
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
// Once we have the key and iv, we can create and use the cipher...
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = '';
cipher.setEncoding('hex');
cipher.on('data', (chunk) => encrypted += chunk);
cipher.on('end', () => console.log(encrypted));
cipher.write('some clear text data');
cipher.end();
});
});
Пример: Использование Cipher
и конвейерных потоков:
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import {
pipeline,
} from 'node:stream';
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
const input = createReadStream('test.js');
const output = createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const {
pipeline,
} = require('node:stream');
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
const input = createReadStream('test.js');
const output = createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
Пример: Использование методов cipher.update()
и cipher.final()
:
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);
});
});
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);
});
});
cipher.final([outputEncoding])
Добавлено в версии: v0.1.94
outputEncoding
<string> Кодировка возвращаемого значения.- Возвращает: <Buffer> | <string> Любое оставшееся зашифрованное содержимое. Если указан
outputEncoding
, возвращается строка. ЕслиoutputEncoding
не указан, возвращаетсяBuffer
.
После того, как был вызван метод cipher.final()
, объект Cipher
больше не может быть использован для шифрования данных. Попытки вызвать cipher.final()
более одного раза приведут к выбросу ошибки.
cipher.getAuthTag()
Добавлено в версии: v1.0.0
- Возвращает: <Buffer> При использовании режима аутентифицированного шифрования (в настоящее время поддерживаются
GCM
,CCM
,OCB
иchacha20-poly1305
), методcipher.getAuthTag()
возвращаетBuffer
, содержащий тег аутентификации, который был вычислен из предоставленных данных.
Метод cipher.getAuthTag()
должен вызываться только после завершения шифрования с помощью метода cipher.final()
.
Если опция authTagLength
была установлена при создании экземпляра cipher
, эта функция вернет ровно authTagLength
байт.
cipher.setAAD(buffer[, options])
Добавлено в версии: v1.0.0
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object>stream.transform
optionsВозвращает: <Cipher> Тот же экземпляр
Cipher
для построения цепочки методов.
При использовании режима аутентифицированного шифрования (в настоящее время поддерживаются GCM
, CCM
, OCB
и chacha20-poly1305
), метод cipher.setAAD()
устанавливает значение, используемое для входного параметра дополнительных аутентифицированных данных (AAD).
Опция plaintextLength
является необязательной для GCM
и OCB
. При использовании CCM
опция plaintextLength
должна быть указана, и ее значение должно соответствовать длине открытого текста в байтах. См. режим CCM.
Метод cipher.setAAD()
должен быть вызван до cipher.update()
.
cipher.setAutoPadding([autoPadding])
Добавлено в: v0.7.1
autoPadding
<boolean> По умолчанию:true
- Возвращает: <Cipher> Тот же экземпляр
Cipher
для связывания методов.
При использовании алгоритмов блочного шифрования класс Cipher
автоматически добавляет отступы к входным данным до соответствующего размера блока. Чтобы отключить отступы по умолчанию, вызовите cipher.setAutoPadding(false)
.
Когда autoPadding
имеет значение false
, длина всех входных данных должна быть кратна размеру блока шифра, иначе cipher.final()
вызовет ошибку. Отключение автоматического заполнения полезно для нестандартного заполнения, например, при использовании 0x0
вместо заполнения PKCS.
Метод cipher.setAutoPadding()
должен быть вызван до cipher.final()
.
cipher.update(data[, inputEncoding][, outputEncoding])
[История]
Версия | Изменения |
---|---|
v6.0.0 | Значение inputEncoding по умолчанию изменено с binary на utf8 . |
v0.1.94 | Добавлено в: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка данных.outputEncoding
<string> Кодировка возвращаемого значения.- Возвращает: <Buffer> | <string>
Обновляет шифр с помощью data
. Если указан аргумент inputEncoding
, аргумент data
является строкой, использующей указанную кодировку. Если аргумент inputEncoding
не указан, data
должен быть Buffer
, TypedArray
или DataView
. Если data
является Buffer
, TypedArray
или DataView
, то inputEncoding
игнорируется.
outputEncoding
указывает формат вывода зашифрованных данных. Если outputEncoding
указан, возвращается строка, использующая указанную кодировку. Если outputEncoding
не указан, возвращается Buffer
.
Метод cipher.update()
можно вызывать несколько раз с новыми данными, пока не будет вызван cipher.final()
. Вызов cipher.update()
после cipher.final()
приведет к возникновению ошибки.
Класс: Decipher
Добавлено в: v0.1.94
- Расширяет: <stream.Transform>
Экземпляры класса Decipher
используются для расшифровки данных. Класс можно использовать одним из двух способов:
- Как поток, который одновременно читаемый и записываемый, где зашифрованные данные записываются для получения расшифрованных данных на стороне чтения, или
- С помощью методов
decipher.update()
иdecipher.final()
для получения расшифрованных данных.
Метод crypto.createDecipheriv()
используется для создания экземпляров Decipher
. Объекты Decipher
не следует создавать напрямую с помощью ключевого слова new
.
Пример: Использование объектов Decipher
в качестве потоков:
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
let decrypted = '';
decipher.on('readable', () => {
let chunk;
while (null !== (chunk = decipher.read())) {
decrypted += chunk.toString('utf8');
}
});
decipher.on('end', () => {
console.log(decrypted);
// Prints: some clear text data
});
// Encrypted with same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
let decrypted = '';
decipher.on('readable', () => {
let chunk;
while (null !== (chunk = decipher.read())) {
decrypted += chunk.toString('utf8');
}
});
decipher.on('end', () => {
console.log(decrypted);
// Prints: some clear text data
});
// Encrypted with same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();
Пример: Использование Decipher
и конвейерных потоков:
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
const input = createReadStream('test.enc');
const output = createWriteStream('test.js');
input.pipe(decipher).pipe(output);
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
const input = createReadStream('test.enc');
const output = createWriteStream('test.js');
input.pipe(decipher).pipe(output);
Пример: Использование методов decipher.update()
и decipher.final()
:
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
// Encrypted using same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
// Encrypted using same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data
decipher.final([outputEncoding])
Добавлено в: v0.1.94
outputEncoding
<string> Кодировка возвращаемого значения.- Возвращает: <Buffer> | <string> Любое оставшееся расшифрованное содержимое. Если указан
outputEncoding
, возвращается строка. ЕслиoutputEncoding
не указан, возвращаетсяBuffer
.
После вызова метода decipher.final()
объект Decipher
больше не может использоваться для расшифровки данных. Попытки вызвать decipher.final()
более одного раза приведут к возникновению ошибки.
decipher.setAAD(buffer[, options])
[История]
Версия | Изменения |
---|---|
v15.0.0 | Аргумент buffer может быть строкой или ArrayBuffer и ограничен не более чем 2 ** 31 - 1 байтами. |
v7.2.0 | Теперь этот метод возвращает ссылку на decipher . |
v1.0.0 | Добавлено в: v1.0.0 |
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object>stream.transform
параметрыВозвращает: <Decipher> Тот же Decipher для цепочки методов.
При использовании режима аутентифицированного шифрования (в настоящее время поддерживаются GCM
, CCM
, OCB
и chacha20-poly1305
), метод decipher.setAAD()
устанавливает значение, используемое для входного параметра дополнительных аутентифицированных данных (AAD).
Аргумент options
является необязательным для GCM
. При использовании CCM
необходимо указать параметр plaintextLength
, и его значение должно соответствовать длине зашифрованного текста в байтах. См. Режим CCM.
Метод decipher.setAAD()
должен быть вызван перед decipher.update()
.
При передаче строки в качестве buffer
, пожалуйста, обратите внимание на предостережения при использовании строк в качестве входных данных для криптографических API.
decipher.setAuthTag(buffer[, encoding])
[История]
Версия | Изменения |
---|---|
v22.0.0, v20.13.0 | Использование длин тегов GCM, отличных от 128 бит, без указания опции authTagLength при создании decipher считается устаревшим. |
v15.0.0 | Аргумент buffer может быть строкой или ArrayBuffer и ограничен не более чем 2 ** 31 - 1 байтами. |
v11.0.0 | Этот метод теперь выдает ошибку, если длина тега GCM недействительна. |
v7.2.0 | Этот метод теперь возвращает ссылку на decipher . |
v1.0.0 | Добавлено в версии: v1.0.0 |
buffer
<string> | <Buffer> | <ArrayBuffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строки, используемая, когдаbuffer
является строкой.- Возвращает: <Decipher> Тот же Decipher для связывания методов.
При использовании режима аутентифицированного шифрования (в настоящее время поддерживаются GCM
, CCM
, OCB
и chacha20-poly1305
), метод decipher.setAuthTag()
используется для передачи полученного тега аутентификации. Если тег не предоставлен или если шифрованный текст был изменен, decipher.final()
выдаст исключение, указывающее, что шифрованный текст следует отбросить из-за неудачной аутентификации. Если длина тега недействительна согласно NIST SP 800-38D или не соответствует значению опции authTagLength
, decipher.setAuthTag()
выдаст ошибку.
Метод decipher.setAuthTag()
должен быть вызван до decipher.update()
для режима CCM
или до decipher.final()
для режимов GCM
и OCB
и chacha20-poly1305
. decipher.setAuthTag()
может быть вызван только один раз.
При передаче строки в качестве тега аутентификации, пожалуйста, учитывайте предостережения при использовании строк в качестве входных данных для криптографических API.
decipher.setAutoPadding([autoPadding])
Добавлено в версии: v0.7.1
autoPadding
<boolean> По умолчанию:true
- Возвращает: <Decipher> Тот же Decipher для связывания методов.
Когда данные были зашифрованы без стандартного заполнения блока, вызов decipher.setAutoPadding(false)
отключит автоматическое заполнение, чтобы предотвратить проверку и удаление заполнения decipher.final()
.
Отключение автоматического заполнения будет работать только в том случае, если длина входных данных кратна размеру блока шифров.
Метод decipher.setAutoPadding()
должен быть вызван до decipher.final()
.
decipher.update(data[, inputEncoding][, outputEncoding])
[История]
Версия | Изменения |
---|---|
v6.0.0 | Значение inputEncoding по умолчанию изменено с binary на utf8 . |
v0.1.94 | Добавлено в версии: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка строкиdata
.outputEncoding
<string> Кодировка возвращаемого значения.- Возвращает: <Buffer> | <string>
Обновляет decipher с помощью data
. Если указан аргумент inputEncoding
, аргумент data
является строкой, использующей указанную кодировку. Если аргумент inputEncoding
не указан, data
должен быть Buffer
. Если data
является Buffer
, то inputEncoding
игнорируется.
outputEncoding
определяет формат вывода зашифрованных данных. Если указан outputEncoding
, возвращается строка, использующая указанную кодировку. Если outputEncoding
не указан, возвращается Buffer
.
Метод decipher.update()
можно вызывать несколько раз с новыми данными до вызова decipher.final()
. Вызов decipher.update()
после decipher.final()
приведет к возникновению ошибки.
Даже если базовый шифр реализует аутентификацию, подлинность и целостность открытого текста, возвращаемого этой функцией, могут быть неопределенными в это время. Для алгоритмов аутентифицированного шифрования подлинность обычно устанавливается только тогда, когда приложение вызывает decipher.final()
.
Класс: DiffieHellman
Добавлено в: v0.5.0
Класс DiffieHellman
- это утилита для создания обменов ключами Диффи-Хеллмана.
Экземпляры класса DiffieHellman
можно создать с помощью функции crypto.createDiffieHellman()
.
import assert from 'node:assert';
const {
createDiffieHellman,
} = await import('node:crypto');
// Сгенерировать ключи Алисы...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Сгенерировать ключи Боба...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// Обменяться и сгенерировать секрет...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
const assert = require('node:assert');
const {
createDiffieHellman,
} = require('node:crypto');
// Сгенерировать ключи Алисы...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Сгенерировать ключи Боба...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// Обменяться и сгенерировать секрет...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
Добавлено в: v0.5.0
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка строкиotherPublicKey
.outputEncoding
<string> Кодировка возвращаемого значения.- Возвращает: <Buffer> | <string>
Вычисляет общий секрет, используя otherPublicKey
в качестве открытого ключа другой стороны, и возвращает вычисленный общий секрет. Предоставленный ключ интерпретируется с использованием указанной inputEncoding
, а секрет кодируется с использованием указанной outputEncoding
. Если inputEncoding
не указана, ожидается, что otherPublicKey
будет Buffer
, TypedArray
или DataView
.
Если указана outputEncoding
, возвращается строка; в противном случае возвращается Buffer
.
diffieHellman.generateKeys([encoding])
Добавлено в: v0.5.0
Генерирует значения закрытого и открытого ключей Диффи-Хеллмана, если они еще не были сгенерированы или вычислены, и возвращает открытый ключ в указанной кодировке encoding
. Этот ключ должен быть передан другой стороне. Если предоставлена encoding
, возвращается строка; в противном случае возвращается Buffer
.
Эта функция является тонкой оболочкой вокруг DH_generate_key()
. В частности, после того как закрытый ключ был сгенерирован или установлен, вызов этой функции только обновляет открытый ключ, но не генерирует новый закрытый ключ.
diffieHellman.getGenerator([encoding])
Добавлено в: v0.5.0
Возвращает генератор Диффи-Хеллмана в указанной кодировке encoding
. Если предоставлена encoding
, возвращается строка; в противном случае возвращается Buffer
.
diffieHellman.getPrime([encoding])
Добавлено в: v0.5.0
Возвращает простое число Диффи-Хеллмана в указанной кодировке encoding
. Если предоставлена encoding
, возвращается строка; в противном случае возвращается Buffer
.
diffieHellman.getPrivateKey([encoding])
Добавлено в: v0.5.0
Возвращает закрытый ключ Диффи-Хеллмана в указанной encoding
. Если encoding
указана, возвращается строка; в противном случае возвращается Buffer
.
diffieHellman.getPublicKey([encoding])
Добавлено в: v0.5.0
Возвращает открытый ключ Диффи-Хеллмана в указанной encoding
. Если encoding
указана, возвращается строка; в противном случае возвращается Buffer
.
diffieHellman.setPrivateKey(privateKey[, encoding])
Добавлено в: v0.5.0
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиprivateKey
.
Устанавливает закрытый ключ Диффи-Хеллмана. Если аргумент encoding
указан, ожидается, что privateKey
будет строкой. Если encoding
не указан, ожидается, что privateKey
будет Buffer
, TypedArray
или DataView
.
Эта функция автоматически не вычисляет соответствующий открытый ключ. Либо diffieHellman.setPublicKey()
, либо diffieHellman.generateKeys()
можно использовать для ручного предоставления открытого ключа или для автоматического его получения.
diffieHellman.setPublicKey(publicKey[, encoding])
Добавлено в: v0.5.0
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиpublicKey
.
Устанавливает открытый ключ Диффи-Хеллмана. Если предоставлен аргумент encoding
, ожидается, что publicKey
будет строкой. Если encoding
не предоставлен, ожидается, что publicKey
будет Buffer
, TypedArray
или DataView
.
diffieHellman.verifyError
Добавлено в: v0.11.12
Битовое поле, содержащее любые предупреждения и/или ошибки, возникшие в результате проверки, выполненной во время инициализации объекта DiffieHellman
.
Для этого свойства допустимы следующие значения (как определено в модуле node:constants
):
DH_CHECK_P_NOT_SAFE_PRIME
DH_CHECK_P_NOT_PRIME
DH_UNABLE_TO_CHECK_GENERATOR
DH_NOT_SUITABLE_GENERATOR
Класс: DiffieHellmanGroup
Добавлено в: v0.7.5
Класс DiffieHellmanGroup
принимает в качестве аргумента известную группу modp. Он работает так же, как DiffieHellman
, за исключением того, что не позволяет изменять свои ключи после создания. Другими словами, он не реализует методы setPublicKey()
или setPrivateKey()
.
const { createDiffieHellmanGroup } = await import('node:crypto');
const dh = createDiffieHellmanGroup('modp16');
const { createDiffieHellmanGroup } = require('node:crypto');
const dh = createDiffieHellmanGroup('modp16');
Поддерживаются следующие группы:
'modp14'
(2048 бит, RFC 3526 Раздел 3)'modp15'
(3072 бита, RFC 3526 Раздел 4)'modp16'
(4096 бит, RFC 3526 Раздел 5)'modp17'
(6144 бита, RFC 3526 Раздел 6)'modp18'
(8192 бита, RFC 3526 Раздел 7)
Следующие группы по-прежнему поддерживаются, но устарели (см. Предостережения):
'modp1'
(768 бит, RFC 2409 Раздел 6.1)'modp2'
(1024 бита, RFC 2409 Раздел 6.2)'modp5'
(1536 бит, RFC 3526 Раздел 2)
Эти устаревшие группы могут быть удалены в будущих версиях Node.js.
Класс: ECDH
Добавлено в: v0.11.14
Класс ECDH
— это утилита для создания обменов ключами Диффи-Хеллмана на эллиптических кривых (ECDH).
Экземпляры класса ECDH
можно создать с помощью функции crypto.createECDH()
.
import assert from 'node:assert';
const {
createECDH,
} = await import('node:crypto');
// Создаем ключи Алисы...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();
// Создаем ключи Боба...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();
// Обмениваемся и генерируем секрет...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
// OK
const assert = require('node:assert');
const {
createECDH,
} = require('node:crypto');
// Создаем ключи Алисы...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();
// Создаем ключи Боба...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();
// Обмениваемся и генерируем секрет...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
// OK
Статический метод: ECDH.convertKey(key, curve[, inputEncoding[, outputEncoding[, format]]])
Добавлено в: v10.0.0
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>curve
<string>inputEncoding
<string> Кодировка строкиkey
.outputEncoding
<string> Кодировка возвращаемого значения.format
<string> По умолчанию:'uncompressed'
- Возвращает: <Buffer> | <string>
Преобразует открытый ключ EC Diffie-Hellman, заданный параметрами key
и curve
, в формат, указанный параметром format
. Аргумент format
определяет кодировку точки и может быть 'compressed'
, 'uncompressed'
или 'hybrid'
. Предоставленный ключ интерпретируется с использованием указанной inputEncoding
, а возвращаемый ключ кодируется с использованием указанной outputEncoding
.
Используйте crypto.getCurves()
, чтобы получить список доступных названий кривых. В последних выпусках OpenSSL команда openssl ecparam -list_curves
также отображает имя и описание каждой доступной эллиптической кривой.
Если format
не указан, точка будет возвращена в формате 'uncompressed'
.
Если inputEncoding
не указан, ожидается, что key
будет Buffer
, TypedArray
или DataView
.
Пример (распаковка ключа):
const {
createECDH,
ECDH,
} = await import('node:crypto');
const ecdh = createECDH('secp256k1');
ecdh.generateKeys();
const compressedKey = ecdh.getPublicKey('hex', 'compressed');
const uncompressedKey = ECDH.convertKey(compressedKey,
'secp256k1',
'hex',
'hex',
'uncompressed');
// Преобразованный ключ и распакованный открытый ключ должны быть одинаковыми
console.log(uncompressedKey === ecdh.getPublicKey('hex'));
const {
createECDH,
ECDH,
} = require('node:crypto');
const ecdh = createECDH('secp256k1');
ecdh.generateKeys();
const compressedKey = ecdh.getPublicKey('hex', 'compressed');
const uncompressedKey = ECDH.convertKey(compressedKey,
'secp256k1',
'hex',
'hex',
'uncompressed');
// Преобразованный ключ и распакованный открытый ключ должны быть одинаковыми
console.log(uncompressedKey === ecdh.getPublicKey('hex'));
ecdh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
[История]
Версия | Изменения |
---|---|
v10.0.0 | Изменен формат ошибки для лучшей поддержки ошибки недопустимого открытого ключа. |
v6.0.0 | Значение inputEncoding по умолчанию изменено с binary на utf8 . |
v0.11.14 | Добавлено в: v0.11.14 |
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка encoding строкиotherPublicKey
.outputEncoding
<string> Кодировка encoding возвращаемого значения.- Возвращает: <Buffer> | <string>
Вычисляет общий секрет, используя otherPublicKey
в качестве открытого ключа другой стороны, и возвращает вычисленный общий секрет. Предоставленный ключ интерпретируется с использованием указанной inputEncoding
, а возвращаемый секрет кодируется с использованием указанной outputEncoding
. Если inputEncoding
не указана, ожидается, что otherPublicKey
будет Buffer
, TypedArray
или DataView
.
Если указана outputEncoding
, будет возвращена строка; в противном случае будет возвращен Buffer
.
ecdh.computeSecret
выдаст ошибку ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
, если otherPublicKey
находится за пределами эллиптической кривой. Поскольку otherPublicKey
обычно предоставляется удаленным пользователем по небезопасной сети, обязательно обработайте это исключение соответствующим образом.
ecdh.generateKeys([encoding[, format]])
Добавлено в: v0.11.14
encoding
<string> Кодировка возвращаемого значения.format
<string> По умолчанию:'uncompressed'
- Возвращает: <Buffer> | <string>
Генерирует значения закрытого и открытого ключей EC Diffie-Hellman и возвращает открытый ключ в указанном format
и encoding
. Этот ключ следует передать другой стороне.
Аргумент format
указывает кодировку точки и может быть 'compressed'
или 'uncompressed'
. Если format
не указан, точка будет возвращена в формате 'uncompressed'
.
Если encoding
указан, возвращается строка; в противном случае возвращается Buffer
.
ecdh.getPrivateKey([encoding])
Добавлено в: v0.11.14
encoding
<string> Кодировка возвращаемого значения.- Возвращает: <Buffer> | <string> EC Diffie-Hellman в указанной
encoding
.
Если encoding
указан, возвращается строка; в противном случае возвращается Buffer
.
ecdh.getPublicKey([encoding][, format])
Добавлено в: v0.11.14
encoding
<string> Кодировка возвращаемого значения.format
<string> По умолчанию:'uncompressed'
- Возвращает: <Buffer> | <string> Открытый ключ EC Diffie-Hellman в указанном
encoding
иformat
.
Аргумент format
указывает кодировку точки и может быть 'compressed'
или 'uncompressed'
. Если format
не указан, точка будет возвращена в формате 'uncompressed'
.
Если encoding
указан, возвращается строка; в противном случае возвращается Buffer
.
ecdh.setPrivateKey(privateKey[, encoding])
Добавлено в: v0.11.14
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиprivateKey
.
Устанавливает закрытый ключ EC Diffie-Hellman. Если указан encoding
, ожидается, что privateKey
будет строкой; в противном случае ожидается, что privateKey
будет Buffer
, TypedArray
или DataView
.
Если privateKey
недействителен для кривой, указанной при создании объекта ECDH
, выдается ошибка. После установки закрытого ключа связанная открытая точка (ключ) также генерируется и устанавливается в объекте ECDH
.
ecdh.setPublicKey(publicKey[, encoding])
Добавлено в: v0.11.14
Устарело с версии: v5.2.0
[Stable: 0 - Deprecated]
Stable: 0 Стабильность: 0 - Устарело
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строкиpublicKey
.
Устанавливает открытый ключ EC Diffie-Hellman. Если указан encoding
, ожидается, что publicKey
будет строкой; в противном случае ожидается Buffer
, TypedArray
или DataView
.
Обычно нет причин вызывать этот метод, поскольку для вычисления общего секрета ECDH
требуется только закрытый ключ и открытый ключ другой стороны. Обычно вызывается либо ecdh.generateKeys()
, либо ecdh.setPrivateKey()
. Метод ecdh.setPrivateKey()
пытается сгенерировать открытую точку/ключ, связанную с устанавливаемым закрытым ключом.
Пример (получение общего секрета):
const {
createECDH,
createHash,
} = await import('node:crypto');
const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');
// Это сокращенный способ указания одного из предыдущих закрытых
// ключей Алисы. Было бы неразумно использовать такой предсказуемый закрытый ключ в реальном
// приложении.
alice.setPrivateKey(
createHash('sha256').update('alice', 'utf8').digest(),
);
// Боб использует новую сгенерированную криптографически стойкую
// псевдослучайную пару ключей
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
// aliceSecret и bobSecret должны быть одним и тем же общим секретным значением
console.log(aliceSecret === bobSecret);
const {
createECDH,
createHash,
} = require('node:crypto');
const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');
// Это сокращенный способ указания одного из предыдущих закрытых
// ключей Алисы. Было бы неразумно использовать такой предсказуемый закрытый ключ в реальном
// приложении.
alice.setPrivateKey(
createHash('sha256').update('alice', 'utf8').digest(),
);
// Боб использует новую сгенерированную криптографически стойкую
// псевдослучайную пару ключей
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
// aliceSecret и bobSecret должны быть одним и тем же общим секретным значением
console.log(aliceSecret === bobSecret);
Класс: Hash
Добавлено в: v0.1.92
- Расширяет: <stream.Transform>
Класс Hash
- это утилита для создания хеш-дайджестов данных. Он может использоваться одним из двух способов:
- В качестве потока, который является одновременно читаемым и записываемым, где данные записываются для получения вычисленного хеш-дайджеста на читаемой стороне, или
- С помощью методов
hash.update()
иhash.digest()
для получения вычисленного хеша.
Метод crypto.createHash()
используется для создания экземпляров Hash
. Объекты Hash
не должны создаваться непосредственно с помощью ключевого слова new
.
Пример: Использование объектов Hash
в качестве потоков:
const {
createHash,
} = await import('node:crypto');
const hash = createHash('sha256');
hash.on('readable', () => {
// Только один элемент будет создан
// хеш-потоком.
const data = hash.read();
if (data) {
console.log(data.toString('hex'));
// Выводит:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
});
hash.write('some data to hash');
hash.end();
const {
createHash,
} = require('node:crypto');
const hash = createHash('sha256');
hash.on('readable', () => {
// Только один элемент будет создан
// хеш-потоком.
const data = hash.read();
if (data) {
console.log(data.toString('hex'));
// Выводит:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
});
hash.write('some data to hash');
hash.end();
Пример: Использование Hash
и конвейерных потоков:
import { createReadStream } from 'node:fs';
import { stdout } from 'node:process';
const { createHash } = await import('node:crypto');
const hash = createHash('sha256');
const input = createReadStream('test.js');
input.pipe(hash).setEncoding('hex').pipe(stdout);
const { createReadStream } = require('node:fs');
const { createHash } = require('node:crypto');
const { stdout } = require('node:process');
const hash = createHash('sha256');
const input = createReadStream('test.js');
input.pipe(hash).setEncoding('hex').pipe(stdout);
Пример: Использование методов hash.update()
и hash.digest()
:
const {
createHash,
} = await import('node:crypto');
const hash = createHash('sha256');
hash.update('some data to hash');
console.log(hash.digest('hex'));
// Выводит:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
const {
createHash,
} = require('node:crypto');
const hash = createHash('sha256');
hash.update('some data to hash');
console.log(hash.digest('hex'));
// Выводит:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
hash.copy([options])
Добавлено в версии: v13.1.0
options
<Object>stream.transform
options- Возвращает: <Hash>
Создает новый объект Hash
, который содержит глубокую копию внутреннего состояния текущего объекта Hash
.
Необязательный аргумент options
контролирует поведение потока. Для хеш-функций XOF, таких как 'shake256'
, параметр outputLength
можно использовать для указания желаемой длины вывода в байтах.
Ошибка выбрасывается при попытке скопировать объект Hash
после вызова его метода hash.digest()
.
// Calculate a rolling hash.
const {
createHash,
} = await import('node:crypto');
const hash = createHash('sha256');
hash.update('one');
console.log(hash.copy().digest('hex'));
hash.update('two');
console.log(hash.copy().digest('hex'));
hash.update('three');
console.log(hash.copy().digest('hex'));
// Etc.
// Calculate a rolling hash.
const {
createHash,
} = require('node:crypto');
const hash = createHash('sha256');
hash.update('one');
console.log(hash.copy().digest('hex'));
hash.update('two');
console.log(hash.copy().digest('hex'));
hash.update('three');
console.log(hash.copy().digest('hex'));
// Etc.
hash.digest([encoding])
Добавлено в версии: v0.1.92
Вычисляет дайджест всех данных, переданных для хеширования (с использованием метода hash.update()
). Если предоставлена encoding
, будет возвращена строка; в противном случае будет возвращен Buffer
.
Объект Hash
нельзя использовать повторно после вызова метода hash.digest()
. Многократные вызовы приведут к выбросу ошибки.
hash.update(data[, inputEncoding])
[История]
Версия | Изменения |
---|---|
v6.0.0 | inputEncoding по умолчанию изменён с binary на utf8 . |
v0.1.92 | Добавлено в версии: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка строкиdata
.
Обновляет содержимое хэша предоставленными data
, кодировка которых указана в inputEncoding
. Если encoding
не предоставлен, и data
является строкой, применяется кодировка 'utf8'
. Если data
является Buffer
, TypedArray
или DataView
, то inputEncoding
игнорируется.
Этот метод можно вызывать много раз с новыми данными по мере их потоковой передачи.
Класс: Hmac
Добавлено в версии: v0.1.94
- Расширяет: <stream.Transform>
Класс Hmac
— это утилита для создания криптографических дайджестов HMAC. Его можно использовать одним из двух способов:
- Как поток, который является одновременно читаемым и записываемым, где данные записываются для получения вычисленного дайджеста HMAC на стороне чтения, или
- С помощью методов
hmac.update()
иhmac.digest()
для получения вычисленного дайджеста HMAC.
Метод crypto.createHmac()
используется для создания экземпляров Hmac
. Объекты Hmac
не должны создаваться напрямую с использованием ключевого слова new
.
Пример: Использование объектов Hmac
в качестве потоков:
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.on('readable', () => {
// Только один элемент будет произведён
// потоком хэширования.
const data = hmac.read();
if (data) {
console.log(data.toString('hex'));
// Выводит:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f33ad9c87c518115a45971f7f77e
}
});
hmac.write('some data to hash');
hmac.end();
const {
createHmac,
} = require('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.on('readable', () => {
// Только один элемент будет произведён
// потоком хэширования.
const data = hmac.read();
if (data) {
console.log(data.toString('hex'));
// Выводит:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
});
hmac.write('some data to hash');
hmac.end();
Пример: Использование Hmac
и конвейерных потоков:
import { createReadStream } from 'node:fs';
import { stdout } from 'node:process';
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream('test.js');
input.pipe(hmac).pipe(stdout);
const {
createReadStream,
} = require('node:fs');
const {
createHmac,
} = require('node:crypto');
const { stdout } = require('node:process');
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream('test.js');
input.pipe(hmac).pipe(stdout);
Пример: Использование методов hmac.update()
и hmac.digest()
:
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Выводит:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
const {
createHmac,
} = require('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Выводит:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
hmac.digest([encoding])
Added in: v0.1.94
Вычисляет HMAC-дайджест всех данных, переданных с помощью hmac.update()
. Если указана encoding
, возвращается строка; в противном случае возвращается Buffer
.
Объект Hmac
нельзя использовать повторно после вызова hmac.digest()
. Многократные вызовы hmac.digest()
приведут к возникновению ошибки.
hmac.update(data[, inputEncoding])
[История]
Версия | Изменения |
---|---|
v6.0.0 | Значение inputEncoding по умолчанию изменено с binary на utf8 . |
v0.1.94 | Added in: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка строкиdata
.
Обновляет содержимое Hmac
с заданными data
, кодировка которых указана в inputEncoding
. Если encoding
не указана, а data
является строкой, принудительно устанавливается кодировка 'utf8'
. Если data
является Buffer
, TypedArray
или DataView
, то inputEncoding
игнорируется.
Это можно вызывать много раз с новыми данными по мере их потоковой передачи.
Class: KeyObject
[История]
Версия | Изменения |
---|---|
v14.5.0, v12.19.0 | Экземпляры этого класса теперь могут быть переданы в рабочие потоки с помощью postMessage . |
v11.13.0 | Этот класс теперь экспортируется. |
v11.6.0 | Added in: v11.6.0 |
Node.js использует класс KeyObject
для представления симметричного или асимметричного ключа, и каждый вид ключа предоставляет разные функции. Методы crypto.createSecretKey()
, crypto.createPublicKey()
и crypto.createPrivateKey()
используются для создания экземпляров KeyObject
. Объекты KeyObject
не следует создавать непосредственно с помощью ключевого слова new
.
Большинству приложений следует рассмотреть возможность использования нового API KeyObject
вместо передачи ключей в виде строк или Buffer
из-за улучшенных функций безопасности.
Экземпляры KeyObject
могут быть переданы в другие потоки через postMessage()
. Получатель получает клонированный KeyObject
, и KeyObject
не нужно указывать в аргументе transferList
.
Статический метод: KeyObject.from(key)
Добавлено в: v15.0.0
key
<CryptoKey>- Возвращает: <KeyObject>
Пример: Преобразование экземпляра CryptoKey
в KeyObject
:
const { KeyObject } = await import('node:crypto');
const { subtle } = globalThis.crypto;
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const keyObject = KeyObject.from(key);
console.log(keyObject.symmetricKeySize);
// Prints: 32 (symmetric key size in bytes)
const { KeyObject } = require('node:crypto');
const { subtle } = globalThis.crypto;
(async function() {
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const keyObject = KeyObject.from(key);
console.log(keyObject.symmetricKeySize);
// Prints: 32 (symmetric key size in bytes)
})();
keyObject.asymmetricKeyDetails
[История]
Версия | Изменения |
---|---|
v16.9.0 | Предоставление параметров последовательности RSASSA-PSS-params для ключей RSA-PSS. |
v15.7.0 | Добавлено в: v15.7.0 |
- <Object>
modulusLength
: <number> Размер ключа в битах (RSA, DSA).publicExponent
: <bigint> Открытая экспонента (RSA).hashAlgorithm
: <string> Название дайджеста сообщения (RSA-PSS).mgf1HashAlgorithm
: <string> Название дайджеста сообщения, используемого MGF1 (RSA-PSS).saltLength
: <number> Минимальная длина соли в байтах (RSA-PSS).divisorLength
: <number> Размерq
в битах (DSA).namedCurve
: <string> Название кривой (EC).
Это свойство существует только у асимметричных ключей. В зависимости от типа ключа, этот объект содержит информацию о ключе. Ни одна из информаций, полученных через это свойство, не может быть использована для уникальной идентификации ключа или для компрометации безопасности ключа.
Для ключей RSA-PSS, если ключевой материал содержит последовательность RSASSA-PSS-params
, будут установлены свойства hashAlgorithm
, mgf1HashAlgorithm
и saltLength
.
Другие детали ключа могут быть предоставлены через этот API с использованием дополнительных атрибутов.
keyObject.asymmetricKeyType
[История]
Версия | Изменения |
---|---|
v13.9.0, v12.17.0 | Добавлена поддержка 'dh' . |
v12.0.0 | Добавлена поддержка 'rsa-pss' . |
v12.0.0 | Теперь это свойство возвращает undefined для экземпляров KeyObject неопознанного типа вместо прерывания. |
v12.0.0 | Добавлена поддержка 'x25519' и 'x448' . |
v12.0.0 | Добавлена поддержка 'ed25519' и 'ed448' . |
v11.6.0 | Добавлено в: v11.6.0 |
Для асимметричных ключей это свойство представляет тип ключа. Поддерживаемые типы ключей:
'rsa'
(OID 1.2.840.113549.1.1.1)'rsa-pss'
(OID 1.2.840.113549.1.1.10)'dsa'
(OID 1.2.840.10040.4.1)'ec'
(OID 1.2.840.10045.2.1)'x25519'
(OID 1.3.101.110)'x448'
(OID 1.3.101.111)'ed25519'
(OID 1.3.101.112)'ed448'
(OID 1.3.101.113)'dh'
(OID 1.2.840.113549.1.3.1)
Это свойство имеет значение undefined
для неопознанных типов KeyObject
и симметричных ключей.
keyObject.equals(otherKeyObject)
Добавлено в: v17.7.0, v16.15.0
otherKeyObject
: <KeyObject>KeyObject
, с которым сравниваетсяkeyObject
.- Возвращает: <boolean>
Возвращает true
или false
в зависимости от того, имеют ли ключи точно такой же тип, значение и параметры. Этот метод не является постоянным по времени.
keyObject.export([options])
[История]
Версия | Изменения |
---|---|
v15.9.0 | Добавлена поддержка формата 'jwk' . |
v11.6.0 | Добавлено в: v11.6.0 |
Для симметричных ключей можно использовать следующие параметры кодирования:
format
: <string> Должно быть'buffer'
(по умолчанию) или'jwk'
.
Для открытых ключей можно использовать следующие параметры кодирования:
type
: <string> Должно быть одним из'pkcs1'
(только RSA) или'spki'
.format
: <string> Должно быть'pem'
,'der'
или'jwk'
.
Для закрытых ключей можно использовать следующие параметры кодирования:
type
: <string> Должно быть одним из'pkcs1'
(только RSA),'pkcs8'
или'sec1'
(только EC).format
: <string> Должно быть'pem'
,'der'
или'jwk'
.cipher
: <string> Если указано, закрытый ключ будет зашифрован с использованием указанногоcipher
иpassphrase
с использованием шифрования на основе пароля PKCS#5 v2.0.passphrase
: <string> | <Buffer> Парольная фраза для использования при шифровании, см.cipher
.
Тип результата зависит от выбранного формата кодирования, когда PEM - это строка, когда DER - это буфер, содержащий данные, закодированные как DER, когда JWK - это объект.
Когда был выбран формат кодирования JWK, все остальные параметры кодирования игнорируются.
Ключи типа PKCS#1, SEC1 и PKCS#8 могут быть зашифрованы с использованием комбинации параметров cipher
и format
. Тип PKCS#8 type
можно использовать с любым format
для шифрования любого алгоритма ключа (RSA, EC или DH), указав cipher
. PKCS#1 и SEC1 можно зашифровать, указав cipher
, только если используется формат PEM format
. Для максимальной совместимости используйте PKCS#8 для зашифрованных закрытых ключей. Поскольку PKCS#8 определяет свой собственный механизм шифрования, шифрование на уровне PEM не поддерживается при шифровании ключа PKCS#8. См. RFC 5208 для шифрования PKCS#8 и RFC 1421 для шифрования PKCS#1 и SEC1.
keyObject.symmetricKeySize
Добавлено в: v11.6.0
Для секретных ключей это свойство представляет размер ключа в байтах. Это свойство undefined
для асимметричных ключей.
keyObject.toCryptoKey(algorithm, extractable, keyUsages)
Добавлено в: v23.0.0
algorithm
: <AlgorithmIdentifier> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>extractable
: <boolean>keyUsages
: <string[]> См. Использование ключей.Возвращает: <CryptoKey>
Преобразует экземпляр KeyObject
в CryptoKey
.
keyObject.type
Добавлено в: v11.6.0
В зависимости от типа данного KeyObject
это свойство может быть 'secret'
для секретных (симметричных) ключей, 'public'
для открытых (асимметричных) ключей или 'private'
для закрытых (асимметричных) ключей.
Класс: Sign
Добавлено в: v0.1.92
- Наследует: <stream.Writable>
Класс Sign
— это утилита для создания подписей. Он может использоваться одним из двух способов:
- Как доступный для записи поток, куда записываются данные для подписи, и метод
sign.sign()
используется для создания и возврата подписи, или - С использованием методов
sign.update()
иsign.sign()
для создания подписи.
Метод crypto.createSign()
используется для создания экземпляров Sign
. Аргументом является строковое имя используемой хеш-функции. Объекты Sign
не должны создаваться напрямую с помощью ключевого слова new
.
Пример: Использование объектов Sign
и Verify
в качестве потоков:
const {
generateKeyPairSync,
createSign,
createVerify,
} = await import('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
});
const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');
const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Выводит: true
const {
generateKeyPairSync,
createSign,
createVerify,
} = require('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
});
const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');
const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Выводит: true
Пример: Использование методов sign.update()
и verify.update()
:
const {
generateKeyPairSync,
createSign,
createVerify,
} = await import('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
});
const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);
const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Выводит: true
const {
generateKeyPairSync,
createSign,
createVerify,
} = require('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
});
const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);
const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Выводит: true
sign.sign(privateKey[, outputEncoding])
[История изменений]
Версия | Изменения |
---|---|
v15.0.0 | privateKey теперь может быть ArrayBuffer и CryptoKey. |
v13.2.0, v12.16.0 | Эта функция теперь поддерживает подписи IEEE-P1363 DSA и ECDSA. |
v12.0.0 | Эта функция теперь поддерживает ключи RSA-PSS. |
v11.6.0 | Эта функция теперь поддерживает объекты ключей. |
v8.0.0 | Добавлена поддержка RSASSA-PSS и дополнительных параметров. |
v0.1.92 | Добавлено в версии: v0.1.92 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>
Вычисляет подпись для всех данных, переданных через sign.update()
или sign.write()
.
Если privateKey
не является KeyObject
, эта функция ведет себя так, как если бы privateKey
был передан в crypto.createPrivateKey()
. Если это объект, можно передать следующие дополнительные свойства:
dsaEncoding
<string> Для DSA и ECDSA этот параметр определяет формат создаваемой подписи. Он может быть одним из следующих:'der'
(по умолчанию): DER-кодированная ASN.1 структура подписи, кодирующая(r, s)
.'ieee-p1363'
: Формат подписиr || s
, как предложено в IEEE-P1363.
padding
<integer> Необязательное значение отступа для RSA, одно из следующих:crypto.constants.RSA_PKCS1_PADDING
(по умолчанию)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
будет использовать MGF1 с той же хэш-функцией, которая использовалась для подписи сообщения, как указано в разделе 3.1 RFC 4055, если только хэш-функция MGF1 не была указана как часть ключа в соответствии с разделом 3.3 RFC 4055.
saltLength
<integer> Длина соли, когда отступ равенRSA_PKCS1_PSS_PADDING
. Специальное значениеcrypto.constants.RSA_PSS_SALTLEN_DIGEST
устанавливает длину соли равной размеру дайджеста,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(по умолчанию) устанавливает ее на максимально допустимое значение.
Если предоставлен outputEncoding
, возвращается строка; в противном случае возвращается Buffer
.
Объект Sign
нельзя использовать повторно после вызова метода sign.sign()
. Многократные вызовы sign.sign()
приведут к возникновению ошибки.
sign.update(data[, inputEncoding])
[История]
Версия | Изменения |
---|---|
v6.0.0 | Кодировка inputEncoding по умолчанию изменена с binary на utf8 . |
v0.1.92 | Добавлено в: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка строкиdata
.
Обновляет содержимое Sign
переданными data
, кодировка которых указана в inputEncoding
. Если encoding
не указана и data
является строкой, то применяется кодировка 'utf8'
. Если data
является Buffer
, TypedArray
или DataView
, то inputEncoding
игнорируется.
Этот метод можно вызывать много раз с новыми данными, поскольку они передаются потоком.
Класс: Verify
Добавлено в: v0.1.92
- Расширяет: <stream.Writable>
Класс Verify
— это утилита для проверки подписей. Его можно использовать одним из двух способов:
- Как записываемый поток, где записанные данные используются для проверки предоставленной подписи, или
- С помощью методов
verify.update()
иverify.verify()
для проверки подписи.
Метод crypto.createVerify()
используется для создания экземпляров Verify
. Объекты Verify
не следует создавать напрямую с помощью ключевого слова new
.
Примеры смотрите в Sign
.
verify.update(data[, inputEncoding])
[История]
Версия | Изменения |
---|---|
v6.0.0 | Кодировка inputEncoding по умолчанию изменена с binary на utf8 . |
v0.1.92 | Добавлено в: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка строкиdata
.
Обновляет содержимое Verify
переданными data
, кодировка которых указана в inputEncoding
. Если inputEncoding
не указана и data
является строкой, то применяется кодировка 'utf8'
. Если data
является Buffer
, TypedArray
или DataView
, то inputEncoding
игнорируется.
Этот метод можно вызывать много раз с новыми данными, поскольку они передаются потоком.
verify.verify(object, signature[, signatureEncoding])
[История]
Версия | Изменения |
---|---|
v15.0.0 | Объект также может быть ArrayBuffer и CryptoKey. |
v13.2.0, v12.16.0 | Эта функция теперь поддерживает подписи IEEE-P1363 DSA и ECDSA. |
v12.0.0 | Эта функция теперь поддерживает ключи RSA-PSS. |
v11.7.0 | Ключ теперь может быть закрытым ключом. |
v8.0.0 | Добавлена поддержка RSASSA-PSS и дополнительных параметров. |
v0.1.92 | Добавлено в: v0.1.92 |
object
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Возвращает: <boolean>
true
илиfalse
в зависимости от достоверности подписи для данных и открытого ключа.
Проверяет предоставленные данные, используя заданный object
и signature
.
Если object
не является KeyObject
, эта функция ведет себя так, как если бы object
был передан в crypto.createPublicKey()
. Если это объект, можно передать следующие дополнительные свойства:
dsaEncoding
<string> Для DSA и ECDSA эта опция указывает формат подписи. Это может быть одно из следующих:'der'
(по умолчанию): Структура подписи ASN.1 с DER-кодировкой, кодирующая(r, s)
.'ieee-p1363'
: Формат подписиr || s
, как предложено в IEEE-P1363.
padding
<integer> Необязательное значение заполнения для RSA, одно из следующих:crypto.constants.RSA_PKCS1_PADDING
(по умолчанию)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
будет использовать MGF1 с той же хеш-функцией, которая используется для проверки сообщения, как указано в разделе 3.1 RFC 4055, если только хеш-функция MGF1 не была указана как часть ключа в соответствии с разделом 3.3 RFC 4055.
saltLength
<integer> Длина соли для случая, когда отступ равенRSA_PKCS1_PSS_PADDING
. Специальное значениеcrypto.constants.RSA_PSS_SALTLEN_DIGEST
устанавливает длину соли равной размеру дайджеста,crypto.constants.RSA_PSS_SALTLEN_AUTO
(по умолчанию) приводит к тому, что она определяется автоматически.
Аргумент signature
- это ранее вычисленная подпись для данных в signatureEncoding
. Если указан signatureEncoding
, ожидается, что signature
будет строкой; в противном случае ожидается, что signature
будет Buffer
, TypedArray
или DataView
.
Объект verify
нельзя использовать повторно после вызова verify.verify()
. Многократные вызовы verify.verify()
приведут к возникновению ошибки.
Поскольку открытые ключи можно получить из закрытых ключей, вместо открытого ключа можно передать закрытый ключ.
Класс: X509Certificate
Добавлено в: v15.6.0
Инкапсулирует X509 сертификат и предоставляет доступ только для чтения к его информации.
const { X509Certificate } = await import('node:crypto');
const x509 = new X509Certificate('{... pem encoded cert ...}');
console.log(x509.subject);
const { X509Certificate } = require('node:crypto');
const x509 = new X509Certificate('{... pem encoded cert ...}');
console.log(x509.subject);
new X509Certificate(buffer)
Добавлено в: v15.6.0
buffer
<string> | <TypedArray> | <Buffer> | <DataView> Сертификат X509 в кодировке PEM или DER.
x509.ca
Добавлено в: v15.6.0
- Тип: <boolean> Будет
true
, если это сертификат центра сертификации (CA).
x509.checkEmail(email[, options])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Параметр subject теперь по умолчанию имеет значение 'default' . |
v17.5.0, v16.15.0 | Параметр subject теперь может быть установлен в значение 'default' . |
v17.5.0, v16.14.1 | Параметры wildcards , partialWildcards , multiLabelWildcards и singleLabelSubdomains были удалены, поскольку они не оказывали никакого эффекта. |
v15.6.0 | Добавлено в: v15.6.0 |
email
<string>options
<Object>subject
<string>'default'
,'always'
или'never'
. По умолчанию:'default'
.
Возвращает: <string> | <undefined> Возвращает
email
, если сертификат соответствует,undefined
, если не соответствует.
Проверяет, соответствует ли сертификат указанному адресу электронной почты.
Если параметр 'subject'
не определен или установлен в 'default'
, субъект сертификата учитывается только в том случае, если расширение subject alternative name либо не существует, либо не содержит адресов электронной почты.
Если параметр 'subject'
установлен в 'always'
, и если расширение subject alternative name либо не существует, либо не содержит совпадающего адреса электронной почты, учитывается субъект сертификата.
Если параметр 'subject'
установлен в 'never'
, субъект сертификата никогда не учитывается, даже если сертификат не содержит альтернативных имен субъекта.
x509.checkHost(name[, options])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Параметр subject теперь по умолчанию имеет значение 'default' . |
v17.5.0, v16.15.0 | Параметру subject теперь можно присвоить значение 'default' . |
v15.6.0 | Добавлено в версии: v15.6.0 |
name
<string>options
<Object>Возвращает: <string> | <undefined> Возвращает имя субъекта, соответствующее
name
, илиundefined
, если имя субъекта не соответствуетname
.
Проверяет, соответствует ли сертификат заданному имени хоста.
Если сертификат соответствует заданному имени хоста, возвращается соответствующее имя субъекта. Возвращаемое имя может быть точным совпадением (например, foo.example.com
) или может содержать подстановочные знаки (например, *.example.com
). Поскольку сравнение имен хостов нечувствительно к регистру, возвращаемое имя субъекта также может отличаться от заданного name
по регистру.
Если параметр 'subject'
не определен или установлен в 'default'
, субъект сертификата рассматривается только в том случае, если расширение альтернативного имени субъекта либо не существует, либо не содержит каких-либо DNS-имен. Это поведение согласуется с RFC 2818 ("HTTP Over TLS").
Если параметр 'subject'
установлен в 'always'
и если расширение альтернативного имени субъекта либо не существует, либо не содержит соответствующего DNS-имени, субъект сертификата рассматривается.
Если параметр 'subject'
установлен в 'never'
, субъект сертификата никогда не рассматривается, даже если сертификат не содержит альтернативных имен субъектов.
x509.checkIP(ip)
[История]
Версия | Изменения |
---|---|
v17.5.0, v16.14.1 | Аргумент options был удален, так как он не имел никакого эффекта. |
v15.6.0 | Добавлено в: v15.6.0 |
ip
<string>- Возвращает: <string> | <undefined> Возвращает
ip
, если сертификат соответствует,undefined
, если нет.
Проверяет, соответствует ли сертификат указанному IP-адресу (IPv4 или IPv6).
Учитываются только альтернативные имена субъектов RFC 5280 iPAddress
, и они должны точно соответствовать данному ip
-адресу. Другие альтернативные имена субъектов, а также поле субъекта сертификата игнорируются.
x509.checkIssued(otherCert)
Добавлено в: v15.6.0
otherCert
<X509Certificate>- Возвращает: <boolean>
Проверяет, был ли этот сертификат выдан данным otherCert
.
x509.checkPrivateKey(privateKey)
Добавлено в: v15.6.0
privateKey
<KeyObject> Закрытый ключ.- Возвращает: <boolean>
Проверяет, соответствует ли открытый ключ для этого сертификата данному закрытому ключу.
x509.extKeyUsage
Добавлено в: v15.6.0
- Тип: <string[]>
Массив, детализирующий расширенные области применения ключа для этого сертификата.
x509.fingerprint
Добавлено в: v15.6.0
- Тип: <string>
SHA-1 отпечаток этого сертификата.
Поскольку SHA-1 криптографически сломан, и поскольку безопасность SHA-1 значительно хуже, чем у алгоритмов, которые обычно используются для подписи сертификатов, рассмотрите возможность использования x509.fingerprint256
вместо этого.
x509.fingerprint256
Добавлено в: v15.6.0
- Тип: <string>
Отпечаток SHA-256 этого сертификата.
x509.fingerprint512
Добавлено в: v17.2.0, v16.14.0
- Тип: <string>
Отпечаток SHA-512 этого сертификата.
Поскольку вычисление отпечатка SHA-256 обычно происходит быстрее, и поскольку он занимает только половину размера отпечатка SHA-512, x509.fingerprint256
может быть лучшим выбором. Хотя SHA-512, предположительно, обеспечивает более высокий уровень безопасности в целом, безопасность SHA-256 соответствует безопасности большинства алгоритмов, которые обычно используются для подписи сертификатов.
x509.infoAccess
[История]
Версия | Изменения |
---|---|
v17.3.1, v16.13.2 | Части этой строки могут быть закодированы как строковые литералы JSON в ответ на CVE-2021-44532. |
v15.6.0 | Добавлено в: v15.6.0 |
- Тип: <string>
Текстовое представление расширения доступа к информации об органе сертификации.
Это список разделенных символами новой строки описаний доступа. Каждая строка начинается с метода доступа и вида местоположения доступа, за которыми следует двоеточие и значение, связанное с местоположением доступа.
После префикса, обозначающего метод доступа и вид местоположения доступа, остальная часть каждой строки может быть заключена в кавычки, чтобы указать, что значение является строковым литералом JSON. Для обратной совместимости Node.js использует строковые литералы JSON внутри этого свойства только тогда, когда это необходимо, чтобы избежать двусмысленности. Сторонний код должен быть готов к обработке обоих возможных форматов записей.
x509.issuer
Добавлено в: v15.6.0
- Тип: <string>
Идентификатор издателя, включенный в этот сертификат.
x509.issuerCertificate
Добавлено в: v15.9.0
- Тип: <X509Certificate>
Сертификат издателя или undefined
, если сертификат издателя недоступен.
x509.publicKey
Добавлено в: v15.6.0
- Тип: <KeyObject>
Открытый ключ <KeyObject> для этого сертификата.
x509.raw
Добавлено в: v15.6.0
- Тип: <Buffer>
Buffer
, содержащий DER-кодировку этого сертификата.
x509.serialNumber
Добавлено в: v15.6.0
- Тип: <string>
Серийный номер этого сертификата.
Серийные номера назначаются центрами сертификации и не являются уникальными идентификаторами сертификатов. Вместо этого рассмотрите возможность использования x509.fingerprint256
в качестве уникального идентификатора.
x509.subject
Добавлено в: v15.6.0
- Тип: <string>
Полный субъект этого сертификата.
x509.subjectAltName
[История]
Версия | Изменения |
---|---|
v17.3.1, v16.13.2 | Части этой строки могут быть закодированы как строковые литералы JSON в ответ на CVE-2021-44532. |
v15.6.0 | Добавлено в: v15.6.0 |
- Тип: <string>
Альтернативное имя субъекта, указанное для этого сертификата.
Это разделенный запятыми список альтернативных имен субъектов. Каждая запись начинается со строки, идентифицирующей вид альтернативного имени субъекта, за которой следует двоеточие и значение, связанное с записью.
Более ранние версии Node.js ошибочно предполагали, что безопасно разделять это свойство по двухсимвольной последовательности ', '
(см. CVE-2021-44532). Однако как вредоносные, так и законные сертификаты могут содержать альтернативные имена субъектов, которые включают эту последовательность при представлении в виде строки.
После префикса, обозначающего тип записи, остаток каждой записи может быть заключен в кавычки, чтобы указать, что значение является строковым литералом JSON. Для обратной совместимости Node.js использует строковые литералы JSON в этом свойстве только тогда, когда это необходимо, чтобы избежать двусмысленности. Сторонний код должен быть готов к обработке обоих возможных форматов записей.
x509.toJSON()
Добавлено в: v15.6.0
- Тип: <string>
Стандартной JSON-кодировки для X509-сертификатов не существует. Метод toJSON()
возвращает строку, содержащую сертификат в кодировке PEM.
x509.toLegacyObject()
Добавлено в: v15.6.0
- Тип: <Object>
Возвращает информацию об этом сертификате, используя устаревшую кодировку объекта сертификата.
x509.toString()
Добавлено в: v15.6.0
- Тип: <string>
Возвращает сертификат в кодировке PEM.
x509.validFrom
Добавлено в: v15.6.0
- Тип: <string>
Дата/время, с которого этот сертификат действителен.
x509.validFromDate
Добавлено в: v23.0.0
- Тип: <Date>
Дата/время, с которого этот сертификат действителен, заключенные в объект Date
.
x509.validTo
Добавлено в: v15.6.0
- Тип: <string>
Дата/время, до которого этот сертификат действителен.
x509.validToDate
Добавлено в: v23.0.0
- Тип: <Date>
Дата/время, до которого этот сертификат действителен, заключенные в объект Date
.
x509.verify(publicKey)
Добавлено в: v15.6.0
publicKey
<KeyObject> Открытый ключ.- Возвращает: <boolean>
Проверяет, что этот сертификат был подписан данным открытым ключом. Не выполняет никаких других проверок валидации сертификата.
Методы и свойства модуля node:crypto
crypto.checkPrime(candidate[, options], callback)
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v15.8.0 | Добавлено в: v15.8.0 |
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> Возможное простое число, закодированное как последовательность байтов с прямым порядком байтов произвольной длины.options
<Object>checks
<number> Количество итераций вероятностного теста простоты Миллера-Рабина. Если значение равно0
(нулю), используется количество проверок, которое дает частоту ложных срабатываний не более 2 для случайных входных данных. Следует проявлять осторожность при выборе количества проверок. Обратитесь к документации OpenSSL для функцииBN_is_prime_ex
для получения более подробной информации об опцияхnchecks
. По умолчанию:0
callback
<Function>
Проверяет, является ли candidate
простым числом.
crypto.checkPrimeSync(candidate[, options])
Добавлено в: v15.8.0
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> Возможное простое число, закодированное как последовательность октетов в формате big endian произвольной длины.options
<Object>checks
<number> Количество итераций вероятностной проверки простоты числа по тесту Миллера-Рабина. Если значение равно0
(нулю), используется количество проверок, которое дает вероятность ложноположительного результата не более 2 для случайных входных данных. При выборе количества проверок необходимо проявлять осторожность. Подробности смотрите в документации OpenSSL для функцииBN_is_prime_ex
параметрnchecks
. По умолчанию:0
Возвращает: <boolean>
true
, если кандидат является простым числом с вероятностью ошибки менее0.25 ** options.checks
.
Проверяет, является ли candidate
простым числом.
crypto.constants
Добавлено в: v6.3.0
Объект, содержащий часто используемые константы для операций, связанных с криптографией и безопасностью. Конкретные константы, определенные в настоящее время, описаны в Константы Crypto.
crypto.createCipheriv(algorithm, key, iv[, options])
[История]
Версия | Изменения |
---|---|
v17.9.0, v16.17.0 | Параметр authTagLength теперь не является обязательным при использовании шифра chacha20-poly1305 и по умолчанию равен 16 байтам. |
v15.0.0 | Аргументы password и iv могут быть ArrayBuffer и ограничены максимум 2 ** 31 - 1 байтами каждый. |
v11.6.0 | Аргумент key теперь может быть KeyObject . |
v11.2.0, v10.17.0 | Теперь поддерживается шифр chacha20-poly1305 (вариант IETF ChaCha20-Poly1305). |
v10.10.0 | Теперь поддерживаются шифры в режиме OCB. |
v10.2.0 | Теперь можно использовать параметр authTagLength для создания более коротких тегов аутентификации в режиме GCM, по умолчанию 16 байт. |
v9.9.0 | Параметр iv теперь может быть null для шифров, которым не нужен вектор инициализации. |
v0.1.94 | Добавлено в версии: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>iv
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <null>options
<Object>stream.transform
options- Возвращает: <Cipher>
Создает и возвращает объект Cipher
с заданными algorithm
, key
и вектором инициализации (iv
).
Аргумент options
управляет поведением потока и является необязательным, за исключением случаев, когда используется шифр в режиме CCM или OCB (например, 'aes-128-ccm'
). В этом случае параметр authTagLength
является обязательным и определяет длину тега аутентификации в байтах, см. режим CCM. В режиме GCM параметр authTagLength
не является обязательным, но может использоваться для установки длины тега аутентификации, который будет возвращен getAuthTag()
, и по умолчанию равен 16 байтам. Для chacha20-poly1305
параметр authTagLength
по умолчанию равен 16 байтам.
algorithm
зависит от OpenSSL, примеры: 'aes192'
и т. д. В последних версиях OpenSSL openssl list -cipher-algorithms
отобразит доступные алгоритмы шифрования.
key
— это необработанный ключ, используемый algorithm
, а iv
— это вектор инициализации. Оба аргумента должны быть строками с кодировкой 'utf8'
, Buffers, TypedArray
или DataView
. key
может дополнительно быть KeyObject
типа secret
. Если шифру не нужен вектор инициализации, iv
может быть null
.
При передаче строк для key
или iv
, пожалуйста, учитывайте предостережения при использовании строк в качестве входных данных для криптографических API.
Векторы инициализации должны быть непредсказуемыми и уникальными; в идеале, они будут криптографически случайными. Они не обязательно должны быть секретными: IV обычно просто добавляются к зашифрованным сообщениям в незашифрованном виде. Может показаться противоречивым, что что-то должно быть непредсказуемым и уникальным, но не обязательно должно быть секретным; помните, что злоумышленник не должен иметь возможности заранее предсказать, каким будет данный IV.
crypto.createDecipheriv(algorithm, key, iv[, options])
[История изменений]
Версия | Изменения |
---|---|
v17.9.0, v16.17.0 | Параметр authTagLength теперь не обязателен при использовании шифра chacha20-poly1305 и по умолчанию равен 16 байтам. |
v11.6.0 | Аргумент key теперь может быть KeyObject . |
v11.2.0, v10.17.0 | Теперь поддерживается шифр chacha20-poly1305 (вариант IETF ChaCha20-Poly1305). |
v10.10.0 | Теперь поддерживаются шифры в режиме OCB. |
v10.2.0 | Теперь параметр authTagLength можно использовать для ограничения принимаемых длин тегов аутентификации GCM. |
v9.9.0 | Параметр iv теперь может быть null для шифров, которым не нужен вектор инициализации. |
v0.1.94 | Добавлено в версии: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>iv
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <null>options
<Object>stream.transform
options- Возвращает: <Decipher>
Создает и возвращает объект Decipher
, использующий заданный algorithm
, key
и вектор инициализации (iv
).
Аргумент options
управляет поведением потока и является необязательным, за исключением случаев, когда используется шифр в режиме CCM или OCB (например, 'aes-128-ccm'
). В этом случае параметр authTagLength
является обязательным и указывает длину тега аутентификации в байтах, см. режим CCM. Для AES-GCM и chacha20-poly1305
параметр authTagLength
по умолчанию равен 16 байтам и должен быть установлен в другое значение, если используется другая длина.
algorithm
зависит от OpenSSL, примеры: 'aes192'
и т. д. В последних версиях OpenSSL openssl list -cipher-algorithms
отобразит доступные алгоритмы шифрования.
key
- это необработанный ключ, используемый algorithm
, а iv
- это вектор инициализации. Оба аргумента должны быть строками в кодировке 'utf8'
, Buffers, TypedArray
или DataView
. key
может быть необязательно KeyObject
типа secret
. Если шифру не нужен вектор инициализации, iv
может быть null
.
При передаче строк для key
или iv
, пожалуйста, обратите внимание на предостережения при использовании строк в качестве входных данных для криптографических API.
Векторы инициализации должны быть непредсказуемыми и уникальными; в идеале, они должны быть криптографически случайными. Они не должны быть секретными: IV обычно просто добавляются к зашифрованным сообщениям без шифрования. Может показаться противоречивым, что что-то должно быть непредсказуемым и уникальным, но не должно быть секретным; помните, что злоумышленник не должен иметь возможности предсказать заранее, каким будет данный IV.
crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])
[История]
Версия | Изменения |
---|---|
v8.0.0 | Аргумент prime теперь может быть любым TypedArray или DataView . |
v8.0.0 | Аргумент prime теперь может быть Uint8Array . |
v6.0.0 | Значение по умолчанию для параметров кодировки изменено с binary на utf8 . |
v0.11.12 | Добавлено в версии: v0.11.12 |
prime
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>primeEncoding
<string> Кодировка строкиprime
.generator
<number> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> По умолчанию:2
generatorEncoding
<string> Кодировка строкиgenerator
.- Возвращает: <DiffieHellman>
Создает объект обмена ключами DiffieHellman
с использованием предоставленного prime
и необязательного конкретного generator
.
Аргумент generator
может быть числом, строкой или Buffer
. Если generator
не указан, используется значение 2
.
Если указан primeEncoding
, ожидается, что prime
будет строкой; в противном случае ожидается Buffer
, TypedArray
или DataView
.
Если указан generatorEncoding
, ожидается, что generator
будет строкой; в противном случае ожидается число, Buffer
, TypedArray
или DataView
.
crypto.createDiffieHellman(primeLength[, generator])
Added in: v0.5.0
primeLength
<number>generator
<number> Default:2
- Возвращает: <DiffieHellman>
Создает объект обмена ключами DiffieHellman
и генерирует простое число длиной primeLength
бит, используя необязательный числовой generator
. Если generator
не указан, используется значение 2
.
crypto.createDiffieHellmanGroup(name)
Added in: v0.9.3
name
<string>- Возвращает: <DiffieHellmanGroup>
Псевдоним для crypto.getDiffieHellman()
crypto.createECDH(curveName)
Added in: v0.11.14
Создает объект обмена ключами Elliptic Curve Diffie-Hellman (ECDH
), используя предопределенную кривую, указанную строкой curveName
. Используйте crypto.getCurves()
чтобы получить список доступных имен кривых. В последних выпусках OpenSSL, openssl ecparam -list_curves
также отобразит имя и описание каждой доступной эллиптической кривой.
crypto.createHash(algorithm[, options])
[История]
Версия | Изменения |
---|---|
v12.8.0 | Добавлена опция outputLength для XOF-функций хеширования. |
v0.1.92 | Добавлено в: v0.1.92 |
algorithm
<string>options
<Object>stream.transform
options- Возвращает: <Hash>
Создает и возвращает объект Hash
, который можно использовать для создания хеш-дайджестов, используя заданный algorithm
. Необязательный аргумент options
управляет поведением потока. Для XOF-функций хеширования, таких как 'shake256'
, опция outputLength
может быть использована для указания желаемой длины вывода в байтах.
algorithm
зависит от доступных алгоритмов, поддерживаемых версией OpenSSL на платформе. Примеры: 'sha256'
, 'sha512'
и т. д. В последних выпусках OpenSSL, openssl list -digest-algorithms
отобразит доступные алгоритмы дайджеста.
Пример: генерация sha256 суммы файла
import {
createReadStream,
} from 'node:fs';
import { argv } from 'node:process';
const {
createHash,
} = await import('node:crypto');
const filename = argv[2];
const hash = createHash('sha256');
const input = createReadStream(filename);
input.on('readable', () => {
// Только один элемент будет сгенерирован
// хеш-потоком.
const data = input.read();
if (data)
hash.update(data);
else {
console.log(`${hash.digest('hex')} ${filename}`);
}
});
const {
createReadStream,
} = require('node:fs');
const {
createHash,
} = require('node:crypto');
const { argv } = require('node:process');
const filename = argv[2];
const hash = createHash('sha256');
const input = createReadStream(filename);
input.on('readable', () => {
// Только один элемент будет сгенерирован
// хеш-потоком.
const data = input.read();
if (data)
hash.update(data);
else {
console.log(`${hash.digest('hex')} ${filename}`);
}
});
crypto.createHmac(algorithm, key[, options])
[История]
Версия | Изменения |
---|---|
v15.0.0 | Ключ также может быть ArrayBuffer или CryptoKey. Добавлен параметр кодировки. Ключ не может содержать более 2 ** 32 - 1 байт. |
v11.6.0 | Аргумент key теперь может быть KeyObject . |
v0.1.94 | Добавлено в версии: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>options
<Object>stream.transform
optionsencoding
<string> Строковая кодировка, используемая, когдаkey
является строкой.
Возвращает: <Hmac>
Создает и возвращает объект Hmac
, использующий заданный algorithm
и key
. Необязательный аргумент options
управляет поведением потока.
algorithm
зависит от доступных алгоритмов, поддерживаемых версией OpenSSL на платформе. Примеры: 'sha256'
, 'sha512'
и т. д. В последних версиях OpenSSL openssl list -digest-algorithms
отобразит доступные алгоритмы дайджеста.
key
— это ключ HMAC, используемый для генерации криптографического хеша HMAC. Если это KeyObject
, его тип должен быть secret
. Если это строка, пожалуйста, примите во внимание предостережения при использовании строк в качестве входных данных для криптографических API. Если он был получен из криптографически безопасного источника энтропии, такого как crypto.randomBytes()
или crypto.generateKey()
, его длина не должна превышать размер блока algorithm
(например, 512 бит для SHA-256).
Пример: генерация sha256 HMAC файла
import {
createReadStream,
} from 'node:fs';
import { argv } from 'node:process';
const {
createHmac,
} = await import('node:crypto');
const filename = argv[2];
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hmac.update(data);
else {
console.log(`${hmac.digest('hex')} ${filename}`);
}
});
const {
createReadStream,
} = require('node:fs');
const {
createHmac,
} = require('node:crypto');
const { argv } = require('node:process');
const filename = argv[2];
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hmac.update(data);
else {
console.log(`${hmac.digest('hex')} ${filename}`);
}
});
crypto.createPrivateKey(key)
[История]
Версия | Изменения |
---|---|
v15.12.0 | Ключ также может быть объектом JWK. |
v15.0.0 | Ключ также может быть ArrayBuffer. Добавлен параметр кодировки. Ключ не может содержать более 2 ** 32 - 1 байт. |
v11.6.0 | Добавлено в: v11.6.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Object> Материал ключа, в формате PEM, DER или JWK.format
: <string> Должно быть'pem'
,'der'
или'jwk'
. По умолчанию:'pem'
.type
: <string> Должно быть'pkcs1'
,'pkcs8'
или'sec1'
. Этот параметр требуется только в том случае, еслиformat
имеет значение'der'
, и игнорируется в противном случае.passphrase
: <string> | <Buffer> Пароль, используемый для расшифровки.encoding
: <string> Строковая кодировка, используемая, когдаkey
является строкой.
Возвращает: <KeyObject>
Создает и возвращает новый ключевой объект, содержащий закрытый ключ. Если key
является строкой или Buffer
, предполагается, что format
имеет значение 'pem'
; в противном случае key
должен быть объектом со свойствами, описанными выше.
Если закрытый ключ зашифрован, необходимо указать passphrase
. Длина парольной фразы ограничена 1024 байтами.
crypto.createPublicKey(key)
[История]
Версия | Изменения |
---|---|
v15.12.0 | Ключ также может быть объектом JWK. |
v15.0.0 | Ключ также может быть ArrayBuffer. Добавлен параметр encoding. Ключ не может содержать более 2 ** 32 - 1 байт. |
v11.13.0 | Аргумент key теперь может быть KeyObject с типом private . |
v11.7.0 | Аргумент key теперь может быть закрытым ключом. |
v11.6.0 | Добавлено в версии: v11.6.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Object> Материал ключа в формате PEM, DER или JWK.format
: <string> Должен быть'pem'
,'der'
или'jwk'
. По умолчанию:'pem'
.type
: <string> Должен быть'pkcs1'
или'spki'
. Этот параметр обязателен, только еслиformat
имеет значение'der'
, в противном случае игнорируется.encoding
<string> Кодировка строки, используемая, когдаkey
является строкой.
Возвращает: <KeyObject>
Создает и возвращает новый объект ключа, содержащий открытый ключ. Если key
является строкой или Buffer
, предполагается, что format
имеет значение 'pem'
; если key
является KeyObject
с типом 'private'
, открытый ключ извлекается из заданного закрытого ключа; в противном случае key
должен быть объектом со свойствами, описанными выше.
Если формат 'pem'
, 'key'
также может быть сертификатом X.509.
Поскольку открытые ключи могут быть получены из закрытых ключей, вместо открытого ключа может быть передан закрытый ключ. В этом случае эта функция ведет себя так, как если бы был вызван crypto.createPrivateKey()
, за исключением того, что тип возвращаемого KeyObject
будет 'public'
и что закрытый ключ не может быть извлечен из возвращаемого KeyObject
. Аналогично, если задан KeyObject
с типом 'private'
, будет возвращен новый KeyObject
с типом 'public'
, и будет невозможно извлечь закрытый ключ из возвращенного объекта.
crypto.createSecretKey(key[, encoding])
[История изменений]
Версия | Изменения |
---|---|
v18.8.0, v16.18.0 | Ключ теперь может быть нулевой длины. |
v15.0.0 | Ключ также может быть ArrayBuffer или строкой. Добавлен аргумент encoding. Ключ не может содержать более 2 ** 32 - 1 байт. |
v11.6.0 | Добавлено в версии: v11.6.0 |
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> Кодировка строки, когдаkey
является строкой.- Возвращает: <KeyObject>
Создаёт и возвращает новый объект ключа, содержащий секретный ключ для симметричного шифрования или Hmac
.
crypto.createSign(algorithm[, options])
Добавлено в версии: v0.1.92
algorithm
<string>options
<Object>stream.Writable
options- Возвращает: <Sign>
Создаёт и возвращает объект Sign
, использующий указанный algorithm
. Используйте crypto.getHashes()
для получения имён доступных алгоритмов дайджеста. Необязательный аргумент options
управляет поведением stream.Writable
.
В некоторых случаях экземпляр Sign
может быть создан с использованием имени алгоритма подписи, такого как 'RSA-SHA256'
, вместо алгоритма дайджеста. Это будет использовать соответствующий алгоритм дайджеста. Это не работает для всех алгоритмов подписи, таких как 'ecdsa-with-SHA256'
, поэтому лучше всегда использовать имена алгоритмов дайджеста.
crypto.createVerify(algorithm[, options])
Добавлено в: v0.1.92
algorithm
<string>options
<Object>stream.Writable
options- Возвращает: <Verify>
Создает и возвращает объект Verify
, использующий заданный алгоритм. Используйте crypto.getHashes()
, чтобы получить массив названий доступных алгоритмов подписи. Необязательный аргумент options
управляет поведением stream.Writable
.
В некоторых случаях экземпляр Verify
можно создать, используя имя алгоритма подписи, например 'RSA-SHA256'
, вместо алгоритма дайджеста. В этом случае будет использоваться соответствующий алгоритм дайджеста. Это не работает для всех алгоритмов подписи, например 'ecdsa-with-SHA256'
, поэтому лучше всегда использовать имена алгоритмов дайджеста.
crypto.diffieHellman(options)
Добавлено в: v13.9.0, v12.17.0
options
: <Object>privateKey
: <KeyObject>publicKey
: <KeyObject>
Возвращает: <Buffer>
Вычисляет секрет Диффи-Хеллмана на основе privateKey
и publicKey
. Оба ключа должны иметь один и тот же asymmetricKeyType
, который должен быть одним из 'dh'
(для Диффи-Хеллмана), 'ec'
, 'x448'
или 'x25519'
(для ECDH).
crypto.fips
Добавлено в: v6.0.0
Устарело с: v10.0.0
[Stable: 0 - Deprecated]
Stable: 0 Стабильность: 0 - Устарело
Свойство для проверки и контроля того, используется ли в данный момент криптопровайдер, совместимый с FIPS. Установка значения true требует FIPS-сборки Node.js.
Это свойство устарело. Вместо него используйте crypto.setFips()
и crypto.getFips()
.
crypto.generateKey(type, options, callback)
[История изменений]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v15.0.0 | Добавлено в: v15.0.0 |
type
: <string> Предполагаемое использование сгенерированного секретного ключа. В настоящее время принимаются значения'hmac'
и'aes'
.options
: <Object>length
: <number> Битовая длина генерируемого ключа. Это должно быть значение больше 0.- Если
type
равно'hmac'
, минимальная длина равна 8, а максимальная длина равна 2-1. Если значение не кратно 8, сгенерированный ключ будет усечен доMath.floor(length / 8)
. - Если
type
равно'aes'
, длина должна быть одной из128
,192
или256
.
callback
: <Function>err
: <Error>key
: <KeyObject>
Асинхронно генерирует новый случайный секретный ключ заданной length
. type
определит, какие проверки будут выполнены над length
.
const {
generateKey,
} = await import('node:crypto');
generateKey('hmac', { length: 512 }, (err, key) => {
if (err) throw err;
console.log(key.export().toString('hex')); // 46e..........620
});
const {
generateKey,
} = require('node:crypto');
generateKey('hmac', { length: 512 }, (err, key) => {
if (err) throw err;
console.log(key.export().toString('hex')); // 46e..........620
});
Размер сгенерированного ключа HMAC не должен превышать размер блока базовой хеш-функции. См. crypto.createHmac()
для получения дополнительной информации.
crypto.generateKeyPair(type, options, callback)
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова аргументу callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v16.10.0 | Добавлена возможность определять параметры последовательности RSASSA-PSS-params для пар ключей RSA-PSS. |
v13.9.0, v12.17.0 | Добавлена поддержка Diffie-Hellman. |
v12.0.0 | Добавлена поддержка пар ключей RSA-PSS. |
v12.0.0 | Добавлена возможность генерации пар ключей X25519 и X448. |
v12.0.0 | Добавлена возможность генерации пар ключей Ed25519 и Ed448. |
v11.6.0 | Функции generateKeyPair и generateKeyPairSync теперь создают объекты ключей, если кодировка не указана. |
v10.12.0 | Добавлено в версии: v10.12.0 |
type
: <string> Должно быть'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
или'dh'
.options
: <Object>modulusLength
: <number> Размер ключа в битах (RSA, DSA).publicExponent
: <number> Открытая экспонента (RSA). По умолчанию:0x10001
.hashAlgorithm
: <string> Имя дайджеста сообщения (RSA-PSS).mgf1HashAlgorithm
: <string> Имя дайджеста сообщения, используемого MGF1 (RSA-PSS).saltLength
: <number> Минимальная длина соли в байтах (RSA-PSS).divisorLength
: <number> Размерq
в битах (DSA).namedCurve
: <string> Имя используемой кривой (EC).prime
: <Buffer> Параметр простого числа (DH).primeLength
: <number> Длина простого числа в битах (DH).generator
: <number> Пользовательский генератор (DH). По умолчанию:2
.groupName
: <string> Имя группы Diffie-Hellman (DH). См.crypto.getDiffieHellman()
.paramEncoding
: <string> Должно быть'named'
или'explicit'
(EC). По умолчанию:'named'
.publicKeyEncoding
: <Object> См.keyObject.export()
.privateKeyEncoding
: <Object> См.keyObject.export()
.
callback
: <Function>err
: <Error>publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
Генерирует новую пару асимметричных ключей указанного type
. В настоящее время поддерживаются RSA, RSA-PSS, DSA, EC, Ed25519, Ed448, X25519, X448 и DH.
Если указан publicKeyEncoding
или privateKeyEncoding
, эта функция ведет себя так, как если бы для ее результата был вызван keyObject.export()
. В противном случае соответствующая часть ключа возвращается как KeyObject
.
Рекомендуется кодировать открытые ключи как 'spki'
, а закрытые ключи как 'pkcs8'
с шифрованием для долгосрочного хранения:
const {
generateKeyPair,
} = await import('node:crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
}, (err, publicKey, privateKey) => {
// Handle errors and use the generated key pair.
});
const {
generateKeyPair,
} = require('node:crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
}, (err, publicKey, privateKey) => {
// Handle errors and use the generated key pair.
});
По завершении будет вызван callback
, при этом err
будет установлен в undefined
, а publicKey
/ privateKey
будут представлять сгенерированную пару ключей.
Если этот метод вызывается как его util.promisify()
версия, он возвращает Promise
для Object
со свойствами publicKey
и privateKey
.
crypto.generateKeyPairSync(type, options)
[История]
Версия | Изменения |
---|---|
v16.10.0 | Добавлена возможность определять параметры последовательности RSASSA-PSS-params для пар ключей RSA-PSS. |
v13.9.0, v12.17.0 | Добавлена поддержка Diffie-Hellman. |
v12.0.0 | Добавлена поддержка пар ключей RSA-PSS. |
v12.0.0 | Добавлена возможность генерации пар ключей X25519 и X448. |
v12.0.0 | Добавлена возможность генерации пар ключей Ed25519 и Ed448. |
v11.6.0 | Функции generateKeyPair и generateKeyPairSync теперь создают объекты ключей, если кодировка не указана. |
v10.12.0 | Добавлено в: v10.12.0 |
type
: <string> Должно быть'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
или'dh'
.options
: <Object>modulusLength
: <number> Размер ключа в битах (RSA, DSA).publicExponent
: <number> Открытый показатель (RSA). По умолчанию:0x10001
.hashAlgorithm
: <string> Название дайджеста сообщения (RSA-PSS).mgf1HashAlgorithm
: <string> Название дайджеста сообщения, используемого MGF1 (RSA-PSS).saltLength
: <number> Минимальная длина соли в байтах (RSA-PSS).divisorLength
: <number> Размерq
в битах (DSA).namedCurve
: <string> Название кривой для использования (EC).prime
: <Buffer> Параметр простого числа (DH).primeLength
: <number> Длина простого числа в битах (DH).generator
: <number> Пользовательский генератор (DH). По умолчанию:2
.groupName
: <string> Имя группы Diffie-Hellman (DH). Смотритеcrypto.getDiffieHellman()
.paramEncoding
: <string> Должно быть'named'
или'explicit'
(EC). По умолчанию:'named'
.publicKeyEncoding
: <Object> СмотритеkeyObject.export()
.privateKeyEncoding
: <Object> СмотритеkeyObject.export()
.
Возвращает: <Object>
publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
Генерирует новую асимметричную пару ключей указанного type
. В настоящее время поддерживаются RSA, RSA-PSS, DSA, EC, Ed25519, Ed448, X25519, X448 и DH.
Если указаны publicKeyEncoding
или privateKeyEncoding
, эта функция ведет себя так, как если бы для ее результата был вызван keyObject.export()
. В противном случае соответствующая часть ключа возвращается как KeyObject
.
При кодировании открытых ключей рекомендуется использовать 'spki'
. При кодировании закрытых ключей рекомендуется использовать 'pkcs8'
с надежным паролем и сохранять пароль конфиденциальным.
const {
generateKeyPairSync,
} = await import('node:crypto');
const {
publicKey,
privateKey,
} = generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
});
const {
generateKeyPairSync,
} = require('node:crypto');
const {
publicKey,
privateKey,
} = generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
});
Возвращаемое значение { publicKey, privateKey }
представляет сгенерированную пару ключей. Если выбрана кодировка PEM, соответствующий ключ будет строкой, в противном случае - буфером, содержащим данные, закодированные как DER.
crypto.generateKeySync(type, options)
Added in: v15.0.0
type
: <string> Предполагаемое использование сгенерированного секретного ключа. В настоящее время принимаются значения'hmac'
и'aes'
.options
: <Object>length
: <number> Длина генерируемого ключа в битах.- Если
type
имеет значение'hmac'
, минимальное значение равно 8, а максимальная длина равна 2-1. Если значение не кратно 8, сгенерированный ключ будет усечен доMath.floor(length / 8)
. - Если
type
имеет значение'aes'
, длина должна быть одной из128
,192
или256
.
Returns: <KeyObject>
Синхронно генерирует новый случайный секретный ключ заданной length
. type
будет определять, какие проверки будут выполнены для length
.
const {
generateKeySync,
} = await import('node:crypto');
const key = generateKeySync('hmac', { length: 512 });
console.log(key.export().toString('hex')); // e89..........41e
const {
generateKeySync,
} = require('node:crypto');
const key = generateKeySync('hmac', { length: 512 });
console.log(key.export().toString('hex')); // e89..........41e
Размер сгенерированного ключа HMAC не должен превышать размер блока базовой хеш-функции. Дополнительную информацию см. в crypto.createHmac()
.
crypto.generatePrime(size[, options[, callback]])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v15.8.0 | Добавлено в: v15.8.0 |
size
<number> Размер (в битах) генерируемого простого числа.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> По умолчанию:false
.bigint
<boolean> Еслиtrue
, сгенерированное простое число возвращается какbigint
.
callback
<Function>err
<Error>prime
<ArrayBuffer> | <bigint>
Генерирует псевдослучайное простое число из size
битов.
Если options.safe
имеет значение true
, простое число будет безопасным простым числом, то есть (prime - 1) / 2
также будет простым числом.
Параметры options.add
и options.rem
можно использовать для принудительного применения дополнительных требований, например, для Диффи-Хеллмана:
- Если установлены
options.add
иoptions.rem
, простое число будет удовлетворять условиюprime % add = rem
. - Если установлен только
options.add
иoptions.safe
не имеет значениеtrue
, простое число будет удовлетворять условиюprime % add = 1
. - Если установлен только
options.add
, аoptions.safe
имеет значениеtrue
, простое число вместо этого будет удовлетворять условиюprime % add = 3
. Это необходимо, потому чтоprime % add = 1
дляoptions.add \> 2
будет противоречить условию, обеспечиваемомуoptions.safe
. options.rem
игнорируется, еслиoptions.add
не задан.
И options.add
, и options.rem
должны быть закодированы как последовательности с прямым порядком байтов, если они представлены как ArrayBuffer
, SharedArrayBuffer
, TypedArray
, Buffer
или DataView
.
По умолчанию простое число кодируется как последовательность октетов с прямым порядком байтов в <ArrayBuffer>. Если опция bigint
имеет значение true
, то предоставляется <bigint>.
crypto.generatePrimeSync(size[, options])
Добавлено в: v15.8.0
size
<number> Размер (в битах) генерируемого простого числа.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> По умолчанию:false
.bigint
<boolean> Еслиtrue
, то сгенерированное простое число возвращается какbigint
.
Возвращает: <ArrayBuffer> | <bigint>
Генерирует псевдослучайное простое число размером size
бит.
Если options.safe
равно true
, простое число будет безопасным простым числом — то есть (prime - 1) / 2
также будет простым числом.
Параметры options.add
и options.rem
можно использовать для обеспечения дополнительных требований, например, для Diffie-Hellman:
- Если установлены
options.add
иoptions.rem
, то простое число будет удовлетворять условиюprime % add = rem
. - Если установлен только
options.add
иoptions.safe
не равноtrue
, то простое число будет удовлетворять условиюprime % add = 1
. - Если установлен только
options.add
иoptions.safe
равноtrue
, то простое число вместо этого будет удовлетворять условиюprime % add = 3
. Это необходимо, потому чтоprime % add = 1
дляoptions.add \> 2
будет противоречить условию, обеспечиваемомуoptions.safe
. options.rem
игнорируется, если не указанoptions.add
.
Оба параметра options.add
и options.rem
должны быть закодированы как последовательности с прямым порядком байтов, если они указаны как ArrayBuffer
, SharedArrayBuffer
, TypedArray
, Buffer
или DataView
.
По умолчанию простое число кодируется как последовательность октетов с прямым порядком байтов в <ArrayBuffer>. Если параметр bigint
равен true
, то предоставляется <bigint>.
crypto.getCipherInfo(nameOrNid[, options])
Добавлено в: v15.0.0
nameOrNid
: <string> | <number> Имя или NID шифра для запроса.options
: <Object>Возвращает: <Object>
name
<string> Имя шифраnid
<number> NID шифраblockSize
<number> Размер блока шифра в байтах. Это свойство отсутствует, еслиmode
имеет значение'stream'
.ivLength
<number> Ожидаемая или стандартная длина вектора инициализации в байтах. Это свойство отсутствует, если шифр не использует вектор инициализации.keyLength
<number> Ожидаемая или стандартная длина ключа в байтах.mode
<string> Режим шифра. Одно из значений:'cbc'
,'ccm'
,'cfb'
,'ctr'
,'ecb'
,'gcm'
,'ocb'
,'ofb'
,'stream'
,'wrap'
,'xts'
.
Возвращает информацию о заданном шифре.
Некоторые шифры принимают ключи и векторы инициализации переменной длины. По умолчанию метод crypto.getCipherInfo()
будет возвращать значения по умолчанию для этих шифров. Чтобы проверить, допустима ли заданная длина ключа или длина вектора инициализации для данного шифра, используйте параметры keyLength
и ivLength
. Если заданные значения неприемлемы, будет возвращено undefined
.
crypto.getCiphers()
Добавлено в: v0.9.3
- Возвращает: <string[]> Массив с именами поддерживаемых алгоритмов шифрования.
const {
getCiphers,
} = await import('node:crypto');
console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...]
const {
getCiphers,
} = require('node:crypto');
console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...]
crypto.getCurves()
Добавлено в: v2.3.0
- Возвращает: <string[]> Массив с именами поддерживаемых эллиптических кривых.
const {
getCurves,
} = await import('node:crypto');
console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]
const {
getCurves,
} = require('node:crypto');
console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]
crypto.getDiffieHellman(groupName)
Добавлено в: v0.7.5
groupName
<string>- Возвращает: <DiffieHellmanGroup>
Создает предопределенный объект обмена ключами DiffieHellmanGroup
. Поддерживаемые группы перечислены в документации для DiffieHellmanGroup
.
Возвращаемый объект имитирует интерфейс объектов, созданных с помощью crypto.createDiffieHellman()
, но не позволит изменять ключи (например, с помощью diffieHellman.setPublicKey()
). Преимущество использования этого метода заключается в том, что сторонам не нужно заранее генерировать или обмениваться групповым модулем, что экономит время процессора и время связи.
Пример (получение общего секрета):
const {
getDiffieHellman,
} = await import('node:crypto');
const alice = getDiffieHellman('modp14');
const bob = getDiffieHellman('modp14');
alice.generateKeys();
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
/* aliceSecret and bobSecret should be the same */
console.log(aliceSecret === bobSecret);
const {
getDiffieHellman,
} = require('node:crypto');
const alice = getDiffieHellman('modp14');
const bob = getDiffieHellman('modp14');
alice.generateKeys();
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
/* aliceSecret и bobSecret должны быть одинаковыми */
console.log(aliceSecret === bobSecret);
crypto.getFips()
Added in: v10.0.0
- Возвращает: <number>
1
тогда и только тогда, когда в данный момент используется криптопровайдер, совместимый с FIPS, в противном случае0
. В будущем основном выпуске semver тип возвращаемого значения этого API может быть изменен на <boolean>.
crypto.getHashes()
Added in: v0.9.3
- Возвращает: <string[]> Массив названий поддерживаемых алгоритмов хеширования, таких как
'RSA-SHA256'
. Алгоритмы хеширования также называются "алгоритмами дайджеста".
const {
getHashes,
} = await import('node:crypto');
console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]
const {
getHashes,
} = require('node:crypto');
console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]
crypto.getRandomValues(typedArray)
Added in: v17.4.0
typedArray
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer>- Возвращает: <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> Возвращает
typedArray
.
Удобный псевдоним для crypto.webcrypto.getRandomValues()
. Эта реализация не соответствует спецификации Web Crypto. Для написания веб-совместимого кода используйте crypto.webcrypto.getRandomValues()
вместо нее.
crypto.hash(algorithm, data[, outputEncoding])
Добавлено в: v21.7.0, v20.12.0
[Stable: 1 - Experimental]
Stable: 1 Стабильность: 1.2 - Кандидат на выпуск
algorithm
<string> | <undefined>data
<string> | <Buffer> | <TypedArray> | <DataView> Еслиdata
является строкой, она будет закодирована как UTF-8 перед хешированием. Если для строкового ввода требуется другая кодировка, пользователь может закодировать строку вTypedArray
, используяTextEncoder
илиBuffer.from()
и передав закодированныйTypedArray
в этот API.outputEncoding
<string> | <undefined> Кодировка, используемая для кодирования возвращаемого дайджеста. По умолчанию:'hex'
.- Возвращает: <string> | <Buffer>
Утилита для создания однократных хеш-дайджестов данных. Она может быть быстрее, чем crypto.createHash()
на основе объектов, при хешировании меньшего количества данных (<= 5 МБ), которые легко доступны. Если данные могут быть большими или если они передаются потоком, рекомендуется использовать crypto.createHash()
вместо этого.
algorithm
зависит от доступных алгоритмов, поддерживаемых версией OpenSSL на платформе. Примеры: 'sha256'
, 'sha512'
и т.д. В последних выпусках OpenSSL команда openssl list -digest-algorithms
отобразит доступные алгоритмы дайджеста.
Пример:
const crypto = require('node:crypto');
const { Buffer } = require('node:buffer');
// Хеширование строки и возврат результата в виде строки, закодированной в hex.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));
// Кодирование строки в кодировке base64 в Buffer, ее хеширование и возврат
// результата в виде буфера.
const base64 = 'Tm9kZS5qcw==';
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'));
import crypto from 'node:crypto';
import { Buffer } from 'node:buffer';
// Хеширование строки и возврат результата в виде строки, закодированной в hex.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));
// Кодирование строки в кодировке base64 в Buffer, ее хеширование и возврат
// результата в виде буфера.
const base64 = 'Tm9kZS5qcw==';
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'));
crypto.hkdf(digest, ikm, salt, info, keylen, callback)
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова аргументу callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v18.8.0, v16.18.0 | Входной ключевой материал теперь может иметь нулевую длину. |
v15.0.0 | Добавлено в: v15.0.0 |
digest
<string> Алгоритм хеширования для использования.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> Входной ключевой материал. Должен быть предоставлен, но может иметь нулевую длину.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Значение соли. Должно быть предоставлено, но может иметь нулевую длину.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Дополнительное значение информации. Должно быть предоставлено, но может иметь нулевую длину и не может превышать 1024 байта.keylen
<number> Длина ключа для генерации. Должна быть больше 0. Максимально допустимое значение -255
, умноженное на количество байтов, производимых выбранной функцией дайджеста (например,sha512
генерирует 64-байтовые хеши, что делает максимальный выход HKDF равным 16320 байтам).callback
<Function>err
<Error>derivedKey
<ArrayBuffer>
HKDF - это простая функция деривации ключей, определенная в RFC 5869. Заданные ikm
, salt
и info
используются с digest
для получения ключа длиной keylen
байт.
Предоставленная функция callback
вызывается с двумя аргументами: err
и derivedKey
. Если во время получения ключа происходит ошибка, err
будет установлен; в противном случае err
будет null
. Успешно сгенерированный derivedKey
будет передан в обратный вызов как <ArrayBuffer>. Ошибка будет выдана, если какие-либо входные аргументы указывают недопустимые значения или типы.
import { Buffer } from 'node:buffer';
const {
hkdf,
} = await import('node:crypto');
hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => {
if (err) throw err;
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
});
const {
hkdf,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => {
if (err) throw err;
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
});
crypto.hkdfSync(digest, ikm, salt, info, keylen)
[История]
Версия | Изменения |
---|---|
v18.8.0, v16.18.0 | Входной ключевой материал теперь может иметь нулевую длину. |
v15.0.0 | Добавлено в версии: v15.0.0 |
digest
<string> Используемый алгоритм дайджеста.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> Входной ключевой материал. Должен быть предоставлен, но может иметь нулевую длину.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Значение соли. Должно быть предоставлено, но может иметь нулевую длину.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Дополнительное информационное значение. Должно быть предоставлено, но может иметь нулевую длину и не может превышать 1024 байта.keylen
<number> Длина ключа для генерации. Должна быть больше 0. Максимально допустимое значение -255
умноженное на количество байтов, производимых выбранной функцией дайджеста (например,sha512
генерирует 64-байтовые хэши, что делает максимальный вывод HKDF 16320 байт).- Возвращает: <ArrayBuffer>
Предоставляет синхронную функцию деривации ключа HKDF, как определено в RFC 5869. Заданные ikm
, salt
и info
используются с digest
для получения ключа длиной keylen
байт.
Успешно сгенерированный derivedKey
будет возвращен как <ArrayBuffer>.
Будет выброшена ошибка, если какой-либо из входных аргументов указывает недопустимые значения или типы, или если производный ключ не может быть сгенерирован.
import { Buffer } from 'node:buffer';
const {
hkdfSync,
} = await import('node:crypto');
const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64);
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
const {
hkdfSync,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64);
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент callback теперь вызывает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v15.0.0 | Аргументы password и salt также могут быть экземплярами ArrayBuffer. |
v14.0.0 | Параметр iterations теперь ограничен положительными значениями. Более ранние выпуски обрабатывали другие значения как единицу. |
v8.0.0 | Параметр digest теперь всегда обязателен. |
v6.0.0 | Вызов этой функции без передачи параметра digest теперь устарел и будет выдавать предупреждение. |
v6.0.0 | Кодировка по умолчанию для password , если это строка, изменилась с binary на utf8 . |
v0.5.5 | Добавлено в версии: v0.5.5 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>callback
<Function>
Предоставляет асинхронную реализацию функции формирования ключа на основе пароля 2 (PBKDF2). Выбранный алгоритм дайджеста HMAC, указанный в digest
, применяется для получения ключа запрошенной длины в байтах (keylen
) из password
, salt
и iterations
.
Предоставленная функция callback
вызывается с двумя аргументами: err
и derivedKey
. Если во время формирования ключа возникает ошибка, err
будет установлен; в противном случае err
будет null
. По умолчанию успешно сгенерированный derivedKey
будет передан в обратный вызов в виде Buffer
. Ошибка будет выдана, если какие-либо входные аргументы укажут недействительные значения или типы.
Аргумент iterations
должен быть числом, установленным как можно выше. Чем больше количество итераций, тем безопаснее будет производный ключ, но потребуется больше времени для завершения.
salt
должен быть максимально уникальным. Рекомендуется, чтобы соль была случайной и имела длину не менее 16 байт. Подробности см. в NIST SP 800-132.
При передаче строк для password
или salt
учитывайте предостережения при использовании строк в качестве входных данных для криптографических API.
const {
pbkdf2,
} = await import('node:crypto');
pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
const {
pbkdf2,
} = require('node:crypto');
pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
Список поддерживаемых функций дайджеста можно получить с помощью crypto.getHashes()
.
Этот API использует пул потоков libuv, что может иметь неожиданные и негативные последствия для производительности некоторых приложений; см. документацию UV_THREADPOOL_SIZE
для получения дополнительной информации.
crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)
[История]
Версия | Изменения |
---|---|
v14.0.0 | Параметр iterations теперь ограничен положительными значениями. Более ранние версии обрабатывали другие значения как единицу. |
v6.0.0 | Вызов этой функции без передачи параметра digest теперь считается устаревшим и вызовет предупреждение. |
v6.0.0 | Кодировка по умолчанию для password , если это строка, изменилась с binary на utf8 . |
v0.9.3 | Добавлено в: v0.9.3 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>- Возвращает: <Buffer>
Предоставляет синхронную реализацию функции формирования ключа на основе пароля 2 (PBKDF2). Выбранный алгоритм дайджеста HMAC, указанный в digest
, применяется для получения ключа запрошенной длины в байтах (keylen
) из password
, salt
и iterations
.
Если происходит ошибка, будет выброшена Error
, в противном случае производный ключ будет возвращен как Buffer
.
Аргумент iterations
должен быть числом, установленным как можно выше. Чем больше количество итераций, тем безопаснее будет производный ключ, но тем больше времени потребуется для завершения.
salt
должен быть максимально уникальным. Рекомендуется, чтобы соль была случайной и имела длину не менее 16 байт. Подробности см. в NIST SP 800-132.
При передаче строк для password
или salt
, пожалуйста, примите во внимание предостережения при использовании строк в качестве входных данных для криптографических API.
const {
pbkdf2Sync,
} = await import('node:crypto');
const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
console.log(key.toString('hex')); // '3745e48...08d59ae'
const {
pbkdf2Sync,
} = require('node:crypto');
const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
console.log(key.toString('hex')); // '3745e48...08d59ae'
Массив поддерживаемых функций дайджеста можно получить с помощью crypto.getHashes()
.
crypto.privateDecrypt(privateKey, buffer)
[История]
Версия | Изменения |
---|---|
v21.6.2, v20.11.1, v18.19.1 | Отступ RSA_PKCS1_PADDING был отключен, если сборка OpenSSL не поддерживает неявный отказ. |
v15.0.0 | Добавлены string, ArrayBuffer и CryptoKey в качестве допустимых типов ключей. oaepLabel может быть ArrayBuffer. Буфер может быть строкой или ArrayBuffer. Все типы, принимающие буферы, ограничены максимальным размером 2 ** 31 - 1 байт. |
v12.11.0 | Добавлена опция oaepLabel . |
v12.9.0 | Добавлена опция oaepHash . |
v11.6.0 | Эта функция теперь поддерживает объекты ключей. |
v0.11.14 | Добавлено в версии: v0.11.14 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>oaepHash
<string> Хеш-функция для использования для заполнения OAEP и MGF1. По умолчанию:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Метка для использования для заполнения OAEP. Если не указано, метка не используется.padding
<crypto.constants> Необязательное значение отступа, определенное вcrypto.constants
, которое может быть:crypto.constants.RSA_NO_PADDING
,crypto.constants.RSA_PKCS1_PADDING
илиcrypto.constants.RSA_PKCS1_OAEP_PADDING
.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Возвращает: <Buffer> Новый
Buffer
с расшифрованным содержимым.
Расшифровывает buffer
с помощью privateKey
. buffer
был ранее зашифрован с использованием соответствующего открытого ключа, например, с использованием crypto.publicEncrypt()
.
Если privateKey
не является KeyObject
, эта функция ведет себя так, как если бы privateKey
был передан в crypto.createPrivateKey()
. Если это объект, можно передать свойство padding
. В противном случае эта функция использует RSA_PKCS1_OAEP_PADDING
.
Использование crypto.constants.RSA_PKCS1_PADDING
в crypto.privateDecrypt()
требует, чтобы OpenSSL поддерживал неявный отказ (rsa_pkcs1_implicit_rejection
). Если версия OpenSSL, используемая Node.js, не поддерживает эту функцию, попытка использовать RSA_PKCS1_PADDING
завершится неудачей.
crypto.privateEncrypt(privateKey, buffer)
[История]
Версия | Изменения |
---|---|
v15.0.0 | Добавлены string, ArrayBuffer и CryptoKey в качестве допустимых типов ключей. Парольная фраза может быть ArrayBuffer. Буфер может быть string или ArrayBuffer. Все типы, принимающие буферы, ограничены максимум 2 ** 31 - 1 байтами. |
v11.6.0 | Эта функция теперь поддерживает объекты ключей. |
v1.1.0 | Добавлено в: v1.1.0 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> Приватный ключ в формате PEM.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Необязательная парольная фраза для приватного ключа.padding
<crypto.constants> Необязательное значение отступа, определенное вcrypto.constants
, которое может быть:crypto.constants.RSA_NO_PADDING
илиcrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> Кодировка строки, используемая, когдаbuffer
,key
илиpassphrase
являются строками.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Возвращает: <Buffer> Новый
Buffer
с зашифрованным содержимым.
Шифрует buffer
с помощью privateKey
. Возвращенные данные могут быть расшифрованы с использованием соответствующего открытого ключа, например, с помощью crypto.publicDecrypt()
.
Если privateKey
не является KeyObject
, эта функция ведет себя так, как если бы privateKey
был передан в crypto.createPrivateKey()
. Если это объект, можно передать свойство padding
. В противном случае эта функция использует RSA_PKCS1_PADDING
.
crypto.publicDecrypt(key, buffer)
[История]
Версия | Изменения |
---|---|
v15.0.0 | Добавлены string, ArrayBuffer и CryptoKey в качестве допустимых типов ключей. Парольная фраза может быть ArrayBuffer. Буфер может быть строкой или ArrayBuffer. Все типы, принимающие буферы, ограничены максимумом в 2 ** 31 - 1 байт. |
v11.6.0 | Эта функция теперь поддерживает объекты ключей. |
v1.1.0 | Добавлено в версии: v1.1.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Необязательная парольная фраза для закрытого ключа.padding
<crypto.constants> Необязательное значение отступа, определенное вcrypto.constants
, которое может быть:crypto.constants.RSA_NO_PADDING
илиcrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> Строковая кодировка, используемая, когдаbuffer
,key
илиpassphrase
являются строками.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Возвращает: <Buffer> Новый
Buffer
с расшифрованным содержимым.
Расшифровывает buffer
с помощью key
. buffer
был ранее зашифрован с использованием соответствующего закрытого ключа, например, с использованием crypto.privateEncrypt()
.
Если key
не является KeyObject
, эта функция ведет себя так, как если бы key
был передан в crypto.createPublicKey()
. Если это объект, можно передать свойство padding
. В противном случае эта функция использует RSA_PKCS1_PADDING
.
Поскольку открытые ключи RSA могут быть получены из закрытых ключей, вместо открытого ключа может быть передан закрытый ключ.
crypto.publicEncrypt(key, buffer)
[История]
Версия | Изменения |
---|---|
v15.0.0 | Добавлены string, ArrayBuffer и CryptoKey в качестве допустимых типов ключей. oaepLabel и passphrase могут быть ArrayBuffer. buffer может быть string или ArrayBuffer. Все типы, принимающие буферы, ограничены максимум 2 ** 31 - 1 байтами. |
v12.11.0 | Добавлена опция oaepLabel . |
v12.9.0 | Добавлена опция oaepHash . |
v11.6.0 | Теперь эта функция поддерживает объекты ключей. |
v0.11.14 | Добавлено в: v0.11.14 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> PEM-кодированный открытый или закрытый ключ, <KeyObject> или <CryptoKey>.oaepHash
<string> Хэш-функция, используемая для OAEP-заполнения и MGF1. По умолчанию:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Метка, используемая для OAEP-заполнения. Если не указано, метка не используется.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Необязательная парольная фраза для закрытого ключа.padding
<crypto.constants> Необязательное значение отступа, определенное вcrypto.constants
, которое может быть:crypto.constants.RSA_NO_PADDING
,crypto.constants.RSA_PKCS1_PADDING
илиcrypto.constants.RSA_PKCS1_OAEP_PADDING
.encoding
<string> Кодировка строки, используемая, когдаbuffer
,key
,oaepLabel
илиpassphrase
являются строками.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Возвращает: <Buffer> Новый
Buffer
с зашифрованным содержимым.
Шифрует содержимое buffer
с помощью key
и возвращает новый Buffer
с зашифрованным содержимым. Возвращенные данные можно расшифровать, используя соответствующий закрытый ключ, например, с помощью crypto.privateDecrypt()
.
Если key
не является KeyObject
, эта функция ведет себя так, как если бы key
был передан в crypto.createPublicKey()
. Если это объект, можно передать свойство padding
. В противном случае эта функция использует RSA_PKCS1_OAEP_PADDING
.
Поскольку открытые ключи RSA можно получить из закрытых ключей, вместо открытого ключа можно передать закрытый ключ.
crypto.randomBytes(size[, callback])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова аргументу callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v9.0.0 | Передача null в качестве аргумента callback теперь вызывает ERR_INVALID_CALLBACK . |
v0.5.8 | Добавлено в версии: v0.5.8 |
size
<number> Количество генерируемых байтов.size
не должен превышать2**31 - 1
.callback
<Function>Возвращает: <Buffer>, если функция
callback
не предоставлена.
Генерирует криптографически сильные псевдослучайные данные. Аргумент size
- это число, указывающее количество байтов для генерации.
Если предоставлена функция callback
, байты генерируются асинхронно, и функция callback
вызывается с двумя аргументами: err
и buf
. В случае ошибки err
будет объектом Error
; в противном случае он будет null
. Аргумент buf
является Buffer
, содержащим сгенерированные байты.
// Асинхронно
const {
randomBytes,
} = await import('node:crypto');
randomBytes(256, (err, buf) => {
if (err) throw err;
console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
});
// Асинхронно
const {
randomBytes,
} = require('node:crypto');
randomBytes(256, (err, buf) => {
if (err) throw err;
console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
});
Если функция callback
не предоставлена, случайные байты генерируются синхронно и возвращаются в виде Buffer
. В случае возникновения проблемы при генерации байтов будет выдана ошибка.
// Синхронно
const {
randomBytes,
} = await import('node:crypto');
const buf = randomBytes(256);
console.log(
`${buf.length} bytes of random data: ${buf.toString('hex')}`);
// Синхронно
const {
randomBytes,
} = require('node:crypto');
const buf = randomBytes(256);
console.log(
`${buf.length} bytes of random data: ${buf.toString('hex')}`);
Метод crypto.randomBytes()
не завершится, пока не будет достаточно доступной энтропии. Обычно это не должно занимать больше нескольких миллисекунд. Единственный случай, когда генерация случайных байтов может заблокироваться на более длительный период времени, - это сразу после загрузки, когда во всей системе все еще мало энтропии.
Этот API использует пул потоков libuv, что может иметь неожиданные и негативные последствия для производительности некоторых приложений; см. документацию UV_THREADPOOL_SIZE
для получения дополнительной информации.
Асинхронная версия crypto.randomBytes()
выполняется в одном запросе пула потоков. Чтобы минимизировать разброс длины задач пула потоков, разделяйте большие запросы randomBytes
, если это делается в рамках выполнения запроса клиента.
crypto.randomFill(buffer[, offset][, size], callback)
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача неверного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v9.0.0 | Аргумент buffer может быть любым TypedArray или DataView . |
v7.10.0, v6.13.0 | Добавлено в: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Обязательно к указанию. Размер предоставленногоbuffer
не должен превышать2**31 - 1
.offset
<number> По умолчанию:0
size
<number> По умолчанию:buffer.length - offset
. Значениеsize
не должно превышать2**31 - 1
.callback
<Function>function(err, buf) {}
.
Эта функция похожа на crypto.randomBytes()
, но требует, чтобы первым аргументом был Buffer
, который будет заполнен. Также требуется, чтобы был передан обратный вызов.
Если функция callback
не предоставлена, будет выброшена ошибка.
import { Buffer } from 'node:buffer';
const { randomFill } = await import('node:crypto');
const buf = Buffer.alloc(10);
randomFill(buf, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
randomFill(buf, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
// Вышеуказанное эквивалентно следующему:
randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
const { randomFill } = require('node:crypto');
const { Buffer } = require('node:buffer');
const buf = Buffer.alloc(10);
randomFill(buf, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
randomFill(buf, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
// Вышеуказанное эквивалентно следующему:
randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
Любой экземпляр ArrayBuffer
, TypedArray
или DataView
может быть передан в качестве buffer
.
Хотя это включает экземпляры Float32Array
и Float64Array
, эту функцию не следует использовать для генерации случайных чисел с плавающей запятой. Результат может содержать +Infinity
, -Infinity
и NaN
, и даже если массив содержит только конечные числа, они не берутся из равномерного случайного распределения и не имеют значимых нижних или верхних границ.
import { Buffer } from 'node:buffer';
const { randomFill } = await import('node:crypto');
const a = new Uint32Array(10);
randomFill(a, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const b = new DataView(new ArrayBuffer(10));
randomFill(b, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const c = new ArrayBuffer(10);
randomFill(c, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf).toString('hex'));
});
const { randomFill } = require('node:crypto');
const { Buffer } = require('node:buffer');
const a = new Uint32Array(10);
randomFill(a, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const b = new DataView(new ArrayBuffer(10));
randomFill(b, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const c = new ArrayBuffer(10);
randomFill(c, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf).toString('hex'));
});
Этот API использует threadpool libuv, что может иметь неожиданные и негативные последствия для производительности некоторых приложений; см. документацию UV_THREADPOOL_SIZE
для получения дополнительной информации.
Асинхронная версия crypto.randomFill()
выполняется в одном запросе threadpool. Чтобы свести к минимуму вариации длины задачи threadpool, разделяйте большие запросы randomFill
, выполняя их как часть выполнения запроса клиента.
crypto.randomFillSync(buffer[, offset][, size])
[История]
Версия | Изменения |
---|---|
v9.0.0 | Аргумент buffer может быть любым TypedArray или DataView . |
v7.10.0, v6.13.0 | Добавлено в: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Обязательный параметр. Размер предоставленногоbuffer
не должен превышать2**31 - 1
.offset
<number> По умолчанию:0
size
<number> По умолчанию:buffer.length - offset
. Значениеsize
не должно превышать2**31 - 1
.- Возвращает: <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Объект, переданный в качестве аргумента
buffer
.
Синхронная версия crypto.randomFill()
.
import { Buffer } from 'node:buffer';
const { randomFillSync } = await import('node:crypto');
const buf = Buffer.alloc(10);
console.log(randomFillSync(buf).toString('hex'));
randomFillSync(buf, 5);
console.log(buf.toString('hex'));
// Вышеуказанное эквивалентно следующему:
randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));
const { randomFillSync } = require('node:crypto');
const { Buffer } = require('node:buffer');
const buf = Buffer.alloc(10);
console.log(randomFillSync(buf).toString('hex'));
randomFillSync(buf, 5);
console.log(buf.toString('hex'));
// Вышеуказанное эквивалентно следующему:
randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));
Любой экземпляр ArrayBuffer
, TypedArray
или DataView
может быть передан в качестве buffer
.
import { Buffer } from 'node:buffer';
const { randomFillSync } = await import('node:crypto');
const a = new Uint32Array(10);
console.log(Buffer.from(randomFillSync(a).buffer,
a.byteOffset, a.byteLength).toString('hex'));
const b = new DataView(new ArrayBuffer(10));
console.log(Buffer.from(randomFillSync(b).buffer,
b.byteOffset, b.byteLength).toString('hex'));
const c = new ArrayBuffer(10);
console.log(Buffer.from(randomFillSync(c)).toString('hex'));
const { randomFillSync } = require('node:crypto');
const { Buffer } = require('node:buffer');
const a = new Uint32Array(10);
console.log(Buffer.from(randomFillSync(a).buffer,
a.byteOffset, a.byteLength).toString('hex'));
const b = new DataView(new ArrayBuffer(10));
console.log(Buffer.from(randomFillSync(b).buffer,
b.byteOffset, b.byteLength).toString('hex'));
const c = new ArrayBuffer(10);
console.log(Buffer.from(randomFillSync(c)).toString('hex'));
crypto.randomInt([min, ]max[, callback])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v14.10.0, v12.19.0 | Добавлено в: v14.10.0, v12.19.0 |
min
<integer> Начало случайного диапазона (включительно). По умолчанию:0
.max
<integer> Конец случайного диапазона (исключительно).callback
<Function>function(err, n) {}
.
Возвращает случайное целое число n
такое, что min \<= n \< max
. Эта реализация избегает смещения по модулю.
Диапазон (max - min
) должен быть меньше 2. min
и max
должны быть безопасными целыми числами.
Если функция callback
не указана, случайное целое число генерируется синхронно.
// Асинхронно
const {
randomInt,
} = await import('node:crypto');
randomInt(3, (err, n) => {
if (err) throw err;
console.log(`Случайное число, выбранное из (0, 1, 2): ${n}`);
});
// Асинхронно
const {
randomInt,
} = require('node:crypto');
randomInt(3, (err, n) => {
if (err) throw err;
console.log(`Случайное число, выбранное из (0, 1, 2): ${n}`);
});
// Синхронно
const {
randomInt,
} = await import('node:crypto');
const n = randomInt(3);
console.log(`Случайное число, выбранное из (0, 1, 2): ${n}`);
// Синхронно
const {
randomInt,
} = require('node:crypto');
const n = randomInt(3);
console.log(`Случайное число, выбранное из (0, 1, 2): ${n}`);
// С аргументом `min`
const {
randomInt,
} = await import('node:crypto');
const n = randomInt(1, 7);
console.log(`На кубике выпало: ${n}`);
// С аргументом `min`
const {
randomInt,
} = require('node:crypto');
const n = randomInt(1, 7);
console.log(`На кубике выпало: ${n}`);
crypto.randomUUID([options])
Добавлено в: v15.6.0, v14.17.0
options
<Object>disableEntropyCache
<boolean> По умолчанию, для повышения производительности, Node.js генерирует и кэширует достаточно случайных данных для генерации до 128 случайных UUID. Чтобы сгенерировать UUID без использования кэша, установите дляdisableEntropyCache
значениеtrue
. По умолчанию:false
.
Возвращает: <string>
Генерирует случайный UUID версии 4 RFC 4122. UUID генерируется с использованием криптографического генератора псевдослучайных чисел.
crypto.scrypt(password, salt, keylen[, options], callback)
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова аргументу callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v15.0.0 | Аргументы пароля и соли также могут быть экземплярами ArrayBuffer. |
v12.8.0, v10.17.0 | Значение maxmem теперь может быть любым безопасным целым числом. |
v10.9.0 | Добавлены имена опций cost , blockSize и parallelization . |
v10.5.0 | Добавлено в: v10.5.0 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Object>cost
<number> Параметр стоимости ЦП/памяти. Должен быть степенью двойки больше единицы. По умолчанию:16384
.blockSize
<number> Параметр размера блока. По умолчанию:8
.parallelization
<number> Параметр параллелизации. По умолчанию:1
.N
<number> Псевдоним дляcost
. Можно указать только один из них.r
<number> Псевдоним дляblockSize
. Можно указать только один из них.p
<number> Псевдоним дляparallelization
. Можно указать только один из них.maxmem
<number> Верхняя граница памяти. Ошибка возникает, когда (приблизительно)128 * N * r \> maxmem
. По умолчанию:32 * 1024 * 1024
.
callback
<Function>
Предоставляет асинхронную реализацию scrypt. Scrypt — это функция генерации ключей на основе пароля, разработанная так, чтобы быть дорогостоящей с вычислительной точки зрения и с точки зрения памяти, чтобы сделать атаки методом перебора невыгодными.
salt
должен быть максимально уникальным. Рекомендуется, чтобы соль была случайной и имела длину не менее 16 байт. Подробности см. в NIST SP 800-132.
При передаче строк для password
или salt
учтите предостережения при использовании строк в качестве входных данных для криптографических API.
Функция callback
вызывается с двумя аргументами: err
и derivedKey
. err
— это объект исключения, когда генерация ключа не удается, в противном случае err
имеет значение null
. derivedKey
передается в обратный вызов как Buffer
.
Исключение выдается, когда любой из входных аргументов указывает недействительные значения или типы.
const {
scrypt,
} = await import('node:crypto');
// Using the factory defaults.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
// Using a custom N parameter. Must be a power of two.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...aa39b34'
});
const {
scrypt,
} = require('node:crypto');
// Using the factory defaults.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
// Using a custom N parameter. Must be a power of two.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...aa39b34'
});
crypto.scryptSync(password, salt, keylen[, options])
[История]
Версия | Изменения |
---|---|
v12.8.0, v10.17.0 | Теперь значение maxmem может быть любым безопасным целым числом. |
v10.9.0 | Добавлены названия параметров cost , blockSize и parallelization . |
v10.5.0 | Добавлено в версии: v10.5.0 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Object>cost
<number> Параметр стоимости CPU/памяти. Должен быть степенью двойки больше единицы. По умолчанию:16384
.blockSize
<number> Параметр размера блока. По умолчанию:8
.parallelization
<number> Параметр параллелизации. По умолчанию:1
.N
<number> Псевдоним дляcost
. Может быть указан только один из них.r
<number> Псевдоним дляblockSize
. Может быть указан только один из них.p
<number> Псевдоним дляparallelization
. Может быть указан только один из них.maxmem
<number> Верхняя граница памяти. Возникает ошибка, когда (приблизительно)128 * N * r \> maxmem
. По умолчанию:32 * 1024 * 1024
.
Возвращает: <Buffer>
Предоставляет синхронную реализацию scrypt. Scrypt - это функция формирования ключа на основе пароля, которая разработана так, чтобы быть дорогостоящей в вычислительном и память-отношении, чтобы сделать атаки методом перебора невыгодными.
salt
должен быть как можно более уникальным. Рекомендуется, чтобы salt был случайным и имел длину не менее 16 байт. Подробности см. в NIST SP 800-132.
При передаче строк для password
или salt
, пожалуйста, примите во внимание предостережения при использовании строк в качестве входных данных для криптографических API.
Исключение возникает, когда генерация ключа завершается неудачно, в противном случае производный ключ возвращается как Buffer
.
Исключение возникает, когда любой из входных аргументов указывает недопустимые значения или типы.
const {
scryptSync,
} = await import('node:crypto');
// Использование заводских настроек по умолчанию.
const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex')); // '3745e48...08d59ae'
// Использование пользовательского параметра N. Должен быть степенью двойки.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex')); // '3745e48...aa39b34'
const {
scryptSync,
} = require('node:crypto');
// Использование заводских настроек по умолчанию.
const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex')); // '3745e48...08d59ae'
// Использование пользовательского параметра N. Должен быть степенью двойки.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex')); // '3745e48...aa39b34'
crypto.secureHeapUsed()
Добавлено в версии: v15.6.0
- Возвращает: <Object>
total
<number> Общий выделенный размер защищенной кучи, как указано с помощью флага командной строки--secure-heap=n
.min
<number> Минимальный размер выделения из защищенной кучи, как указано с помощью флага командной строки--secure-heap-min
.used
<number> Общее количество байтов, в настоящее время выделенных из защищенной кучи.utilization
<number> Вычисленное отношениеused
кtotal
выделенным байтам.
crypto.setEngine(engine[, flags])
[История]
Версия | Изменения |
---|---|
v22.4.0, v20.16.0 | Поддержка пользовательских движков в OpenSSL 3 устарела. |
v0.11.11 | Добавлено в версии: v0.11.11 |
engine
<string>flags
<crypto.constants> По умолчанию:crypto.constants.ENGINE_METHOD_ALL
Загружает и устанавливает engine
для некоторых или всех функций OpenSSL (выбранных по флагам). Поддержка пользовательских движков в OpenSSL устарела, начиная с OpenSSL 3.
engine
может быть либо идентификатором, либо путем к разделяемой библиотеке движка.
Необязательный аргумент flags
по умолчанию использует ENGINE_METHOD_ALL
. flags
- это битовое поле, принимающее один или комбинацию следующих флагов (определенных в crypto.constants
):
crypto.constants.ENGINE_METHOD_RSA
crypto.constants.ENGINE_METHOD_DSA
crypto.constants.ENGINE_METHOD_DH
crypto.constants.ENGINE_METHOD_RAND
crypto.constants.ENGINE_METHOD_EC
crypto.constants.ENGINE_METHOD_CIPHERS
crypto.constants.ENGINE_METHOD_DIGESTS
crypto.constants.ENGINE_METHOD_PKEY_METHS
crypto.constants.ENGINE_METHOD_PKEY_ASN1_METHS
crypto.constants.ENGINE_METHOD_ALL
crypto.constants.ENGINE_METHOD_NONE
crypto.setFips(bool)
Добавлено в версии: v10.0.0
bool
<boolean>true
для включения режима FIPS.
Включает криптопровайдер, совместимый с FIPS, в сборке Node.js с поддержкой FIPS. Выдает ошибку, если режим FIPS недоступен.
crypto.sign(algorithm, data, key[, callback])
[История]
| Версия | Изменения
crypto.subtle
Added in: v17.4.0
- Type: <SubtleCrypto>
Удобный псевдоним для crypto.webcrypto.subtle
.
crypto.timingSafeEqual(a, b)
[История]
Версия | Изменения |
---|---|
v15.0.0 | Аргументы a и b также могут быть ArrayBuffer. |
v6.6.0 | Added in: v6.6.0 |
a
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>b
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>- Returns: <boolean>
Эта функция сравнивает лежащие в основе байты, которые представляют заданные экземпляры ArrayBuffer
, TypedArray
или DataView
, используя алгоритм с постоянным временем выполнения.
Эта функция не раскрывает информацию о времени, которая позволила бы злоумышленнику угадать одно из значений. Это подходит для сравнения дайджестов HMAC или секретных значений, таких как файлы cookie аутентификации или capability urls.
a
и b
должны быть либо Buffer
s, либо TypedArray
s, либо DataView
s, и они должны иметь одинаковую длину в байтах. Если a
и b
имеют разную длину в байтах, возникает ошибка.
Если хотя бы один из a
и b
является TypedArray
с более чем одним байтом на запись, например Uint16Array
, результат будет вычислен с использованием порядка байтов платформы.
Когда оба входа являются Float32Array
s или Float64Array
s, эта функция может возвращать неожиданные результаты из-за IEEE 754 кодирования чисел с плавающей запятой. В частности, ни x === y
, ни Object.is(x, y)
не подразумевает, что байтовые представления двух чисел с плавающей запятой x
и y
равны.
Использование crypto.timingSafeEqual
не гарантирует, что окружающий код является безопасным по времени. Следует проявлять осторожность, чтобы окружающий код не вносил уязвимости по времени.
crypto.verify(algorithm, data, key, signature[, callback])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача невалидной функции обратного вызова аргументу callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v15.12.0 | Добавлен необязательный аргумент обратного вызова. |
v15.0.0 | Аргументы data, key и signature также могут быть ArrayBuffer. |
v13.2.0, v12.16.0 | Эта функция теперь поддерживает подписи IEEE-P1363 DSA и ECDSA. |
v12.0.0 | Добавлено в: v12.0.0 |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>callback
<Function>Возвращает: <boolean>
true
илиfalse
в зависимости от валидности подписи для данных и открытого ключа, если функцияcallback
не предоставлена.
Проверяет заданную подпись для data
с использованием заданного ключа и алгоритма. Если algorithm
является null
или undefined
, то алгоритм зависит от типа ключа (особенно Ed25519 и Ed448).
Если key
не является KeyObject
, эта функция ведет себя так, как если бы key
был передан в crypto.createPublicKey()
. Если это объект, могут быть переданы следующие дополнительные свойства:
dsaEncoding
<string> Для DSA и ECDSA эта опция определяет формат подписи. Может быть одним из следующих:'der'
(по умолчанию): ASN.1 структура подписи в кодировке DER, кодирующая(r, s)
.'ieee-p1363'
: Формат подписиr || s
, предложенный в IEEE-P1363.
padding
<integer> Необязательное значение заполнения для RSA, одно из следующего:crypto.constants.RSA_PKCS1_PADDING
(по умолчанию)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
будет использовать MGF1 с той же хеш-функцией, которая использовалась для подписи сообщения, как указано в разделе 3.1 RFC 4055.
saltLength
<integer> Длина соли, когда padding являетсяRSA_PKCS1_PSS_PADDING
. Специальное значениеcrypto.constants.RSA_PSS_SALTLEN_DIGEST
устанавливает длину соли равной размеру дайджеста,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(по умолчанию) устанавливает ее в максимально допустимое значение.
Аргумент signature
- это ранее вычисленная подпись для data
.
Поскольку открытые ключи могут быть получены из закрытых ключей, для key
может быть передан закрытый или открытый ключ.
Если предоставлена функция callback
, эта функция использует пул потоков libuv.
crypto.webcrypto
Добавлено в версии: v15.0.0
Тип: <Crypto> Реализация стандарта Web Crypto API.
Подробности см. в документации Web Crypto API.
Примечания
Использование строк в качестве входных данных для криптографических API
По историческим причинам многие криптографические API, предоставляемые Node.js, принимают строки в качестве входных данных, когда базовый криптографический алгоритм работает с последовательностями байтов. К этим случаям относятся открытый текст, зашифрованный текст, симметричные ключи, векторы инициализации, парольные фразы, соли, теги аутентификации и дополнительные аутентифицированные данные.
При передаче строк в криптографические API следует учитывать следующие факторы.
- Не все последовательности байтов являются допустимыми строками UTF-8. Поэтому, когда последовательность байтов длиной
n
получается из строки, ее энтропия обычно ниже, чем энтропия случайной или псевдослучайной последовательности изn
байтов. Например, ни одна строка UTF-8 не приведет к последовательности байтовc0 af
. Секретные ключи должны почти исключительно быть случайными или псевдослучайными последовательностями байтов. - Аналогично, при преобразовании случайных или псевдослучайных последовательностей байтов в строки UTF-8 подпоследовательности, не представляющие допустимые кодовые точки, могут быть заменены символом замены Unicode (
U+FFFD
). Байтовое представление результирующей строки Unicode может, следовательно, не совпадать с последовательностью байтов, из которой была создана строка. Выходы шифров, хеш-функций, алгоритмов подписи и функций деривации ключей являются псевдослучайными последовательностями байтов и не должны использоваться в качестве строк Unicode. - Когда строки получаются от пользователя, некоторые символы Unicode могут быть представлены несколькими эквивалентными способами, приводящими к разным последовательностям байтов. Например, при передаче пользовательской парольной фразы в функцию деривации ключей, такую как PBKDF2 или scrypt, результат функции деривации ключей зависит от того, использует ли строка составные или разложенные символы. Node.js не нормализует представления символов. Разработчикам следует рассмотреть возможность использования
String.prototype.normalize()
на пользовательских вводах перед их передачей в криптографические API.
Устаревший API потоков (до Node.js 0.10)
Модуль Crypto был добавлен в Node.js до появления концепции унифицированного API потоков и до появления объектов Buffer
для обработки двоичных данных. Таким образом, многие классы crypto
имеют методы, которые обычно не встречаются в других классах Node.js, реализующих API потоков (например, update()
, final()
или digest()
). Кроме того, многие методы принимали и возвращали строки в кодировке 'latin1'
по умолчанию, а не Buffer
ы. После Node.js v0.8 это значение по умолчанию было изменено на использование объектов Buffer
по умолчанию.
Поддержка слабых или скомпрометированных алгоритмов
Модуль node:crypto
по-прежнему поддерживает некоторые алгоритмы, которые уже скомпрометированы и не рекомендуются к использованию. API также позволяет использовать шифры и хеши с небольшим размером ключа, которые слишком слабы для безопасного использования.
Пользователи должны нести полную ответственность за выбор криптографического алгоритма и размера ключа в соответствии со своими требованиями безопасности.
Основываясь на рекомендациях NIST SP 800-131A:
- MD5 и SHA-1 больше не приемлемы там, где требуется устойчивость к коллизиям, например, в цифровых подписях.
- Рекомендуется, чтобы ключ, используемый с алгоритмами RSA, DSA и DH, имел длину не менее 2048 бит, а кривая ECDSA и ECDH — не менее 224 бит, чтобы их можно было безопасно использовать в течение нескольких лет.
- Группы DH
modp1
,modp2
иmodp5
имеют размер ключа менее 2048 бит и не рекомендуются.
См. справку для получения других рекомендаций и подробностей.
Некоторые алгоритмы, которые имеют известные слабые места и мало актуальны на практике, доступны только через устаревший провайдер, который не включен по умолчанию.
Режим CCM
CCM — один из поддерживаемых алгоритмов AEAD. Приложения, использующие этот режим, должны соблюдать определенные ограничения при использовании API шифрования:
- Длина тега аутентификации должна быть указана во время создания шифра с помощью параметра
authTagLength
и должна быть одним из следующих значений: 4, 6, 8, 10, 12, 14 или 16 байт. - Длина вектора инициализации (nonce)
N
должна быть от 7 до 13 байт (7 ≤ N ≤ 13
). - Длина открытого текста ограничена
2 ** (8 * (15 - N))
байтами. - При расшифровке тег аутентификации должен быть установлен с помощью
setAuthTag()
перед вызовомupdate()
. В противном случае расшифровка завершится неудачей, иfinal()
вызовет ошибку в соответствии с разделом 2.6 RFC 3610. - Использование потоковых методов, таких как
write(data)
,end(data)
илиpipe()
в режиме CCM, может привести к сбою, поскольку CCM не может обрабатывать более одного фрагмента данных на экземпляр. - При передаче дополнительных аутентифицированных данных (AAD) длина фактического сообщения в байтах должна быть передана в
setAAD()
с помощью параметраplaintextLength
. Многие криптографические библиотеки включают тег аутентификации в зашифрованный текст, что означает, что они создают зашифрованные тексты длинойplaintextLength + authTagLength
. Node.js не включает тег аутентификации, поэтому длина зашифрованного текста всегда равнаplaintextLength
. Это не обязательно, если AAD не используется. - Поскольку CCM обрабатывает все сообщение сразу,
update()
должен быть вызван ровно один раз. - Даже если вызова
update()
достаточно для шифрования/дешифрования сообщения, приложения должны вызватьfinal()
, чтобы вычислить или проверить тег аутентификации.
import { Buffer } from 'node:buffer';
const {
createCipheriv,
createDecipheriv,
randomBytes,
} = await import('node:crypto');
const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);
const aad = Buffer.from('0123456789', 'hex');
const cipher = createCipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();
// Now transmit { ciphertext, nonce, tag }.
const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
try {
decipher.final();
} catch (err) {
throw new Error('Authentication failed!', { cause: err });
}
console.log(receivedPlaintext);
const { Buffer } = require('node:buffer');
const {
createCipheriv,
createDecipheriv,
randomBytes,
} = require('node:crypto');
const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);
const aad = Buffer.from('0123456789', 'hex');
const cipher = createCipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();
// Now transmit { ciphertext, nonce, tag }.
const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
try {
decipher.final();
} catch (err) {
throw new Error('Authentication failed!', { cause: err });
}
console.log(receivedPlaintext);
Режим FIPS
При использовании OpenSSL 3 Node.js поддерживает FIPS 140-2 при использовании с соответствующим провайдером OpenSSL 3, таким как FIPS-провайдер из OpenSSL 3, который можно установить, следуя инструкциям в FIPS README-файле OpenSSL.
Для поддержки FIPS в Node.js вам потребуется:
- Правильно установленный FIPS-провайдер OpenSSL 3.
- Файл конфигурации FIPS-модуля OpenSSL 3.
- Файл конфигурации OpenSSL 3, который ссылается на файл конфигурации FIPS-модуля.
Node.js необходимо будет настроить с помощью файла конфигурации OpenSSL, который указывает на FIPS-провайдер. Пример файла конфигурации выглядит следующим образом:
nodejs_conf = nodejs_init
.include /<абсолютный путь>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
[provider_sect]
default = default_sect
# Имя раздела fips должно совпадать с именем раздела внутри {#the-fips-section-name-should-match-the-section-name-inside-the}
# включенного fipsmodule.cnf.
fips = fips_sect
[default_sect]
activate = 1
где fipsmodule.cnf
— это файл конфигурации FIPS-модуля, сгенерированный на этапе установки FIPS-провайдера:
openssl fipsinstall
Установите переменную окружения OPENSSL_CONF
, чтобы она указывала на ваш файл конфигурации, и OPENSSL_MODULES
на местоположение динамической библиотеки FIPS-провайдера. Например:
export OPENSSL_CONF=/<путь к файлу конфигурации>/nodejs.cnf
export OPENSSL_MODULES=/<путь к openssl lib>/ossl-modules
Режим FIPS можно включить в Node.js одним из следующих способов:
- Запустить Node.js с флагами командной строки
--enable-fips
или--force-fips
. - Программно вызвать
crypto.setFips(true)
.
При необходимости режим FIPS можно включить в Node.js через файл конфигурации OpenSSL. Например:
nodejs_conf = nodejs_init
.include /<абсолютный путь>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
alg_section = algorithm_sect
[provider_sect]
default = default_sect
# Имя раздела fips должно совпадать с именем раздела внутри {#included-fipsmodulecnf}
# включенного fipsmodule.cnf.
fips = fips_sect
[default_sect]
activate = 1
[algorithm_sect]
default_properties = fips=yes
Крипто константы
Следующие константы, экспортируемые crypto.constants
, применяются в различных случаях использования модулей node:crypto
, node:tls
и node:https
и, как правило, специфичны для OpenSSL.
Опции OpenSSL
Подробности смотрите в списке флагов SSL OP.
Константа | Описание |
---|---|
SSL_OP_ALL | Применяет несколько обходных путей для исправления ошибок в OpenSSL. Смотрите https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html для подробностей. |
SSL_OP_ALLOW_NO_DHE_KEX | Указывает OpenSSL разрешить режим обмена ключами, не основанный на [EC]DHE, для TLS v1.3 |
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION | Разрешает устаревшее небезопасное пересогласование между OpenSSL и неисправленными клиентами или серверами. Смотрите https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html. |
SSL_OP_CIPHER_SERVER_PREFERENCE | Пытается использовать предпочтения сервера, а не клиента, при выборе шифра. Поведение зависит от версии протокола. Смотрите https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html. |
SSL_OP_CISCO_ANYCONNECT | Указывает OpenSSL использовать идентификатор версии Cisco DTLS_BAD_VER. |
SSL_OP_COOKIE_EXCHANGE | Указывает OpenSSL включить обмен cookie. |
SSL_OP_CRYPTOPRO_TLSEXT_BUG | Указывает OpenSSL добавить расширение server-hello из ранней версии черновика cryptopro. |
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS | Указывает OpenSSL отключить обходной путь для уязвимости SSL 3.0/TLS 1.0, добавленный в OpenSSL 0.9.6d. |
SSL_OP_LEGACY_SERVER_CONNECT | Разрешает начальное подключение к серверам, которые не поддерживают RI. |
SSL_OP_NO_COMPRESSION | Указывает OpenSSL отключить поддержку сжатия SSL/TLS. |
SSL_OP_NO_ENCRYPT_THEN_MAC | Указывает OpenSSL отключить encrypt-then-MAC. |
SSL_OP_NO_QUERY_MTU | |
SSL_OP_NO_RENEGOTIATION | Указывает OpenSSL отключить пересогласование. |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION | Указывает OpenSSL всегда начинать новую сессию при выполнении пересогласования. |
SSL_OP_NO_SSLv2 | Указывает OpenSSL отключить SSL v2 |
SSL_OP_NO_SSLv3 | Указывает OpenSSL отключить SSL v3 |
SSL_OP_NO_TICKET | Указывает OpenSSL отключить использование тикетов RFC4507bis. |
SSL_OP_NO_TLSv1 | Указывает OpenSSL отключить TLS v1 |
SSL_OP_NO_TLSv1_1 | Указывает OpenSSL отключить TLS v1.1 |
SSL_OP_NO_TLSv1_2 | Указывает OpenSSL отключить TLS v1.2 |
SSL_OP_NO_TLSv1_3 | Указывает OpenSSL отключить TLS v1.3 |
SSL_OP_PRIORITIZE_CHACHA | Указывает серверу OpenSSL приоритизировать ChaCha20-Poly1305, когда это делает клиент. Эта опция не действует, если SSL_OP_CIPHER_SERVER_PREFERENCE не включена. |
SSL_OP_TLS_ROLLBACK_BUG | Указывает OpenSSL отключить обнаружение атаки отката версии. |
Константы движка OpenSSL
Константа | Описание |
---|---|
ENGINE_METHOD_RSA | Ограничение использования движка RSA |
ENGINE_METHOD_DSA | Ограничение использования движка DSA |
ENGINE_METHOD_DH | Ограничение использования движка DH |
ENGINE_METHOD_RAND | Ограничение использования движка RAND |
ENGINE_METHOD_EC | Ограничение использования движка EC |
ENGINE_METHOD_CIPHERS | Ограничение использования движка CIPHERS |
ENGINE_METHOD_DIGESTS | Ограничение использования движка DIGESTS |
ENGINE_METHOD_PKEY_METHS | Ограничение использования движка PKEY_METHS |
ENGINE_METHOD_PKEY_ASN1_METHS | Ограничение использования движка PKEY_ASN1_METHS |
ENGINE_METHOD_ALL | |
ENGINE_METHOD_NONE |
Другие константы OpenSSL
Константа | Описание |
---|---|
DH_CHECK_P_NOT_SAFE_PRIME | |
DH_CHECK_P_NOT_PRIME | |
DH_UNABLE_TO_CHECK_GENERATOR | |
DH_NOT_SUITABLE_GENERATOR | |
RSA_PKCS1_PADDING | |
RSA_SSLV23_PADDING | |
RSA_NO_PADDING | |
RSA_PKCS1_OAEP_PADDING | |
RSA_X931_PADDING | |
RSA_PKCS1_PSS_PADDING | |
RSA_PSS_SALTLEN_DIGEST | Устанавливает длину соли для RSA_PKCS1_PSS_PADDING равной размеру дайджеста при подписи или проверке. |
RSA_PSS_SALTLEN_MAX_SIGN | Устанавливает длину соли для RSA_PKCS1_PSS_PADDING равной максимально допустимому значению при подписании данных. |
RSA_PSS_SALTLEN_AUTO | Приводит к тому, что длина соли для RSA_PKCS1_PSS_PADDING определяется автоматически при проверке подписи. |
POINT_CONVERSION_COMPRESSED | |
POINT_CONVERSION_UNCOMPRESSED | |
POINT_CONVERSION_HYBRID |
Константы криптографии Node.js
Константа | Описание |
---|---|
defaultCoreCipherList | Указывает встроенный список шифров по умолчанию, используемый Node.js. |
defaultCipherList | Указывает активный список шифров по умолчанию, используемый текущим процессом Node.js. |