Криптография
[Стабильность: 2 - Стабильная]
Стабильность: 2 Стабильность: 2 - Стабильная
Исходный код: 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)
// Выводит:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
const { createHmac } = require('node:crypto')
const secret = 'abcdefg'
const hash = createHmac('sha256', secret).update('I love cupcakes').digest('hex')
console.log(hash)
// Выводит:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
Определение недоступности криптографической поддержки
Возможно, что Node.js может быть собран без включения поддержки модуля node:crypto
. В таких случаях попытка import
из crypto
или вызов require('node:crypto')
приведет к возникновению ошибки.
При использовании CommonJS, возникшую ошибку можно перехватить с помощью try/catch:
let crypto
try {
crypto = require('node:crypto')
} catch (err) {
console.error('криптографическая поддержка отключена!')
}
При использовании лексического ключевого слова ESM import
ошибку можно перехватить, только если обработчик для process.on('uncaughtException')
зарегистрирован до любой попытки загрузить модуль (используя, например, предварительно загружаемый модуль).
При использовании ESM, если есть вероятность того, что код может быть запущен на сборке Node.js, где криптографическая поддержка не включена, рассмотрите возможность использования функции import()
вместо лексического ключевого слова import
:
let crypto
try {
crypto = await import('node:crypto')
} catch (err) {
console.error('криптографическая поддержка отключена!')
}
Class: Certificate
Добавлено в: v0.11.8
SPKAC - это механизм запроса подписи сертификата, первоначально реализованный Netscape и формально определенный как часть HTML5 элемента keygen
.
\<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> Компонент запроса структуры данных
spkac
, который включает открытый ключ и запрос.
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
const challenge = Certificate.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Выводит: запрос в виде строки UTF8
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
const challenge = Certificate.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Выводит: запрос в виде строки 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
, который включает в себя открытый ключ и запрос.
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
[Стабильность: 0 - Устаревший]
Стабильность: 0 Стабильность: 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)
// Выводит: открытый ключ в виде <Buffer ...>
const { Certificate } = require('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
const publicKey = cert.exportPublicKey(spkac)
console.log(publicKey)
// Выводит: открытый ключ в виде <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)))
// Выводит: true или false
const { Buffer } = require('node:buffer')
const { Certificate } = require('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
console.log(cert.verifySpkac(Buffer.from(spkac)))
// Выводит: true или 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'
// Сначала сгенерируем ключ. Длина ключа зависит от алгоритма.
// В данном случае для aes192 это 24 байта (192 бита).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Затем мы сгенерируем случайный вектор инициализации
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// Как только у нас есть ключ и iv, мы можем создать и использовать шифр...
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'
// Сначала сгенерируем ключ. Длина ключа зависит от алгоритма.
// В данном случае для aes192 это 24 байта (192 бита).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Затем мы сгенерируем случайный вектор инициализации
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// Как только у нас есть ключ и iv, мы можем создать и использовать шифр...
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'
// Сначала сгенерируем ключ. Длина ключа зависит от алгоритма.
// В данном случае для aes192 это 24 байта (192 бита).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Затем мы сгенерируем случайный вектор инициализации
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'
// Сначала сгенерируем ключ. Длина ключа зависит от алгоритма.
// В данном случае для aes192 это 24 байта (192 бита).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Затем мы сгенерируем случайный вектор инициализации
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'
// Сначала сгенерируем ключ. Длина ключа зависит от алгоритма.
// В данном случае для aes192 это 24 байта (192 бита).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Затем мы сгенерируем случайный вектор инициализации
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'
// Сначала сгенерируем ключ. Длина ключа зависит от алгоритма.
// В данном случае для aes192 это 24 байта (192 бита).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Затем мы сгенерируем случайный вектор инициализации
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()
.
Если при создании экземпляра cipher
была установлена опция authTagLength
, эта функция вернет ровно 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'
// Длина ключа зависит от алгоритма. В этом случае для aes192 это
// 24 байта (192 бита).
// Используйте асинхронный `crypto.scrypt()` вместо этого.
const key = scryptSync(password, 'salt', 24)
// IV обычно передается вместе с зашифрованным текстом.
const iv = Buffer.alloc(16, 0) // Вектор инициализации.
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)
// Выводит: some clear text data
})
// Зашифровано с использованием того же алгоритма, ключа и 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'
// Длина ключа зависит от алгоритма. В этом случае для aes192 это
// 24 байта (192 бита).
// Используйте асинхронный `crypto.scrypt()` вместо этого.
const key = scryptSync(password, 'salt', 24)
// IV обычно передается вместе с зашифрованным текстом.
const iv = Buffer.alloc(16, 0) // Вектор инициализации.
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)
// Выводит: some clear text data
})
// Зашифровано с использованием того же алгоритма, ключа и 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'
// Используйте асинхронный `crypto.scrypt()` вместо этого.
const key = scryptSync(password, 'salt', 24)
// IV обычно передается вместе с зашифрованным текстом.
const iv = Buffer.alloc(16, 0) // Вектор инициализации.
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'
// Используйте асинхронный `crypto.scrypt()` вместо этого.
const key = scryptSync(password, 'salt', 24)
// IV обычно передается вместе с зашифрованным текстом.
const iv = Buffer.alloc(16, 0) // Вектор инициализации.
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'
// Используйте асинхронный `crypto.scrypt()` вместо этого.
const key = scryptSync(password, 'salt', 24)
// IV обычно передается вместе с зашифрованным текстом.
const iv = Buffer.alloc(16, 0) // Вектор инициализации.
const decipher = createDecipheriv(algorithm, key, iv)
// Зашифровано с использованием того же алгоритма, ключа и IV.
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// Выводит: 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'
// Используйте асинхронный `crypto.scrypt()` вместо этого.
const key = scryptSync(password, 'salt', 24)
// IV обычно передается вместе с зашифрованным текстом.
const iv = Buffer.alloc(16, 0) // Вектор инициализации.
const decipher = createDecipheriv(algorithm, key, iv)
// Зашифровано с использованием того же алгоритма, ключа и IV.
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// Выводит: 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>
Обновляет расшифровку с помощью 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> Кодировка encoding строки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> Кодировка строкиotherPublicKey
.outputEncoding
<string> Кодировка возвращаемого значения.- Возвращает: <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
[Стабильность: 0 - Устарело]
Стабильность: 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()
.
// Вычисление скользящего хеша.
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'))
// И так далее.
// Вычисление скользящего хеша.
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'))
// И так далее.
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.
Для создания экземпляров Hmac
используется метод crypto.createHmac()
. Объекты 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'))
// Выведет:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
})
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])
Добавлено в: 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 | Добавлено в: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> Кодировка encoding строкиdata
.
Обновляет содержимое Hmac
с заданными data
, кодировка которого задается в inputEncoding
. Если encoding
не указана, и data
является строкой, применяется кодировка 'utf8'
. Если data
является Buffer
, TypedArray
или DataView
, то inputEncoding
игнорируется.
Это можно вызывать много раз с новыми данными по мере их потоковой передачи.
Класс: KeyObject
[История]
Версия | Изменения |
---|---|
v14.5.0, v12.19.0 | Экземпляры этого класса теперь можно передавать в рабочие потоки с помощью postMessage . |
v11.13.0 | Этот класс теперь экспортируется. |
v11.6.0 | Добавлено в: 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)
// Выводит: 32 (размер симметричного ключа в байтах)
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)
// Выводит: 32 (размер симметричного ключа в байтах)
})()
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
. Тип type
PKCS#8 можно использовать с любым format
для шифрования любого алгоритма ключа (RSA, EC или DH), указав cipher
. PKCS#1 и SEC1 можно зашифровать, указав cipher
только при использовании формата PEM. Для максимальной совместимости используйте 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'
(по умолчанию): 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_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'
(по умолчанию): 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_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'
установлен в 'always'
и если расширение альтернативного имени субъекта либо не существует, либо не содержит соответствующего адреса электронной почты, то рассматривается тема сертификата.
Если параметр '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 через 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).
Рассматриваются только альтернативные имена субъекта iPAddress
RFC 5280, и они должны точно соответствовать заданному 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> Возможное простое число, закодированное как последовательность октетов big-endian произвольной длины.options
<Object>checks
<number> Количество итераций вероятностного теста простоты Миллера-Рабина. Когда значение равно0
(ноль), используется количество проверок, которое дает частоту ложных срабатываний не более 2 для случайных входных данных. Необходимо соблюдать осторожность при выборе количества проверок. Дополнительные сведения см. в документации OpenSSL для параметраnchecks
функцииBN_is_prime_ex
. По умолчанию:0
callback
<Function>
Проверяет простоту candidate
.
crypto.checkPrimeSync(candidate[, options])
Добавлено в: v15.8.0
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> Возможное простое число, закодированное как последовательность октетов с прямым порядком байтов произвольной длины.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.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 (вариант ChaCha20-Poly1305 IETF). |
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'
, Buffer, 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])
Добавлено в: v0.5.0
primeLength
<number>generator
<number> По умолчанию:2
- Возвращает: <DiffieHellman>
Создает объект обмена ключами DiffieHellman
и генерирует простое число длиной primeLength
бит, используя дополнительный числовой generator
. Если generator
не указан, используется значение 2
.
crypto.createDiffieHellmanGroup(name)
Добавлено в: v0.9.3
name
<string>- Возвращает: <DiffieHellmanGroup>
Псевдоним для crypto.getDiffieHellman()
crypto.createECDH(curveName)
Добавлено в: v0.11.14
Создает объект обмена ключами 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', () => {
// Только один элемент будет произведен
// хеш-потоком.
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', () => {
// Только один элемент будет произведен
// хеш-потоком.
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. Добавлен параметр encoding. Ключ не может содержать более 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 или строкой. Был добавлен аргумент кодировки. Ключ не может содержать более 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
опции- Возвращает: <Sign>
Создает и возвращает объект Sign
, использующий заданный алгоритм
. Используйте 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
[Стабильность: 0 - Устарело]
Стабильность: 0 Стабильность: 0 - Устарело
Свойство для проверки и контроля того, используется ли в данный момент криптопровайдер, совместимый с FIPS. Установка в значение true требует сборки Node.js с FIPS.
Это свойство устарело. Вместо него используйте 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) => {
// Обработайте ошибки и используйте сгенерированную пару ключей.
}
)
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) => {
// Обработайте ошибки и используйте сгенерированную пару ключей.
}
)
По завершении callback
будет вызван с err
, установленным в undefined
, и publicKey
/ privateKey
, представляющими сгенерированную пару ключей.
Если этот метод вызывается как его util.promisify()
ed версия, он возвращает 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)
Добавлено в: 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
.
Возвращает: <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
можно использовать для применения дополнительных требований, например, для 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.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
, то простое число будет безопасным простым числом — то есть (простое число - 1) / 2
также будет простым числом.
Параметры options.add
и options.rem
могут использоваться для наложения дополнительных требований, например, для Diffie-Hellman:
- Если установлены и
options.add
, иoptions.rem
, то простое число будет удовлетворять условиюпростое число % add = rem
. - Если установлен только
options.add
иoptions.safe
не равенtrue
, то простое число будет удовлетворять условиюпростое число % add = 1
. - Если установлен только
options.add
иoptions.safe
установлен вtrue
, то простое число будет вместо этого удовлетворять условиюпростое число % add = 3
. Это необходимо, посколькупростое число % 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()
вернет значения по умолчанию для этих шифров. Чтобы проверить, допустима ли заданная длина ключа или длина IV для заданного шифра, используйте параметры 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 и bobSecret должны быть одинаковыми */
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()
Добавлено в: v10.0.0
- Возвращает: <number>
1
, если и только если в настоящее время используется криптопровайдер, совместимый с FIPS,0
в противном случае. В будущих основных выпусках semver может измениться тип возвращаемого значения этого API на <boolean>.
crypto.getHashes()
Добавлено в: 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)
Добавлено в: 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
[Стабильность: 1 - Экспериментальный]
Стабильность: 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')
// Хеширование строки и возврат результата в виде строки в шестнадцатеричной кодировке.
const string = 'Node.js'
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string))
// Кодирование строки в кодировке base64 в буфер, хеширование и возврат
// результата в виде буфера.
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'
// Хеширование строки и возврат результата в виде строки в шестнадцатеричной кодировке.
const string = 'Node.js'
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string))
// Кодирование строки в кодировке base64 в буфер, хеширование и возврат
// результата в виде буфера.
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> Дополнительное значение info. Должно быть предоставлено, но может иметь нулевую длину, и не может быть более 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> Дополнительное значение info. Обязательно, но может быть нулевой длины, и не может быть более 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. Буфер может быть строкой или 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. Буфер может быть строкой или 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} байт случайных данных: ${buf.toString('hex')}`)
})
// Асинхронно
const { randomBytes } = require('node:crypto')
randomBytes(256, (err, buf) => {
if (err) throw err
console.log(`${buf.length} байт случайных данных: ${buf.toString('hex')}`)
})
Если функция callback
не предоставлена, случайные байты генерируются синхронно и возвращаются как Buffer
. Ошибка будет выброшена, если возникнет проблема с генерацией байтов.
// Синхронно
const { randomBytes } = await import('node:crypto')
const buf = randomBytes(256)
console.log(`${buf.length} байт случайных данных: ${buf.toString('hex')}`)
// Синхронно
const { randomBytes } = require('node:crypto')
const buf = randomBytes(256)
console.log(`${buf.length} байт случайных данных: ${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'))
})
В качестве buffer
можно передать любой экземпляр ArrayBuffer
, TypedArray
или DataView
.
Хотя это включает экземпляры 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 использует пул потоков libuv, что может иметь неожиданные и негативные последствия для производительности некоторых приложений; см. документацию UV_THREADPOOL_SIZE
для получения дополнительной информации.
Асинхронная версия crypto.randomFill()
выполняется в одном запросе пула потоков. Чтобы минимизировать вариации длины задач пула потоков, разделяйте большие запросы 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
) должен быть меньше 253. 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 | Аргументы password и salt также могут быть экземплярами 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> Параметр стоимости 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
.
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')
// Использование заводских настроек по умолчанию.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...08d59ae'
})
// Использование пользовательского параметра N. Должен быть степенью двойки.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...aa39b34'
})
const { scrypt } = require('node:crypto')
// Использование заводских настроек по умолчанию.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...08d59ae'
})
// Использование пользовательского параметра N. Должен быть степенью двойки.
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])
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v15.12.0 | Добавлен необязательный аргумент обратного вызова. |
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>callback
<Function>Возвращает: <Buffer>, если функция
callback
не предоставлена.
Вычисляет и возвращает подпись для data
, используя данный закрытый ключ и алгоритм. Если algorithm
равен null
или undefined
, то алгоритм зависит от типа ключа (особенно Ed25519 и Ed448).
Если key
не является KeyObject
, эта функция ведет себя так, как если бы key
был передан в crypto.createPrivateKey()
. Если это объект, могут быть переданы следующие дополнительные свойства:
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> Длина соли, когда заполнение равноRSA_PKCS1_PSS_PADDING
. Специальное значениеcrypto.constants.RSA_PSS_SALTLEN_DIGEST
устанавливает длину соли равной размеру дайджеста,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(по умолчанию) устанавливает ее на максимально допустимое значение.
Если предоставлена функция callback
, эта функция использует пул потоков libuv.
crypto.subtle
Добавлено в: v17.4.0
- Тип: <SubtleCrypto>
Удобный псевдоним для crypto.webcrypto.subtle
.
crypto.timingSafeEqual(a, b)
[История]
Версия | Изменения |
---|---|
v15.0.0 | Аргументы a и b также могут быть ArrayBuffer. |
v6.6.0 | Добавлено в: v6.6.0 |
a
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>b
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>- Возвращает: <boolean>
Эта функция сравнивает базовые байты, представляющие заданные экземпляры ArrayBuffer
, TypedArray
или DataView
, используя алгоритм с постоянным временем выполнения.
Эта функция не допускает утечку информации о времени, которая позволила бы злоумышленнику угадать одно из значений. Она подходит для сравнения дайджестов HMAC или секретных значений, таких как файлы cookie аутентификации или capability urls.
a
и b
должны быть либо Buffer
, либо TypedArray
, либо DataView
, и они должны иметь одинаковую длину в байтах. Если a
и b
имеют разную длину в байтах, возникает ошибка.
Если хотя бы один из a
и b
является TypedArray
с более чем одним байтом на запись, например Uint16Array
, результат будет вычислен с использованием порядка байтов платформы.
Когда оба входных значения являются Float32Array
или Float64Array
, эта функция может вернуть неожиданные результаты из-за кодирования чисел с плавающей запятой 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
<строка> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Объект> | <строка> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>callback
<Функция>err
<Ошибка>result
<логическое значение>
Возвращает: <логическое значение>
true
илиfalse
в зависимости от достоверности подписи для данных и открытого ключа, если функцияcallback
не указана.
Проверяет заданную подпись для data
с использованием заданного ключа и алгоритма. Если algorithm
имеет значение null
или undefined
, то алгоритм зависит от типа ключа (особенно Ed25519 и Ed448).
Если key
не является KeyObject
, эта функция ведет себя так, как если бы key
был передан в crypto.createPublicKey()
. Если это объект, могут быть переданы следующие дополнительные свойства:
dsaEncoding
<строка> Для DSA и ECDSA этот параметр определяет формат подписи. Он может быть одним из следующих:'der'
(по умолчанию): DER-закодированная структура подписи ASN.1, кодирующая(r, s)
.'ieee-p1363'
: Формат подписиr || s
, как предложено в IEEE-P1363.
padding
<целое число> Необязательное значение отступа для RSA, одно из следующих:crypto.constants.RSA_PKCS1_PADDING
(по умолчанию)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
будет использовать MGF1 с той же хеш-функцией, которая использовалась для подписи сообщения, как указано в разделе 3.1 RFC 4055.
saltLength
<целое число> Длина соли, когда отступом является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
s. Это значение по умолчанию было изменено после 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()
// Теперь передаем { 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()
// Теперь передаем { 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, который можно установить, следуя инструкциям в файле README FIPS 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 разрешить режим обмена ключами на основе non-[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. |