Crypto
[Stable: 2 - Stable]
Stable: 2 Estabilidade: 2 - Estável
Código-fonte: lib/crypto.js
O módulo node:crypto
fornece funcionalidade criptográfica que inclui um conjunto de wrappers para as funções de hash, HMAC, cifra, decifração, assinatura e verificação do OpenSSL.
const { createHmac } = await import('node:crypto')
const secret = 'abcdefg'
const hash = createHmac('sha256', secret).update('I love cupcakes').digest('hex')
console.log(hash)
// Imprime:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
const { createHmac } = require('node:crypto')
const secret = 'abcdefg'
const hash = createHmac('sha256', secret).update('I love cupcakes').digest('hex')
console.log(hash)
// Imprime:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
Determinar se o suporte a criptografia está indisponível
É possível que o Node.js seja construído sem incluir suporte para o módulo node:crypto
. Nesses casos, tentar importar
de crypto
ou chamar require('node:crypto')
resultará em um erro sendo lançado.
Ao usar o CommonJS, o erro lançado pode ser capturado usando try/catch:
let crypto
try {
crypto = require('node:crypto')
} catch (err) {
console.error('suporte a criptografia está desabilitado!')
}
Ao usar a palavra-chave lexical ESM import
, o erro só pode ser capturado se um manipulador para process.on('uncaughtException')
for registrado antes de qualquer tentativa de carregar o módulo ser feita (usando, por exemplo, um módulo de pré-carregamento).
Ao usar ESM, se houver uma chance de o código ser executado em uma build do Node.js onde o suporte a criptografia não esteja habilitado, considere usar a função import()
em vez da palavra-chave lexical import
:
let crypto
try {
crypto = await import('node:crypto')
} catch (err) {
console.error('suporte a criptografia está desabilitado!')
}
Classe: Certificate
Adicionado em: v0.11.8
SPKAC é um mecanismo de Solicitação de Assinatura de Certificado originalmente implementado pela Netscape e foi especificado formalmente como parte do elemento keygen
do HTML5.
\<keygen\>
está depreciado desde HTML 5.2 e novos projetos não devem mais usar este elemento.
O módulo node:crypto
fornece a classe Certificate
para trabalhar com dados SPKAC. O uso mais comum é o tratamento da saída gerada pelo elemento HTML5 \<keygen\>
. O Node.js usa a implementação SPKAC do OpenSSL internamente.
Método estático: Certificate.exportChallenge(spkac[, encoding])
[Histórico]
Versão | Alterações |
---|---|
v15.0.0 | O argumento spkac pode ser um ArrayBuffer. Limitou o tamanho do argumento spkac a um máximo de 2**31 - 1 bytes. |
v9.0.0 | Adicionado em: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringspkac
.- Retorna: <Buffer> O componente de desafio da estrutura de dados
spkac
, que inclui uma chave pública e um desafio.
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
const challenge = Certificate.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Imprime: o desafio como uma string UTF8
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
const challenge = Certificate.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Imprime: o desafio como uma string UTF8
Método estático: Certificate.exportPublicKey(spkac[, encoding])
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | O argumento spkac pode ser um ArrayBuffer. Limitou o tamanho do argumento spkac a um máximo de 2**31 - 1 bytes. |
v9.0.0 | Adicionado em: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringspkac
.- Retorna: <Buffer> O componente de chave pública da estrutura de dados
spkac
, que inclui uma chave pública e um desafio.
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
const publicKey = Certificate.exportPublicKey(spkac)
console.log(publicKey)
// Imprime: a chave pública como <Buffer ...>
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
const publicKey = Certificate.exportPublicKey(spkac)
console.log(publicKey)
// Imprime: a chave pública como <Buffer ...>
Método estático: Certificate.verifySpkac(spkac[, encoding])
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | O argumento spkac pode ser um ArrayBuffer. Adicionada codificação. Limitou o tamanho do argumento spkac a um máximo de 2**31 - 1 bytes. |
v9.0.0 | Adicionado em: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringspkac
.- Retorna: <boolean>
true
se a estrutura de dadosspkac
fornecida for válida,false
caso contrário.
import { Buffer } from 'node:buffer'
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
console.log(Certificate.verifySpkac(Buffer.from(spkac)))
// Imprime: true ou false
const { Buffer } = require('node:buffer')
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
console.log(Certificate.verifySpkac(Buffer.from(spkac)))
// Imprime: true ou false
API Legada
[Estável: 0 - Obsoleto]
Estável: 0 Estabilidade: 0 - Obsoleto
Como uma interface legada, é possível criar novas instâncias da classe crypto.Certificate
como ilustrado nos exemplos abaixo.
new crypto.Certificate()
Instâncias da classe Certificate
podem ser criadas usando a palavra-chave new
ou chamando crypto.Certificate()
como uma função:
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])
Adicionado em: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringspkac
.- Retorna: <Buffer> O componente de desafio da estrutura de dados
spkac
, que inclui uma chave pública e um desafio.
const { Certificate } = await import('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
const challenge = cert.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Imprime: o desafio como uma string UTF8
const { Certificate } = require('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
const challenge = cert.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Imprime: o desafio como uma string UTF8
certificate.exportPublicKey(spkac[, encoding])
Adicionado em: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringspkac
.- Retorna: <Buffer> O componente de chave pública da estrutura de dados
spkac
, que inclui uma chave pública e um desafio.
const { Certificate } = await import('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
const publicKey = cert.exportPublicKey(spkac)
console.log(publicKey)
// Imprime: a chave pública como <Buffer ...>
const { Certificate } = require('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
const publicKey = cert.exportPublicKey(spkac)
console.log(publicKey)
// Imprime: a chave pública como <Buffer ...>
certificate.verifySpkac(spkac[, encoding])
Adicionado em: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringspkac
.- Retorna: <boolean>
true
se a estrutura de dadosspkac
fornecida for válida,false
caso contrário.
import { Buffer } from 'node:buffer'
const { Certificate } = await import('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
console.log(cert.verifySpkac(Buffer.from(spkac)))
// Imprime: true ou false
const { Buffer } = require('node:buffer')
const { Certificate } = require('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
console.log(cert.verifySpkac(Buffer.from(spkac)))
// Imprime: true ou false
Classe: Cipher
Adicionado em: v0.1.94
- Estende: <stream.Transform>
Instâncias da classe Cipher
são usadas para criptografar dados. A classe pode ser usada de uma das duas maneiras:
- Como um stream que é legível e gravável, onde dados simples não criptografados são escritos para produzir dados criptografados no lado legível, ou
- Usando os métodos
cipher.update()
ecipher.final()
para produzir os dados criptografados.
O método crypto.createCipheriv()
é usado para criar instâncias Cipher
. Objetos Cipher
não devem ser criados diretamente usando a palavra-chave new
.
Exemplo: Usando objetos Cipher
como streams:
const { scrypt, randomFill, createCipheriv } = await import('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'Senha usada para gerar a chave'
// Primeiro, vamos gerar a chave. O comprimento da chave depende do algoritmo.
// Neste caso para aes192, é 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Então, vamos gerar um vetor de inicialização aleatório
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// Assim que tivermos a chave e o iv, podemos criar e usar a cifra...
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('alguns dados de texto claro')
cipher.end()
})
})
const { scrypt, randomFill, createCipheriv } = require('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'Senha usada para gerar a chave'
// Primeiro, vamos gerar a chave. O comprimento da chave depende do algoritmo.
// Neste caso para aes192, é 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Então, vamos gerar um vetor de inicialização aleatório
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// Assim que tivermos a chave e o iv, podemos criar e usar a cifra...
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('alguns dados de texto claro')
cipher.end()
})
})
Exemplo: Usando Cipher
e streams encadeados:
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 = 'Senha usada para gerar a chave'
// Primeiro, vamos gerar a chave. O comprimento da chave depende do algoritmo.
// Neste caso para aes192, é 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Então, vamos gerar um vetor de inicialização aleatório
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 = 'Senha usada para gerar a chave'
// Primeiro, vamos gerar a chave. O comprimento da chave depende do algoritmo.
// Neste caso para aes192, é 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Então, vamos gerar um vetor de inicialização aleatório
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
})
})
})
Exemplo: Usando os métodos cipher.update()
e cipher.final()
:
const { scrypt, randomFill, createCipheriv } = await import('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'Senha usada para gerar a chave'
// Primeiro, vamos gerar a chave. O comprimento da chave depende do algoritmo.
// Neste caso para aes192, é 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Então, vamos gerar um vetor de inicialização aleatório
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
const cipher = createCipheriv(algorithm, key, iv)
let encrypted = cipher.update('alguns dados de texto claro', 'utf8', 'hex')
encrypted += cipher.final('hex')
console.log(encrypted)
})
})
const { scrypt, randomFill, createCipheriv } = require('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'Senha usada para gerar a chave'
// Primeiro, vamos gerar a chave. O comprimento da chave depende do algoritmo.
// Neste caso para aes192, é 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// Então, vamos gerar um vetor de inicialização aleatório
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
const cipher = createCipheriv(algorithm, key, iv)
let encrypted = cipher.update('alguns dados de texto claro', 'utf8', 'hex')
encrypted += cipher.final('hex')
console.log(encrypted)
})
})
cipher.final([outputEncoding])
Adicionado em: v0.1.94
outputEncoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string> Quaisquer conteúdos cifrados restantes. Se
outputEncoding
for especificado, uma string é retornada. Se umoutputEncoding
não for fornecido, umBuffer
é retornado.
Depois que o método cipher.final()
for chamado, o objeto Cipher
não poderá mais ser usado para criptografar dados. Tentativas de chamar cipher.final()
mais de uma vez resultarão no lançamento de um erro.
cipher.getAuthTag()
Adicionado em: v1.0.0
- Retorna: <Buffer> Ao usar um modo de criptografia autenticado (
GCM
,CCM
,OCB
echacha20-poly1305
são suportados atualmente), o métodocipher.getAuthTag()
retorna umBuffer
contendo a tag de autenticação que foi calculada a partir dos dados fornecidos.
O método cipher.getAuthTag()
deve ser chamado somente após a conclusão da criptografia usando o método cipher.final()
.
Se a opção authTagLength
foi definida durante a criação da instância cipher
, essa função retornará exatamente authTagLength
bytes.
cipher.setAAD(buffer[, options])
Adicionado em: v1.0.0
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object> Opçõesstream.transform
Retorna: <Cipher> A mesma instância
Cipher
para encadeamento de métodos.
Ao usar um modo de criptografia autenticado (GCM
, CCM
, OCB
e chacha20-poly1305
são suportados atualmente), o método cipher.setAAD()
define o valor usado para o parâmetro de entrada dados adicionais autenticados (AAD).
A opção plaintextLength
é opcional para GCM
e OCB
. Ao usar CCM
, a opção plaintextLength
deve ser especificada e seu valor deve corresponder ao comprimento do texto não criptografado em bytes. Consulte modo CCM.
O método cipher.setAAD()
deve ser chamado antes de cipher.update()
.
cipher.setAutoPadding([autoPadding])
Adicionado em: v0.7.1
autoPadding
<boolean> Padrão:true
- Retorna: <Cipher> A mesma instância
Cipher
para encadeamento de métodos.
Ao usar algoritmos de criptografia de bloco, a classe Cipher
adicionará automaticamente padding aos dados de entrada para o tamanho de bloco apropriado. Para desativar o padding padrão, chame cipher.setAutoPadding(false)
.
Quando autoPadding
é false
, o comprimento de todos os dados de entrada deve ser um múltiplo do tamanho de bloco da cifra ou cipher.final()
lançará um erro. Desativar o padding automático é útil para padding não padrão, por exemplo, usar 0x0
em vez de padding PKCS.
O método cipher.setAutoPadding()
deve ser chamado antes de cipher.final()
.
cipher.update(data[, inputEncoding][, outputEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v6.0.0 | O inputEncoding padrão mudou de binary para utf8 . |
v0.1.94 | Adicionado em: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação dos dados.outputEncoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Atualiza a cifra com data
. Se o argumento inputEncoding
for fornecido, o argumento data
é uma string usando a codificação especificada. Se o argumento inputEncoding
não for fornecido, data
deve ser um Buffer
, TypedArray
ou DataView
. Se data
for um Buffer
, TypedArray
ou DataView
, então inputEncoding
será ignorado.
O outputEncoding
especifica o formato de saída dos dados cifrados. Se o outputEncoding
for especificado, uma string usando a codificação especificada é retornada. Se nenhum outputEncoding
for fornecido, um Buffer
é retornado.
O método cipher.update()
pode ser chamado várias vezes com novos dados até que cipher.final()
seja chamado. Chamar cipher.update()
depois de cipher.final()
resultará em um erro sendo lançado.
Classe: Decipher
Adicionado em: v0.1.94
- Estende: <stream.Transform>
Instâncias da classe Decipher
são usadas para descriptografar dados. A classe pode ser usada de duas maneiras:
- Como um stream que é tanto legível quanto gravável, onde dados criptografados simples são gravados para produzir dados não criptografados no lado legível, ou
- Usando os métodos
decipher.update()
edecipher.final()
para produzir os dados não criptografados.
O método crypto.createDecipheriv()
é usado para criar instâncias de Decipher
. Objetos Decipher
não devem ser criados diretamente usando a palavra-chave new
.
Exemplo: Usando objetos Decipher
como streams:
import { Buffer } from 'node:buffer'
const { scryptSync, createDecipheriv } = await import('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'Senha usada para gerar a chave'
// O tamanho da chave depende do algoritmo. Neste caso, para aes192, é
// 24 bytes (192 bits).
// Use o `crypto.scrypt()` assíncrono em vez disso.
const key = scryptSync(password, 'salt', 24)
// O IV é geralmente passado junto com o texto cifrado.
const iv = Buffer.alloc(16, 0) // Vetor de inicialização.
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)
// Imprime: alguns dados de texto claro
})
// Criptografado com o mesmo algoritmo, chave e 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 = 'Senha usada para gerar a chave'
// O tamanho da chave depende do algoritmo. Neste caso, para aes192, é
// 24 bytes (192 bits).
// Use o `crypto.scrypt()` assíncrono em vez disso.
const key = scryptSync(password, 'salt', 24)
// O IV é geralmente passado junto com o texto cifrado.
const iv = Buffer.alloc(16, 0) // Vetor de inicialização.
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)
// Imprime: alguns dados de texto claro
})
// Criptografado com o mesmo algoritmo, chave e iv.
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
decipher.write(encrypted, 'hex')
decipher.end()
Exemplo: Usando Decipher
e streams encadeados:
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 = 'Senha usada para gerar a chave'
// Use o `crypto.scrypt()` assíncrono em vez disso.
const key = scryptSync(password, 'salt', 24)
// O IV é geralmente passado junto com o texto cifrado.
const iv = Buffer.alloc(16, 0) // Vetor de inicialização.
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 = 'Senha usada para gerar a chave'
// Use o `crypto.scrypt()` assíncrono em vez disso.
const key = scryptSync(password, 'salt', 24)
// O IV é geralmente passado junto com o texto cifrado.
const iv = Buffer.alloc(16, 0) // Vetor de inicialização.
const decipher = createDecipheriv(algorithm, key, iv)
const input = createReadStream('test.enc')
const output = createWriteStream('test.js')
input.pipe(decipher).pipe(output)
Exemplo: Usando os métodos decipher.update()
e decipher.final()
:
import { Buffer } from 'node:buffer'
const { scryptSync, createDecipheriv } = await import('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'Senha usada para gerar a chave'
// Use o `crypto.scrypt()` assíncrono em vez disso.
const key = scryptSync(password, 'salt', 24)
// O IV é geralmente passado junto com o texto cifrado.
const iv = Buffer.alloc(16, 0) // Vetor de inicialização.
const decipher = createDecipheriv(algorithm, key, iv)
// Criptografado usando o mesmo algoritmo, chave e iv.
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// Imprime: alguns dados de texto claro
const { scryptSync, createDecipheriv } = require('node:crypto')
const { Buffer } = require('node:buffer')
const algorithm = 'aes-192-cbc'
const password = 'Senha usada para gerar a chave'
// Use o `crypto.scrypt()` assíncrono em vez disso.
const key = scryptSync(password, 'salt', 24)
// O IV é geralmente passado junto com o texto cifrado.
const iv = Buffer.alloc(16, 0) // Vetor de inicialização.
const decipher = createDecipheriv(algorithm, key, iv)
// Criptografado usando o mesmo algoritmo, chave e iv.
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// Imprime: alguns dados de texto claro
decipher.final([outputEncoding])
Adicionado em: v0.1.94
outputEncoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string> Quaisquer conteúdos decifrados restantes. Se
outputEncoding
for especificado, uma string é retornada. Se umoutputEncoding
não for fornecido, umBuffer
é retornado.
Depois que o método decipher.final()
for chamado, o objeto Decipher
não poderá mais ser usado para descriptografar dados. Tentativas de chamar decipher.final()
mais de uma vez resultarão em um erro sendo lançado.
decipher.setAAD(buffer[, options])
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | O argumento do buffer pode ser uma string ou ArrayBuffer e é limitado a no máximo 2 ** 31 - 1 bytes. |
v7.2.0 | Este método agora retorna uma referência para decipher . |
v1.0.0 | Adicionado em: v1.0.0 |
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object>stream.transform
opçõesRetorna: <Decipher> O mesmo Decipher para encadeamento de métodos.
Ao usar um modo de criptografia autenticado (atualmente, GCM
, CCM
, OCB
e chacha20-poly1305
são suportados), o método decipher.setAAD()
define o valor usado para o parâmetro de entrada dados adicionais autenticados (AAD).
O argumento options
é opcional para GCM
. Ao usar CCM
, a opção plaintextLength
deve ser especificada e seu valor deve corresponder ao comprimento do texto cifrado em bytes. Consulte modo CCM.
O método decipher.setAAD()
deve ser chamado antes de decipher.update()
.
Ao passar uma string como buffer
, considere ressalvas ao usar strings como entradas para APIs criptográficas.
decipher.setAuthTag(buffer[, encoding])
[Histórico]
Versão | Mudanças |
---|---|
v22.0.0, v20.13.0 | Usar comprimentos de tag GCM diferentes de 128 bits sem especificar a opção authTagLength ao criar decipher está obsoleto. |
v15.0.0 | O argumento buffer pode ser uma string ou ArrayBuffer e é limitado a no máximo 2 ** 31 - 1 bytes. |
v11.0.0 | Este método agora lança um erro se o comprimento da tag GCM for inválido. |
v7.2.0 | Este método agora retorna uma referência a decipher . |
v1.0.0 | Adicionado em: v1.0.0 |
buffer
<string> | <Buffer> | <ArrayBuffer> | <TypedArray> | <DataView>encoding
<string> Codificação de string a ser usada quandobuffer
é uma string.- Retorna: <Decipher> O mesmo Decipher para encadeamento de métodos.
Ao usar um modo de criptografia autenticado (GCM
, CCM
, OCB
e chacha20-poly1305
são atualmente suportados), o método decipher.setAuthTag()
é usado para passar a tag de autenticação recebida. Se nenhuma tag for fornecida, ou se o texto cifrado tiver sido adulterado, decipher.final()
lançará um erro, indicando que o texto cifrado deve ser descartado devido à falha na autenticação. Se o comprimento da tag for inválido de acordo com NIST SP 800-38D ou não corresponder ao valor da opção authTagLength
, decipher.setAuthTag()
lançará um erro.
O método decipher.setAuthTag()
deve ser chamado antes de decipher.update()
para o modo CCM
ou antes de decipher.final()
para os modos GCM
e OCB
e chacha20-poly1305
. decipher.setAuthTag()
só pode ser chamado uma vez.
Ao passar uma string como tag de autenticação, considere as advertências ao usar strings como entradas para APIs criptográficas.
decipher.setAutoPadding([autoPadding])
Adicionado em: v0.7.1
autoPadding
<boolean> Padrão:true
- Retorna: <Decipher> O mesmo Decipher para encadeamento de métodos.
Quando os dados são criptografados sem preenchimento de bloco padrão, chamar decipher.setAutoPadding(false)
desativará o preenchimento automático para impedir que decipher.final()
verifique e remova o preenchimento.
Desligar o preenchimento automático só funcionará se o comprimento dos dados de entrada for um múltiplo do tamanho do bloco de cifras.
O método decipher.setAutoPadding()
deve ser chamado antes de decipher.final()
.
decipher.update(data[, inputEncoding][, outputEncoding])
[Histórico]
Versão | Alterações |
---|---|
v6.0.0 | O inputEncoding padrão mudou de binary para utf8 . |
v0.1.94 | Adicionado em: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação da stringdata
.outputEncoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Atualiza o decifrador com data
. Se o argumento inputEncoding
for fornecido, o argumento data
é uma string usando a codificação especificada. Se o argumento inputEncoding
não for fornecido, data
deve ser um Buffer
. Se data
for um Buffer
, então inputEncoding
é ignorado.
O outputEncoding
especifica o formato de saída dos dados decifrados. Se o outputEncoding
for especificado, uma string usando a codificação especificada é retornada. Se nenhum outputEncoding
for fornecido, um Buffer
é retornado.
O método decipher.update()
pode ser chamado várias vezes com novos dados até que decipher.final()
seja chamado. Chamar decipher.update()
depois de decipher.final()
resultará em um erro sendo lançado.
Mesmo que a cifra subjacente implemente autenticação, a autenticidade e a integridade do texto simples retornado desta função podem ser incertas neste momento. Para algoritmos de criptografia autenticada, a autenticidade geralmente é estabelecida apenas quando o aplicativo chama decipher.final()
.
Classe: DiffieHellman
Adicionado em: v0.5.0
A classe DiffieHellman
é uma utilidade para criar trocas de chaves Diffie-Hellman.
Instâncias da classe DiffieHellman
podem ser criadas usando a função crypto.createDiffieHellman()
.
import assert from 'node:assert'
const { createDiffieHellman } = await import('node:crypto')
// Gera as chaves da Alice...
const alice = createDiffieHellman(2048)
const aliceKey = alice.generateKeys()
// Gera as chaves do Bob...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator())
const bobKey = bob.generateKeys()
// Troca e gera o segredo...
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')
// Gera as chaves da Alice...
const alice = createDiffieHellman(2048)
const aliceKey = alice.generateKeys()
// Gera as chaves do Bob...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator())
const bobKey = bob.generateKeys()
// Troca e gera o segredo...
const aliceSecret = alice.computeSecret(bobKey)
const bobSecret = bob.computeSecret(aliceKey)
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'))
diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
Adicionado em: v0.5.0
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação de uma stringotherPublicKey
.outputEncoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Calcula o segredo compartilhado usando otherPublicKey
como a chave pública da outra parte e retorna o segredo compartilhado calculado. A chave fornecida é interpretada usando a inputEncoding
especificada, e o segredo é codificado usando a outputEncoding
especificada. Se a inputEncoding
não for fornecida, espera-se que otherPublicKey
seja um Buffer
, TypedArray
ou DataView
.
Se outputEncoding
receber uma string, uma string será retornada; caso contrário, um Buffer
será retornado.
diffieHellman.generateKeys([encoding])
Adicionado em: v0.5.0
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Gera valores de chave Diffie-Hellman privada e pública, a menos que já tenham sido gerados ou calculados, e retorna a chave pública na codificação
especificada. Esta chave deve ser transferida para a outra parte. Se encoding
for fornecido, uma string é retornada; caso contrário, um Buffer
é retornado.
Esta função é um wrapper fino em torno de DH_generate_key()
. Em particular, depois que uma chave privada é gerada ou definida, chamar esta função apenas atualiza a chave pública, mas não gera uma nova chave privada.
diffieHellman.getGenerator([encoding])
Adicionado em: v0.5.0
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Retorna o gerador Diffie-Hellman na codificação
especificada. Se encoding
for fornecido, uma string é retornada; caso contrário, um Buffer
é retornado.
diffieHellman.getPrime([encoding])
Adicionado em: v0.5.0
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Retorna o primo Diffie-Hellman na codificação
especificada. Se encoding
for fornecido, uma string é retornada; caso contrário, um Buffer
é retornado.
diffieHellman.getPrivateKey([encoding])
Adicionado em: v0.5.0
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Retorna a chave privada Diffie-Hellman na codificação
especificada. Se encoding
for fornecido, uma string será retornada; caso contrário, um Buffer
é retornado.
diffieHellman.getPublicKey([encoding])
Adicionado em: v0.5.0
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Retorna a chave pública Diffie-Hellman na codificação
especificada. Se encoding
for fornecido, uma string será retornada; caso contrário, um Buffer
é retornado.
diffieHellman.setPrivateKey(privateKey[, encoding])
Adicionado em: v0.5.0
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringprivateKey
.
Define a chave privada Diffie-Hellman. Se o argumento encoding
for fornecido, espera-se que privateKey
seja uma string. Se nenhum encoding
for fornecido, espera-se que privateKey
seja um Buffer
, TypedArray
ou DataView
.
Esta função não calcula automaticamente a chave pública associada. diffieHellman.setPublicKey()
ou diffieHellman.generateKeys()
podem ser usados para fornecer manualmente a chave pública ou para derivá-la automaticamente.
diffieHellman.setPublicKey(publicKey[, encoding])
Adicionado em: v0.5.0
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringpublicKey
.
Define a chave pública Diffie-Hellman. Se o argumento encoding
for fornecido, espera-se que publicKey
seja uma string. Se nenhum encoding
for fornecido, espera-se que publicKey
seja um Buffer
, TypedArray
ou DataView
.
diffieHellman.verifyError
Adicionado em: v0.11.12
Um campo de bits contendo quaisquer avisos e/ou erros resultantes de uma verificação realizada durante a inicialização do objeto DiffieHellman
.
Os seguintes valores são válidos para esta propriedade (conforme definido no módulo node:constants
):
DH_CHECK_P_NOT_SAFE_PRIME
DH_CHECK_P_NOT_PRIME
DH_UNABLE_TO_CHECK_GENERATOR
DH_NOT_SUITABLE_GENERATOR
Classe: DiffieHellmanGroup
Adicionado em: v0.7.5
A classe DiffieHellmanGroup
recebe um grupo modp conhecido como seu argumento. Ele funciona da mesma forma que DiffieHellman
, exceto que não permite alterar suas chaves após a criação. Em outras palavras, ele não implementa os métodos setPublicKey()
ou setPrivateKey()
.
const { createDiffieHellmanGroup } = await import('node:crypto')
const dh = createDiffieHellmanGroup('modp16')
const { createDiffieHellmanGroup } = require('node:crypto')
const dh = createDiffieHellmanGroup('modp16')
Os seguintes grupos são suportados:
'modp14'
(2048 bits, RFC 3526 Seção 3)'modp15'
(3072 bits, RFC 3526 Seção 4)'modp16'
(4096 bits, RFC 3526 Seção 5)'modp17'
(6144 bits, RFC 3526 Seção 6)'modp18'
(8192 bits, RFC 3526 Seção 7)
Os seguintes grupos ainda são suportados, mas estão obsoletos (consulte Advertências):
'modp1'
(768 bits, RFC 2409 Seção 6.1)'modp2'
(1024 bits, RFC 2409 Seção 6.2)'modp5'
(1536 bits, RFC 3526 Seção 2)
Esses grupos obsoletos podem ser removidos em futuras versões do Node.js.
Classe: ECDH
Adicionado em: v0.11.14
A classe ECDH
é uma utilidade para criar trocas de chaves Elliptic Curve Diffie-Hellman (ECDH).
Instâncias da classe ECDH
podem ser criadas usando a função crypto.createECDH()
.
import assert from 'node:assert'
const { createECDH } = await import('node:crypto')
// Gerar as chaves de Alice...
const alice = createECDH('secp521r1')
const aliceKey = alice.generateKeys()
// Gerar as chaves de Bob...
const bob = createECDH('secp521r1')
const bobKey = bob.generateKeys()
// Trocar e gerar o segredo...
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')
// Gerar as chaves de Alice...
const alice = createECDH('secp521r1')
const aliceKey = alice.generateKeys()
// Gerar as chaves de Bob...
const bob = createECDH('secp521r1')
const bobKey = bob.generateKeys()
// Trocar e gerar o segredo...
const aliceSecret = alice.computeSecret(bobKey)
const bobSecret = bob.computeSecret(aliceKey)
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'))
// OK
Método estático: ECDH.convertKey(key, curve[, inputEncoding[, outputEncoding[, format]]])
Adicionado em: v10.0.0
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>curve
<string>inputEncoding
<string> A codificação da stringkey
.outputEncoding
<string> A codificação do valor de retorno.format
<string> Padrão:'uncompressed'
- Retorna: <Buffer> | <string>
Converte a chave pública EC Diffie-Hellman especificada por key
e curve
para o formato especificado por format
. O argumento format
especifica a codificação do ponto e pode ser 'compressed'
, 'uncompressed'
ou 'hybrid'
. A chave fornecida é interpretada usando o inputEncoding
especificado, e a chave retornada é codificada usando o outputEncoding
especificado.
Use crypto.getCurves()
para obter uma lista dos nomes de curvas disponíveis. Em versões recentes do OpenSSL, openssl ecparam -list_curves
também exibirá o nome e a descrição de cada curva elíptica disponível.
Se format
não for especificado, o ponto será retornado no formato 'uncompressed'
.
Se o inputEncoding
não for fornecido, espera-se que key
seja um Buffer
, TypedArray
ou DataView
.
Exemplo (descompactando uma chave):
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')
// A chave convertida e a chave pública descompactada devem ser iguais
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')
// A chave convertida e a chave pública descompactada devem ser iguais
console.log(uncompressedKey === ecdh.getPublicKey('hex'))
ecdh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v10.0.0 | Formato de erro alterado para melhor suportar erro de chave pública inválida. |
v6.0.0 | O inputEncoding padrão foi alterado de binary para utf8 . |
v0.11.14 | Adicionado em: v0.11.14 |
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação da stringotherPublicKey
.outputEncoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Calcula o segredo compartilhado usando otherPublicKey
como a chave pública da outra parte e retorna o segredo compartilhado calculado. A chave fornecida é interpretada usando inputEncoding
especificado, e o segredo retornado é codificado usando o outputEncoding
especificado. Se o inputEncoding
não for fornecido, espera-se que otherPublicKey
seja um Buffer
, TypedArray
ou DataView
.
Se outputEncoding
receber uma string, uma string será retornada; caso contrário, um Buffer
é retornado.
ecdh.computeSecret
lançará um erro ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
quando otherPublicKey
estiver fora da curva elíptica. Como otherPublicKey
é geralmente fornecido por um usuário remoto em uma rede não segura, certifique-se de lidar com essa exceção adequadamente.
ecdh.generateKeys([encoding[, format]])
Adicionado em: v0.11.14
encoding
<string> A codificação do valor de retorno.format
<string> Padrão:'uncompressed'
- Retorna: <Buffer> | <string>
Gera valores de chave privada e pública EC Diffie-Hellman e retorna a chave pública no format
e encoding
especificados. Esta chave deve ser transferida para a outra parte.
O argumento format
especifica a codificação de ponto e pode ser 'compressed'
ou 'uncompressed'
. Se format
não for especificado, o ponto será retornado no formato 'uncompressed'
.
Se encoding
for fornecido, uma string é retornada; caso contrário, um Buffer
é retornado.
ecdh.getPrivateKey([encoding])
Adicionado em: v0.11.14
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string> O EC Diffie-Hellman no
encoding
especificado.
Se encoding
for especificado, uma string será retornada; caso contrário, um Buffer
será retornado.
ecdh.getPublicKey([encoding][, format])
Adicionado em: v0.11.14
encoding
<string> A codificação do valor de retorno.format
<string> Padrão:'uncompressed'
- Retorna: <Buffer> | <string> A chave pública EC Diffie-Hellman no
encoding
eformat
especificados.
O argumento format
especifica a codificação de ponto e pode ser 'compressed'
ou 'uncompressed'
. Se format
não for especificado, o ponto será retornado no formato 'uncompressed'
.
Se encoding
for especificado, uma string será retornada; caso contrário, um Buffer
será retornado.
ecdh.setPrivateKey(privateKey[, encoding])
Adicionado em: v0.11.14
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringprivateKey
.
Define a chave privada EC Diffie-Hellman. Se encoding
for fornecido, espera-se que privateKey
seja uma string; caso contrário, espera-se que privateKey
seja um Buffer
, TypedArray
ou DataView
.
Se privateKey
não for válida para a curva especificada quando o objeto ECDH
foi criado, um erro será lançado. Ao definir a chave privada, o ponto público (chave) associado também é gerado e definido no objeto ECDH
.
ecdh.setPublicKey(publicKey[, encoding])
Adicionado em: v0.11.14
Obsoleto desde: v5.2.0
[Estável: 0 - Obsoleto]
Estável: 0 Estabilidade: 0 - Obsoleto
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da stringpublicKey
.
Define a chave pública EC Diffie-Hellman. Se encoding
for fornecido, espera-se que publicKey
seja uma string; caso contrário, espera-se um Buffer
, TypedArray
ou DataView
.
Normalmente, não há razão para chamar este método, porque ECDH
requer apenas uma chave privada e a chave pública da outra parte para calcular o segredo compartilhado. Normalmente, ecdh.generateKeys()
ou ecdh.setPrivateKey()
serão chamados. O método ecdh.setPrivateKey()
tenta gerar o ponto/chave pública associada à chave privada que está sendo definida.
Exemplo (obtendo um segredo compartilhado):
const { createECDH, createHash } = await import('node:crypto')
const alice = createECDH('secp256k1')
const bob = createECDH('secp256k1')
// Esta é uma forma abreviada de especificar uma das chaves privadas
// anteriores de Alice. Não seria sensato usar uma chave privada tão
// previsível em uma aplicação real.
alice.setPrivateKey(createHash('sha256').update('alice', 'utf8').digest())
// Bob usa um novo par de chaves pseudorrandômicas criptograficamente
// forte
bob.generateKeys()
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex')
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex')
// aliceSecret e bobSecret devem ser o mesmo valor secreto compartilhado
console.log(aliceSecret === bobSecret)
const { createECDH, createHash } = require('node:crypto')
const alice = createECDH('secp256k1')
const bob = createECDH('secp256k1')
// Esta é uma forma abreviada de especificar uma das chaves privadas
// anteriores de Alice. Não seria sensato usar uma chave privada tão
// previsível em uma aplicação real.
alice.setPrivateKey(createHash('sha256').update('alice', 'utf8').digest())
// Bob usa um novo par de chaves pseudorrandômicas criptograficamente
// forte
bob.generateKeys()
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex')
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex')
// aliceSecret e bobSecret devem ser o mesmo valor secreto compartilhado
console.log(aliceSecret === bobSecret)
Classe: Hash
Adicionado em: v0.1.92
- Estende: <stream.Transform>
A classe Hash
é uma utilidade para criar resumos de hash de dados. Ela pode ser usada de duas maneiras:
- Como um stream que é tanto legível quanto gravável, onde os dados são gravados para produzir um resumo de hash computado no lado legível, ou
- Usando os métodos
hash.update()
ehash.digest()
para produzir o hash computado.
O método crypto.createHash()
é usado para criar instâncias de Hash
. Objetos Hash
não devem ser criados diretamente usando a palavra-chave new
.
Exemplo: Usando objetos Hash
como streams:
const { createHash } = await import('node:crypto')
const hash = createHash('sha256')
hash.on('readable', () => {
// Apenas um elemento será produzido pelo
// stream de hash.
const data = hash.read()
if (data) {
console.log(data.toString('hex'))
// Imprime:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
})
hash.write('some data to hash')
hash.end()
const { createHash } = require('node:crypto')
const hash = createHash('sha256')
hash.on('readable', () => {
// Apenas um elemento será produzido pelo
// stream de hash.
const data = hash.read()
if (data) {
console.log(data.toString('hex'))
// Imprime:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
})
hash.write('some data to hash')
hash.end()
Exemplo: Usando Hash
e streams encadeados:
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)
Exemplo: Usando os métodos hash.update()
e hash.digest()
:
const { createHash } = await import('node:crypto')
const hash = createHash('sha256')
hash.update('some data to hash')
console.log(hash.digest('hex'))
// Imprime:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
const { createHash } = require('node:crypto')
const hash = createHash('sha256')
hash.update('some data to hash')
console.log(hash.digest('hex'))
// Imprime:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
hash.copy([options])
Adicionado em: v13.1.0
options
<Objeto> Opções destream.transform
- Retorna: <Hash>
Cria um novo objeto Hash
que contém uma cópia profunda do estado interno do objeto Hash
atual.
O argumento opcional options
controla o comportamento do fluxo. Para funções de hash XOF como 'shake256'
, a opção outputLength
pode ser usada para especificar o tamanho de saída desejado em bytes.
Um erro é lançado quando uma tentativa é feita para copiar o objeto Hash
depois que seu método hash.digest()
foi chamado.
// Calcular um hash rotativo.
const { createHash } = await import('node:crypto')
const hash = createHash('sha256')
hash.update('one')
console.log(hash.copy().digest('hex'))
hash.update('two')
console.log(hash.copy().digest('hex'))
hash.update('three')
console.log(hash.copy().digest('hex'))
// Etc.
// Calcular um hash rotativo.
const { createHash } = require('node:crypto')
const hash = createHash('sha256')
hash.update('one')
console.log(hash.copy().digest('hex'))
hash.update('two')
console.log(hash.copy().digest('hex'))
hash.update('three')
console.log(hash.copy().digest('hex'))
// Etc.
hash.digest([encoding])
Adicionado em: v0.1.92
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Calcula o resumo de todos os dados passados para serem hash (usando o método hash.update()
). Se encoding
for fornecido, uma string será retornada; caso contrário, um Buffer
é retornado.
O objeto Hash
não pode ser usado novamente depois que o método hash.digest()
foi chamado. Várias chamadas farão com que um erro seja lançado.
hash.update(data[, inputEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v6.0.0 | O inputEncoding padrão mudou de binary para utf8 . |
v0.1.92 | Adicionado em: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação da stringdata
.
Atualiza o conteúdo do hash com o data
fornecido, cuja codificação é fornecida em inputEncoding
. Se encoding
não for fornecido, e o data
for uma string, uma codificação de 'utf8'
é aplicada. Se data
for um Buffer
, TypedArray
ou DataView
, então inputEncoding
é ignorado.
Isso pode ser chamado várias vezes com novos dados, pois ele é transmitido.
Classe: Hmac
Adicionado em: v0.1.94
- Estende: <stream.Transform>
A classe Hmac
é uma utilidade para criar resumos HMAC criptográficos. Ele pode ser usado de duas maneiras:
- Como um stream que é legível e gravável, onde os dados são escritos para produzir um resumo HMAC calculado no lado legível, ou
- Usando os métodos
hmac.update()
ehmac.digest()
para produzir o resumo HMAC calculado.
O método crypto.createHmac()
é usado para criar instâncias de Hmac
. Objetos Hmac
não devem ser criados diretamente usando a palavra-chave new
.
Exemplo: Usando objetos Hmac
como streams:
const { createHmac } = await import('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.on('readable', () => {
// Apenas um elemento será produzido pelo
// fluxo de hash.
const data = hmac.read()
if (data) {
console.log(data.toString('hex'))
// Imprime:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
})
hmac.write('alguns dados para hash')
hmac.end()
const { createHmac } = require('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.on('readable', () => {
// Apenas um elemento será produzido pelo
// fluxo de hash.
const data = hmac.read()
if (data) {
console.log(data.toString('hex'))
// Imprime:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
})
hmac.write('alguns dados para hash')
hmac.end()
Exemplo: Usando Hmac
e streams encadeados:
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)
Exemplo: Usando os métodos hmac.update()
e hmac.digest()
:
const { createHmac } = await import('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.update('alguns dados para hash')
console.log(hmac.digest('hex'))
// Imprime:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
const { createHmac } = require('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.update('alguns dados para hash')
console.log(hmac.digest('hex'))
// Imprime:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
hmac.digest([encoding])
Adicionado em: v0.1.94
encoding
<string> A codificação do valor de retorno.- Retorna: <Buffer> | <string>
Calcula o resumo HMAC de todos os dados passados usando hmac.update()
. Se encoding
for fornecida, uma string será retornada; caso contrário, um Buffer
é retornado;
O objeto Hmac
não pode ser usado novamente após hmac.digest()
ter sido chamado. Várias chamadas para hmac.digest()
resultarão em um erro sendo lançado.
hmac.update(data[, inputEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v6.0.0 | A inputEncoding padrão mudou de binary para utf8 . |
v0.1.94 | Adicionado em: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação da stringdata
.
Atualiza o conteúdo Hmac
com os dados fornecidos em data
, cuja codificação é fornecida em inputEncoding
. Se encoding
não for fornecida e os data
forem uma string, uma codificação de 'utf8'
será imposta. Se data
for um Buffer
, TypedArray
ou DataView
, inputEncoding
será ignorado.
Isso pode ser chamado várias vezes com novos dados à medida que são transmitidos.
Classe: KeyObject
[Histórico]
Versão | Mudanças |
---|---|
v14.5.0, v12.19.0 | Instâncias desta classe agora podem ser passadas para threads de trabalho usando postMessage . |
v11.13.0 | Esta classe agora é exportada. |
v11.6.0 | Adicionado em: v11.6.0 |
O Node.js usa uma classe KeyObject
para representar uma chave simétrica ou assimétrica, e cada tipo de chave expõe funções diferentes. Os métodos crypto.createSecretKey()
, crypto.createPublicKey()
e crypto.createPrivateKey()
são usados para criar instâncias KeyObject
. Os objetos KeyObject
não devem ser criados diretamente usando a palavra-chave new
.
A maioria dos aplicativos deve considerar o uso da nova API KeyObject
em vez de passar chaves como strings ou Buffer
s devido aos recursos de segurança aprimorados.
Instâncias de KeyObject
podem ser passadas para outros threads por meio de postMessage()
. O receptor obtém um KeyObject
clonado e o KeyObject
não precisa ser listado no argumento transferList
.
Método estático: KeyObject.from(key)
Adicionado em: v15.0.0
key
<CryptoKey>- Retorna: <KeyObject>
Exemplo: Convertendo uma instância CryptoKey
para um 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)
// Imprime: 32 (tamanho da chave simétrica em bytes)
const { KeyObject } = require('node:crypto')
const { subtle } = globalThis.crypto
;(async function () {
const key = await subtle.generateKey(
{
name: 'HMAC',
hash: 'SHA-256',
length: 256,
},
true,
['sign', 'verify']
)
const keyObject = KeyObject.from(key)
console.log(keyObject.symmetricKeySize)
// Imprime: 32 (tamanho da chave simétrica em bytes)
})()
keyObject.asymmetricKeyDetails
[Histórico]
Versão | Alterações |
---|---|
v16.9.0 | Expõe parâmetros de sequência RSASSA-PSS-params para chaves RSA-PSS. |
v15.7.0 | Adicionado em: v15.7.0 |
- <Object>
modulusLength
: <number> Tamanho da chave em bits (RSA, DSA).publicExponent
: <bigint> Expoente público (RSA).hashAlgorithm
: <string> Nome do resumo da mensagem (RSA-PSS).mgf1HashAlgorithm
: <string> Nome do resumo da mensagem usado pelo MGF1 (RSA-PSS).saltLength
: <number> Tamanho mínimo do salt em bytes (RSA-PSS).divisorLength
: <number> Tamanho deq
em bits (DSA).namedCurve
: <string> Nome da curva (EC).
Esta propriedade existe apenas em chaves assimétricas. Dependendo do tipo da chave, este objeto contém informações sobre a chave. Nenhuma das informações obtidas através desta propriedade pode ser usada para identificar uma chave de forma única ou para comprometer a segurança da chave.
Para chaves RSA-PSS, se o material da chave contiver uma sequência RSASSA-PSS-params
, as propriedades hashAlgorithm
, mgf1HashAlgorithm
e saltLength
serão definidas.
Outros detalhes da chave podem ser expostos através desta API usando atributos adicionais.
keyObject.asymmetricKeyType
[Histórico]
Versão | Mudanças |
---|---|
v13.9.0, v12.17.0 | Adicionado suporte para 'dh' . |
v12.0.0 | Adicionado suporte para 'rsa-pss' . |
v12.0.0 | Esta propriedade agora retorna undefined para instâncias KeyObject de tipo não reconhecido em vez de abortar. |
v12.0.0 | Adicionado suporte para 'x25519' e 'x448' . |
v12.0.0 | Adicionado suporte para 'ed25519' e 'ed448' . |
v11.6.0 | Adicionado em: v11.6.0 |
Para chaves assimétricas, esta propriedade representa o tipo da chave. Os tipos de chave suportados são:
'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)
Esta propriedade é undefined
para tipos KeyObject
não reconhecidos e chaves simétricas.
keyObject.equals(otherKeyObject)
Adicionado em: v17.7.0, v16.15.0
otherKeyObject
: <KeyObject> UmKeyObject
com o qual compararkeyObject
.- Retorna: <boolean>
Retorna true
ou false
dependendo se as chaves têm exatamente o mesmo tipo, valor e parâmetros. Este método não é de tempo constante.
keyObject.export([options])
[Histórico]
Versão | Mudanças |
---|---|
v15.9.0 | Adicionado suporte para formato 'jwk' . |
v11.6.0 | Adicionado em: v11.6.0 |
Para chaves simétricas, as seguintes opções de codificação podem ser usadas:
format
: <string> Deve ser'buffer'
(padrão) ou'jwk'
.
Para chaves públicas, as seguintes opções de codificação podem ser usadas:
type
: <string> Deve ser um de'pkcs1'
(apenas RSA) ou'spki'
.format
: <string> Deve ser'pem'
,'der'
, ou'jwk'
.
Para chaves privadas, as seguintes opções de codificação podem ser usadas:
type
: <string> Deve ser um de'pkcs1'
(apenas RSA),'pkcs8'
ou'sec1'
(apenas EC).format
: <string> Deve ser'pem'
,'der'
, ou'jwk'
.cipher
: <string> Se especificado, a chave privada será criptografada com acipher
e apassphrase
fornecidas usando a criptografia baseada em senha PKCS#5 v2.0.passphrase
: <string> | <Buffer> A senha a ser usada para criptografia, consultecipher
.
O tipo de resultado depende do formato de codificação selecionado, quando PEM o resultado é uma string, quando DER será um buffer contendo os dados codificados como DER, quando JWK será um objeto.
Quando o formato de codificação JWK foi selecionado, todas as outras opções de codificação são ignoradas.
Chaves do tipo PKCS#1, SEC1 e PKCS#8 podem ser criptografadas usando uma combinação das opções cipher
e format
. O type
PKCS#8 pode ser usado com qualquer format
para criptografar qualquer algoritmo de chave (RSA, EC ou DH) especificando um cipher
. PKCS#1 e SEC1 só podem ser criptografados especificando um cipher
quando o format
PEM é usado. Para máxima compatibilidade, use PKCS#8 para chaves privadas criptografadas. Como o PKCS#8 define seu próprio mecanismo de criptografia, a criptografia no nível PEM não é suportada ao criptografar uma chave PKCS#8. Consulte RFC 5208 para criptografia PKCS#8 e RFC 1421 para criptografia PKCS#1 e SEC1.
keyObject.symmetricKeySize
Adicionado em: v11.6.0
Para chaves secretas, esta propriedade representa o tamanho da chave em bytes. Esta propriedade é undefined
para chaves assimétricas.
keyObject.toCryptoKey(algorithm, extractable, keyUsages)
Adicionado em: v23.0.0
algorithm
: <AlgorithmIdentifier> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>extractable
: <boolean>keyUsages
: <string[]> Consulte Usos da chave.Retorna: <CryptoKey>
Converte uma instância KeyObject
para um CryptoKey
.
keyObject.type
Adicionado em: v11.6.0
Dependendo do tipo deste KeyObject
, esta propriedade é 'secret'
para chaves secretas (simétricas), 'public'
para chaves públicas (assimétricas) ou 'private'
para chaves privadas (assimétricas).
Classe: Sign
Adicionado em: v0.1.92
- Estende: <stream.Writable>
A classe Sign
é uma utilidade para gerar assinaturas. Ela pode ser usada de duas maneiras:
- Como um stream gravável, onde os dados a serem assinados são escritos e o método
sign.sign()
é usado para gerar e retornar a assinatura, ou - Usando os métodos
sign.update()
esign.sign()
para produzir a assinatura.
O método crypto.createSign()
é usado para criar instâncias de Sign
. O argumento é o nome da string da função hash a ser usada. Os objetos Sign
não devem ser criados diretamente usando a palavra-chave new
.
Exemplo: Usando objetos Sign
e Verify
como streams:
const { generateKeyPairSync, createSign, createVerify } = await import('node:crypto')
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
})
const sign = createSign('SHA256')
sign.write('alguns dados para assinar')
sign.end()
const signature = sign.sign(privateKey, 'hex')
const verify = createVerify('SHA256')
verify.write('alguns dados para assinar')
verify.end()
console.log(verify.verify(publicKey, signature, 'hex'))
// Imprime: true
const { generateKeyPairSync, createSign, createVerify } = require('node:crypto')
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
})
const sign = createSign('SHA256')
sign.write('alguns dados para assinar')
sign.end()
const signature = sign.sign(privateKey, 'hex')
const verify = createVerify('SHA256')
verify.write('alguns dados para assinar')
verify.end()
console.log(verify.verify(publicKey, signature, 'hex'))
// Imprime: true
Exemplo: Usando os métodos sign.update()
e verify.update()
:
const { generateKeyPairSync, createSign, createVerify } = await import('node:crypto')
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
})
const sign = createSign('SHA256')
sign.update('alguns dados para assinar')
sign.end()
const signature = sign.sign(privateKey)
const verify = createVerify('SHA256')
verify.update('alguns dados para assinar')
verify.end()
console.log(verify.verify(publicKey, signature))
// Imprime: true
const { generateKeyPairSync, createSign, createVerify } = require('node:crypto')
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
})
const sign = createSign('SHA256')
sign.update('alguns dados para assinar')
sign.end()
const signature = sign.sign(privateKey)
const verify = createVerify('SHA256')
verify.update('alguns dados para assinar')
verify.end()
console.log(verify.verify(publicKey, signature))
// Imprime: true
sign.sign(privateKey[, outputEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | A privateKey também pode ser um ArrayBuffer e CryptoKey. |
v13.2.0, v12.16.0 | Esta função agora suporta assinaturas IEEE-P1363 DSA e ECDSA. |
v12.0.0 | Esta função agora suporta chaves RSA-PSS. |
v11.6.0 | Esta função agora suporta objetos de chave. |
v8.0.0 | Foi adicionado suporte para RSASSA-PSS e opções adicionais. |
v0.1.92 | Adicionado em: v0.1.92 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>outputEncoding
<string> A codificação do valor de retorno.
Calcula a assinatura em todos os dados passados usando sign.update()
ou sign.write()
.
Se privateKey
não for um KeyObject
, esta função se comporta como se privateKey
tivesse sido passado para crypto.createPrivateKey()
. Se for um objeto, as seguintes propriedades adicionais podem ser passadas:
dsaEncoding
<string> Para DSA e ECDSA, esta opção especifica o formato da assinatura gerada. Pode ser um dos seguintes:'der'
(padrão): Estrutura de assinatura ASN.1 codificada em DER codificando(r, s)
.'ieee-p1363'
: Formato de assinaturar || s
conforme proposto em IEEE-P1363.
padding
<integer> Valor de preenchimento opcional para RSA, um dos seguintes:crypto.constants.RSA_PKCS1_PADDING
(padrão)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
usará MGF1 com a mesma função hash usada para assinar a mensagem, conforme especificado na seção 3.1 de RFC 4055, a menos que uma função hash MGF1 tenha sido especificada como parte da chave em conformidade com a seção 3.3 de RFC 4055.
saltLength
<integer> Comprimento do salt para quando o preenchimento éRSA_PKCS1_PSS_PADDING
. O valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
define o comprimento do salt para o tamanho do resumo,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(padrão) define para o valor máximo permitido.
Se outputEncoding
for fornecido, uma string será retornada; caso contrário, um Buffer
será retornado.
O objeto Sign
não pode ser usado novamente depois que o método sign.sign()
for chamado. Múltiplas chamadas para sign.sign()
resultarão em um erro sendo lançado.
sign.update(data[, inputEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v6.0.0 | O inputEncoding padrão mudou de binary para utf8 . |
v0.1.92 | Adicionado em: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação da stringdata
.
Atualiza o conteúdo Sign
com os data
fornecidos, cuja codificação é fornecida em inputEncoding
. Se encoding
não for fornecido e o data
for uma string, uma codificação de 'utf8'
é aplicada. Se data
for um Buffer
, TypedArray
ou DataView
, então inputEncoding
será ignorado.
Isso pode ser chamado várias vezes com novos dados à medida que são transmitidos.
Classe: Verify
Adicionado em: v0.1.92
- Estende: <stream.Writable>
A classe Verify
é um utilitário para verificar assinaturas. Ele pode ser usado de duas maneiras:
- Como um stream gravável onde os dados gravados são usados para validar em relação à assinatura fornecida, ou
- Usando os métodos
verify.update()
everify.verify()
para verificar a assinatura.
O método crypto.createVerify()
é usado para criar instâncias Verify
. Objetos Verify
não devem ser criados diretamente usando a palavra-chave new
.
Veja Sign
para exemplos.
verify.update(data[, inputEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v6.0.0 | O inputEncoding padrão mudou de binary para utf8 . |
v0.1.92 | Adicionado em: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> A codificação da stringdata
.
Atualiza o conteúdo Verify
com os data
fornecidos, cuja codificação é fornecida em inputEncoding
. Se inputEncoding
não for fornecido e o data
for uma string, uma codificação de 'utf8'
é aplicada. Se data
for um Buffer
, TypedArray
ou DataView
, então inputEncoding
será ignorado.
Isso pode ser chamado várias vezes com novos dados à medida que são transmitidos.
verify.verify(object, signature[, signatureEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | O objeto também pode ser um ArrayBuffer e CryptoKey. |
v13.2.0, v12.16.0 | Esta função agora suporta assinaturas IEEE-P1363 DSA e ECDSA. |
v12.0.0 | Esta função agora suporta chaves RSA-PSS. |
v11.7.0 | A chave agora pode ser uma chave privada. |
v8.0.0 | Foi adicionado suporte para RSASSA-PSS e opções adicionais. |
v0.1.92 | Adicionado em: v0.1.92 |
object
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>signatureEncoding
<string> A codificação da stringsignature
.Retorna: <boolean>
true
oufalse
dependendo da validade da assinatura para os dados e chave pública.
Verifica os dados fornecidos usando o object
e a signature
fornecidos.
Se object
não for um KeyObject
, esta função se comporta como se object
tivesse sido passado para crypto.createPublicKey()
. Se for um objeto, as seguintes propriedades adicionais podem ser passadas:
dsaEncoding
<string> Para DSA e ECDSA, esta opção especifica o formato da assinatura. Pode ser um dos seguintes:'der'
(padrão): estrutura de assinatura ASN.1 codificada em DER codificando(r, s)
.'ieee-p1363'
: Formato de assinaturar || s
conforme proposto em IEEE-P1363.
padding
<inteiro> Valor de preenchimento opcional para RSA, um dos seguintes:crypto.constants.RSA_PKCS1_PADDING
(padrão)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
usará MGF1 com a mesma função hash usada para verificar a mensagem, conforme especificado na seção 3.1 do RFC 4055, a menos que uma função hash MGF1 tenha sido especificada como parte da chave em conformidade com a seção 3.3 do RFC 4055.
saltLength
<inteiro> Comprimento do salt para quando o padding forRSA_PKCS1_PSS_PADDING
. O valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
define o comprimento do salt para o tamanho do digest,crypto.constants.RSA_PSS_SALTLEN_AUTO
(padrão) faz com que ele seja determinado automaticamente.
O argumento signature
é a assinatura previamente calculada para os dados, na signatureEncoding
. Se uma signatureEncoding
for especificada, espera-se que a signature
seja uma string; caso contrário, espera-se que signature
seja um Buffer
, TypedArray
ou DataView
.
O objeto verify
não pode ser usado novamente depois que verify.verify()
for chamado. Várias chamadas para verify.verify()
resultarão em um erro sendo lançado.
Como as chaves públicas podem ser derivadas de chaves privadas, uma chave privada pode ser passada em vez de uma chave pública.
Classe: X509Certificate
Adicionado em: v15.6.0
Encapsula um certificado X509 e fornece acesso somente leitura às suas informações.
const { X509Certificate } = await import('node:crypto')
const x509 = new X509Certificate('{... certificado codificado em pem ...}')
console.log(x509.subject)
const { X509Certificate } = require('node:crypto')
const x509 = new X509Certificate('{... certificado codificado em pem ...}')
console.log(x509.subject)
new X509Certificate(buffer)
Adicionado em: v15.6.0
buffer
<string> | <TypedArray> | <Buffer> | <DataView> Um certificado X509 codificado em PEM ou DER.
x509.ca
Adicionado em: v15.6.0
- Tipo: <boolean> Será
true
se este for um certificado de Autoridade de Certificação (CA).
x509.checkEmail(email[, options])
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | A opção subject agora usa como padrão 'default' . |
v17.5.0, v16.15.0 | A opção subject agora pode ser definida como 'default' . |
v17.5.0, v16.14.1 | As opções wildcards , partialWildcards , multiLabelWildcards e singleLabelSubdomains foram removidas, pois não tinham efeito. |
v15.6.0 | Adicionado em: v15.6.0 |
email
<string>options
<Object>subject
<string>'default'
,'always'
ou'never'
. Padrão:'default'
.
Retorna: <string> | <undefined> Retorna
email
se o certificado corresponder,undefined
se não corresponder.
Verifica se o certificado corresponde ao endereço de email fornecido.
Se a opção 'subject'
não estiver definida ou estiver definida como 'default'
, o assunto do certificado só será considerado se a extensão de nome alternativo do assunto não existir ou não contiver nenhum endereço de email.
Se a opção 'subject'
estiver definida como 'always'
e se a extensão de nome alternativo do assunto não existir ou não contiver um endereço de email correspondente, o assunto do certificado será considerado.
Se a opção 'subject'
estiver definida como 'never'
, o assunto do certificado nunca será considerado, mesmo que o certificado não contenha nomes alternativos de assunto.
x509.checkHost(name[, options])
[Histórico]
Versão | Alterações |
---|---|
v18.0.0 | A opção subject agora tem como padrão 'default' . |
v17.5.0, v16.15.0 | A opção subject agora pode ser definida como 'default' . |
v15.6.0 | Adicionado em: v15.6.0 |
name
<string>options
<Object>Retorna: <string> | <undefined> Retorna um nome de assunto que corresponde a
name
, ouundefined
se nenhum nome de assunto corresponder aname
.
Verifica se o certificado corresponde ao nome de host fornecido.
Se o certificado corresponder ao nome de host fornecido, o nome do assunto correspondente será retornado. O nome retornado pode ser uma correspondência exata (por exemplo, foo.example.com
) ou pode conter curingas (por exemplo, *.example.com
). Como as comparações de nome de host não diferenciam maiúsculas de minúsculas, o nome do assunto retornado também pode ser diferente do name
fornecido em capitalização.
Se a opção 'subject'
for indefinida ou definida como 'default'
, o assunto do certificado só será considerado se a extensão de nome alternativo do assunto não existir ou não contiver nenhum nome DNS. Esse comportamento é consistente com RFC 2818 ("HTTP Over TLS").
Se a opção 'subject'
estiver definida como 'always'
e se a extensão de nome alternativo do assunto não existir ou não contiver um nome DNS correspondente, o assunto do certificado será considerado.
Se a opção 'subject'
estiver definida como 'never'
, o assunto do certificado nunca será considerado, mesmo que o certificado não contenha nomes alternativos de assunto.
x509.checkIP(ip)
[Histórico]
Versão | Mudanças |
---|---|
v17.5.0, v16.14.1 | O argumento options foi removido, pois não tinha efeito. |
v15.6.0 | Adicionado em: v15.6.0 |
ip
<string>- Retorna: <string> | <undefined> Retorna
ip
se o certificado corresponder,undefined
caso contrário.
Verifica se o certificado corresponde ao endereço IP fornecido (IPv4 ou IPv6).
Apenas os nomes alternativos de assunto iPAddress
da RFC 5280 são considerados e devem corresponder exatamente ao endereço ip
fornecido. Outros nomes alternativos de assunto, bem como o campo de assunto do certificado, são ignorados.
x509.checkIssued(otherCert)
Adicionado em: v15.6.0
otherCert
<X509Certificate>- Retorna: <boolean>
Verifica se este certificado foi emitido pelo otherCert
fornecido.
x509.checkPrivateKey(privateKey)
Adicionado em: v15.6.0
privateKey
<KeyObject> Uma chave privada.- Retorna: <boolean>
Verifica se a chave pública para este certificado é consistente com a chave privada fornecida.
x509.extKeyUsage
Adicionado em: v15.6.0
- Tipo: <string[]>
Um array detalhando os usos estendidos de chave para este certificado.
x509.fingerprint
Adicionado em: v15.6.0
- Tipo: <string>
A impressão digital SHA-1 deste certificado.
Como o SHA-1 está criptograficamente quebrado e porque a segurança do SHA-1 é significativamente pior do que a dos algoritmos que são comumente usados para assinar certificados, considere usar x509.fingerprint256
em vez disso.
x509.fingerprint256
Adicionado em: v15.6.0
- Tipo: <string>
A impressão digital SHA-256 deste certificado.
x509.fingerprint512
Adicionado em: v17.2.0, v16.14.0
- Tipo: <string>
A impressão digital SHA-512 deste certificado.
Como computar a impressão digital SHA-256 geralmente é mais rápido e porque tem apenas metade do tamanho da impressão digital SHA-512, x509.fingerprint256
pode ser uma escolha melhor. Enquanto SHA-512 presumivelmente fornece um nível mais alto de segurança em geral, a segurança de SHA-256 corresponde à da maioria dos algoritmos que são comumente usados para assinar certificados.
x509.infoAccess
[Histórico]
Versão | Mudanças |
---|---|
v17.3.1, v16.13.2 | Partes desta string podem ser codificadas como literais de string JSON em resposta ao CVE-2021-44532. |
v15.6.0 | Adicionado em: v15.6.0 |
- Tipo: <string>
Uma representação textual da extensão de acesso à informação da autoridade do certificado.
Esta é uma lista separada por quebras de linha de descrições de acesso. Cada linha começa com o método de acesso e o tipo de local de acesso, seguido por dois pontos e o valor associado ao local de acesso.
Após o prefixo que denota o método de acesso e o tipo do local de acesso, o restante de cada linha pode estar entre aspas para indicar que o valor é um literal de string JSON. Para compatibilidade com versões anteriores, o Node.js usa literais de string JSON nesta propriedade apenas quando necessário para evitar ambiguidade. O código de terceiros deve estar preparado para lidar com ambos os formatos de entrada possíveis.
x509.issuer
Adicionado em: v15.6.0
- Tipo: <string>
A identificação do emissor incluída neste certificado.
x509.issuerCertificate
Adicionado em: v15.9.0
- Tipo: <X509Certificate>
O certificado do emissor ou undefined
se o certificado do emissor não estiver disponível.
x509.publicKey
Adicionado em: v15.6.0
- Tipo: <KeyObject>
A chave pública <KeyObject> para este certificado.
x509.raw
Adicionado em: v15.6.0
- Tipo: <Buffer>
Um Buffer
contendo a codificação DER deste certificado.
x509.serialNumber
Adicionado em: v15.6.0
- Tipo: <string>
O número de série deste certificado.
Os números de série são atribuídos por autoridades de certificação e não identificam certificados de forma única. Considere usar x509.fingerprint256
como um identificador único.
x509.subject
Adicionado em: v15.6.0
- Tipo: <string>
O sujeito completo deste certificado.
x509.subjectAltName
[Histórico]
Versão | Mudanças |
---|---|
v17.3.1, v16.13.2 | Partes desta string podem ser codificadas como literais de string JSON em resposta a CVE-2021-44532. |
v15.6.0 | Adicionado em: v15.6.0 |
- Tipo: <string>
O nome alternativo do sujeito especificado para este certificado.
Esta é uma lista de nomes alternativos de sujeito separados por vírgulas. Cada entrada começa com uma string identificando o tipo do nome alternativo do sujeito seguido por dois pontos e o valor associado à entrada.
Versões anteriores do Node.js assumiam incorretamente que era seguro dividir esta propriedade na sequência de dois caracteres ', '
(ver CVE-2021-44532). No entanto, certificados maliciosos e legítimos podem conter nomes alternativos de sujeito que incluem esta sequência quando representados como uma string.
Após o prefixo que denota o tipo da entrada, o restante de cada entrada pode ser incluído em aspas para indicar que o valor é um literal de string JSON. Para compatibilidade com versões anteriores, o Node.js só usa literais de string JSON dentro desta propriedade quando necessário para evitar ambiguidade. O código de terceiros deve estar preparado para lidar com os dois formatos de entrada possíveis.
x509.toJSON()
Adicionado em: v15.6.0
- Tipo: <string>
Não existe uma codificação JSON padrão para certificados X509. O método toJSON()
retorna uma string contendo o certificado codificado em PEM.
x509.toLegacyObject()
Adicionado em: v15.6.0
- Tipo: <Object>
Retorna informações sobre este certificado usando a codificação legado de objeto de certificado.
x509.toString()
Adicionado em: v15.6.0
- Tipo: <string>
Retorna o certificado codificado em PEM.
x509.validFrom
Adicionado em: v15.6.0
- Tipo: <string>
A data/hora a partir da qual este certificado é válido.
x509.validFromDate
Adicionado em: v23.0.0
- Tipo: <Date>
A data/hora a partir da qual este certificado é válido, encapsulada em um objeto Date
.
x509.validTo
Adicionado em: v15.6.0
- Tipo: <string>
A data/hora até a qual este certificado é válido.
x509.validToDate
Adicionado em: v23.0.0
- Tipo: <Date>
A data/hora até a qual este certificado é válido, encapsulada em um objeto Date
.
x509.verify(publicKey)
Adicionado em: v15.6.0
publicKey
<KeyObject> Uma chave pública.- Retorna: <boolean>
Verifica se este certificado foi assinado pela chave pública fornecida. Não realiza nenhuma outra verificação de validação no certificado.
Métodos e propriedades do módulo node:crypto
crypto.checkPrime(candidate[, options], callback)
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v15.8.0 | Adicionado em: v15.8.0 |
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> Um possível número primo codificado como uma sequência de octetos big endian de comprimento arbitrário.options
<Object>checks
<number> O número de iterações probabilísticas de primalidade de Miller-Rabin a serem realizadas. Quando o valor é0
(zero), um número de verificações é usado que produz uma taxa de falso positivo de no máximo 2 para entrada aleatória. Deve-se ter cuidado ao selecionar um número de verificações. Consulte a documentação OpenSSL para as opçõesnchecks
da funçãoBN_is_prime_ex
para mais detalhes. Padrão:0
callback
<Function>
Verifica a primalidade do candidate
.
crypto.checkPrimeSync(candidate[, options])
Adicionado em: v15.8.0
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> Um possível número primo codificado como uma sequência de octetos big endian de comprimento arbitrário.options
<Object>checks
<number> O número de iterações de primalidade probabilística de Miller-Rabin a serem executadas. Quando o valor é0
(zero), um número de verificações é usado que produz uma taxa de falso positivo de no máximo 2 para entrada aleatória. Deve-se ter cuidado ao selecionar um número de verificações. Consulte a documentação do OpenSSL para as opçõesnchecks
da funçãoBN_is_prime_ex
para mais detalhes. Padrão:0
Retorna: <boolean>
true
se o candidato for um número primo com uma probabilidade de erro menor que0,25 ** options.checks
.
Verifica a primalidade do candidato
.
crypto.constants
Adicionado em: v6.3.0
Um objeto contendo constantes comumente usadas para operações relacionadas a criptografia e segurança. As constantes específicas atualmente definidas são descritas em Constantes de Criptografia.
crypto.createCipheriv(algorithm, key, iv[, options])
[Histórico]
Versão | Mudanças |
---|---|
v17.9.0, v16.17.0 | A opção authTagLength agora é opcional ao usar a cifra chacha20-poly1305 e o padrão é 16 bytes. |
v15.0.0 | Os argumentos password e iv podem ser um ArrayBuffer e cada um está limitado a um máximo de 2 ** 31 - 1 bytes. |
v11.6.0 | O argumento key agora pode ser um KeyObject . |
v11.2.0, v10.17.0 | A cifra chacha20-poly1305 (a variante IETF de ChaCha20-Poly1305) agora é suportada. |
v10.10.0 | Cifras no modo OCB agora são suportadas. |
v10.2.0 | A opção authTagLength agora pode ser usada para produzir tags de autenticação mais curtas no modo GCM e o padrão é 16 bytes. |
v9.9.0 | O parâmetro iv agora pode ser null para cifras que não precisam de um vetor de inicialização. |
v0.1.94 | Adicionado em: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>iv
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <null>options
<Objeto>stream.transform
options- Retorna: <Cipher>
Cria e retorna um objeto Cipher
, com o algorithm
, key
e o vetor de inicialização (iv
) fornecidos.
O argumento options
controla o comportamento do fluxo e é opcional, exceto quando uma cifra no modo CCM ou OCB (por exemplo, 'aes-128-ccm'
) é usada. Nesse caso, a opção authTagLength
é obrigatória e especifica o comprimento da tag de autenticação em bytes, consulte modo CCM. No modo GCM, a opção authTagLength
não é obrigatória, mas pode ser usada para definir o comprimento da tag de autenticação que será retornada por getAuthTag()
e o padrão é 16 bytes. Para chacha20-poly1305
, a opção authTagLength
tem como padrão 16 bytes.
O algorithm
depende do OpenSSL, exemplos são 'aes192'
, etc. Em versões recentes do OpenSSL, openssl list -cipher-algorithms
exibirá os algoritmos de cifra disponíveis.
A key
é a chave bruta usada pelo algorithm
e iv
é um vetor de inicialização. Ambos os argumentos devem ser strings codificadas em 'utf8'
, Buffers, TypedArray
ou DataView
s. A key
pode ser opcionalmente um KeyObject
do tipo secret
. Se a cifra não precisar de um vetor de inicialização, iv
pode ser null
.
Ao passar strings para key
ou iv
, considere ressalvas ao usar strings como entradas para APIs criptográficas.
Os vetores de inicialização devem ser imprevisíveis e únicos; idealmente, eles serão criptograficamente aleatórios. Eles não precisam ser secretos: os IVs são normalmente apenas adicionados a mensagens de texto cifrado não criptografadas. Pode parecer contraditório que algo tenha que ser imprevisível e único, mas não precisa ser secreto; lembre-se de que um invasor não deve ser capaz de prever com antecedência qual será um determinado IV.
crypto.createDecipheriv(algorithm, key, iv[, options])
[Histórico]
Versão | Mudanças |
---|---|
v17.9.0, v16.17.0 | A opção authTagLength agora é opcional ao usar a cifra chacha20-poly1305 e o padrão é 16 bytes. |
v11.6.0 | O argumento key agora pode ser um KeyObject . |
v11.2.0, v10.17.0 | A cifra chacha20-poly1305 (a variante IETF de ChaCha20-Poly1305) agora é suportada. |
v10.10.0 | Cifras no modo OCB agora são suportadas. |
v10.2.0 | A opção authTagLength agora pode ser usada para restringir os comprimentos de tag de autenticação GCM aceitos. |
v9.9.0 | O parâmetro iv agora pode ser null para cifras que não precisam de um vetor de inicialização. |
v0.1.94 | Adicionado em: 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- Retorna: <Decipher>
Cria e retorna um objeto Decipher
que usa o algorithm
, a key
e o vetor de inicialização (iv
) fornecidos.
O argumento options
controla o comportamento do fluxo e é opcional, exceto quando uma cifra no modo CCM ou OCB (por exemplo, 'aes-128-ccm'
) é usada. Nesse caso, a opção authTagLength
é obrigatória e especifica o comprimento da tag de autenticação em bytes, consulte modo CCM. Para AES-GCM e chacha20-poly1305
, a opção authTagLength
assume o padrão de 16 bytes e deve ser definida para um valor diferente se um comprimento diferente for usado.
O algorithm
depende do OpenSSL, exemplos são 'aes192'
, etc. Em versões recentes do OpenSSL, openssl list -cipher-algorithms
exibirá os algoritmos de cifra disponíveis.
A key
é a chave bruta usada pelo algorithm
e iv
é um vetor de inicialização. Ambos os argumentos devem ser strings codificadas em 'utf8'
, Buffers, TypedArray
ou DataView
s. O key
pode, opcionalmente, ser um KeyObject
do tipo secret
. Se a cifra não precisar de um vetor de inicialização, iv
pode ser null
.
Ao passar strings para key
ou iv
, considere as ressalvas ao usar strings como entradas para APIs criptográficas.
Os vetores de inicialização devem ser imprevisíveis e únicos; idealmente, eles serão criptograficamente aleatórios. Eles não precisam ser secretos: os IVs são normalmente adicionados às mensagens de texto cifrado não criptografadas. Pode parecer contraditório que algo tenha que ser imprevisível e único, mas não precise ser secreto; lembre-se de que um invasor não deve ser capaz de prever com antecedência qual será um determinado IV.
crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])
[Histórico]
Versão | Mudanças |
---|---|
v8.0.0 | O argumento prime pode ser qualquer TypedArray ou DataView agora. |
v8.0.0 | O argumento prime pode ser um Uint8Array agora. |
v6.0.0 | O padrão para os parâmetros de codificação mudou de binary para utf8 . |
v0.11.12 | Adicionado em: v0.11.12 |
prime
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>primeEncoding
<string> A codificação da stringprime
.generator
<number> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Padrão:2
generatorEncoding
<string> A codificação da stringgenerator
.- Retorna: <DiffieHellman>
Cria um objeto de troca de chaves DiffieHellman
usando o prime
fornecido e um generator
específico opcional.
O argumento generator
pode ser um número, string ou Buffer
. Se generator
não for especificado, o valor 2
é usado.
Se primeEncoding
for especificado, espera-se que prime
seja uma string; caso contrário, espera-se um Buffer
, TypedArray
ou DataView
.
Se generatorEncoding
for especificado, espera-se que generator
seja uma string; caso contrário, espera-se um número, Buffer
, TypedArray
ou DataView
.
crypto.createDiffieHellman(primeLength[, generator])
Adicionado em: v0.5.0
primeLength
<number>generator
<number> Padrão:2
- Retorna: <DiffieHellman>
Cria um objeto de troca de chaves DiffieHellman
e gera um primo de primeLength
bits usando um generator
numérico específico opcional. Se generator
não for especificado, o valor 2
será usado.
crypto.createDiffieHellmanGroup(name)
Adicionado em: v0.9.3
name
<string>- Retorna: <DiffieHellmanGroup>
Um alias para crypto.getDiffieHellman()
crypto.createECDH(curveName)
Adicionado em: v0.11.14
Cria um objeto de troca de chaves Elliptic Curve Diffie-Hellman (ECDH
) usando uma curva predefinida especificada pela string curveName
. Use crypto.getCurves()
para obter uma lista de nomes de curva disponíveis. Em versões recentes do OpenSSL, openssl ecparam -list_curves
também exibirá o nome e a descrição de cada curva elíptica disponível.
crypto.createHash(algorithm[, options])
[Histórico]
Versão | Mudanças |
---|---|
v12.8.0 | A opção outputLength foi adicionada para funções hash XOF. |
v0.1.92 | Adicionado em: v0.1.92 |
algorithm
<string>options
<Object>stream.transform
options- Retorna: <Hash>
Cria e retorna um objeto Hash
que pode ser usado para gerar resumos de hash usando o algorithm
fornecido. O argumento opcional options
controla o comportamento do fluxo. Para funções hash XOF, como 'shake256'
, a opção outputLength
pode ser usada para especificar o comprimento de saída desejado em bytes.
O algorithm
depende dos algoritmos disponíveis suportados pela versão do OpenSSL na plataforma. Exemplos são 'sha256'
, 'sha512'
, etc. Em versões recentes do OpenSSL, openssl list -digest-algorithms
exibirá os algoritmos de resumo disponíveis.
Exemplo: gerando a soma sha256 de um arquivo
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', () => {
// Apenas um elemento será produzido pelo
// fluxo de hash.
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', () => {
// Apenas um elemento será produzido pelo
// fluxo de hash.
const data = input.read()
if (data) hash.update(data)
else {
console.log(`${hash.digest('hex')} ${filename}`)
}
})
crypto.createHmac(algorithm, key[, options])
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | A chave também pode ser um ArrayBuffer ou CryptoKey. A opção de codificação foi adicionada. A chave não pode conter mais de 2 ** 32 - 1 bytes. |
v11.6.0 | O argumento key agora pode ser um KeyObject . |
v0.1.94 | Adicionado em: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>options
<Object>stream.transform
optionsencoding
<string> A codificação de string a ser usada quandokey
é uma string.
Retorna: <Hmac>
Cria e retorna um objeto Hmac
que usa o algorithm
e a key
fornecidos. O argumento opcional options
controla o comportamento do fluxo.
O algorithm
depende dos algoritmos disponíveis suportados pela versão do OpenSSL na plataforma. Exemplos são 'sha256'
, 'sha512'
, etc. Em versões recentes do OpenSSL, openssl list -digest-algorithms
exibirá os algoritmos de digest disponíveis.
A key
é a chave HMAC usada para gerar o hash HMAC criptográfico. Se for um KeyObject
, seu tipo deve ser secret
. Se for uma string, considere ressalvas ao usar strings como entradas para APIs criptográficas. Se foi obtido de uma fonte de entropia criptograficamente segura, como crypto.randomBytes()
ou crypto.generateKey()
, seu comprimento não deve exceder o tamanho do bloco do algorithm
(por exemplo, 512 bits para SHA-256).
Exemplo: gerando o HMAC sha256 de um arquivo
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', () => {
// Apenas um elemento será produzido pelo
// fluxo de hash.
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', () => {
// Apenas um elemento será produzido pelo
// fluxo de hash.
const data = input.read()
if (data) hmac.update(data)
else {
console.log(`${hmac.digest('hex')} ${filename}`)
}
})
crypto.createPrivateKey(chave)
[Histórico]
Versão | Mudanças |
---|---|
v15.12.0 | A chave também pode ser um objeto JWK. |
v15.0.0 | A chave também pode ser um ArrayBuffer. A opção de codificação foi adicionada. A chave não pode conter mais de 2 ** 32 - 1 bytes. |
v11.6.0 | Adicionado em: v11.6.0 |
chave
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>chave
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Objeto> O material da chave, seja em formato PEM, DER ou JWK.formato
: <string> Deve ser'pem'
,'der'
ou'jwk'
. Padrão:'pem'
.tipo
: <string> Deve ser'pkcs1'
,'pkcs8'
ou'sec1'
. Esta opção é obrigatória apenas se oformato
for'der'
e ignorada caso contrário.senha
: <string> | <Buffer> A senha a ser usada para descriptografia.codificação
: <string> A codificação de string a ser usada quandochave
for uma string.
Retorna: <KeyObject>
Cria e retorna um novo objeto de chave contendo uma chave privada. Se chave
for uma string ou Buffer
, o formato
será considerado como 'pem'
; caso contrário, chave
deve ser um objeto com as propriedades descritas acima.
Se a chave privada estiver criptografada, uma senha
deve ser especificada. O comprimento da senha é limitado a 1024 bytes.
crypto.createPublicKey(key)
[Histórico]
Versão | Mudanças |
---|---|
v15.12.0 | A chave também pode ser um objeto JWK. |
v15.0.0 | A chave também pode ser um ArrayBuffer. A opção de codificação foi adicionada. A chave não pode conter mais de 2 ** 32 - 1 bytes. |
v11.13.0 | O argumento key agora pode ser um KeyObject com tipo private . |
v11.7.0 | O argumento key agora pode ser uma chave privada. |
v11.6.0 | Adicionado em: v11.6.0 |
key
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Objeto> O material da chave, seja em formato PEM, DER ou JWK.format
: <string> Deve ser'pem'
,'der'
ou'jwk'
. Padrão:'pem'
.type
: <string> Deve ser'pkcs1'
ou'spki'
. Esta opção é necessária apenas se oformat
for'der'
e ignorada caso contrário.encoding
<string> A codificação de string a ser usada quandokey
for uma string.
Retorna: <KeyObject>
Cria e retorna um novo objeto de chave contendo uma chave pública. Se key
for uma string ou Buffer
, format
é considerado como sendo 'pem'
; se key
for um KeyObject
com tipo 'private'
, a chave pública é derivada da chave privada fornecida; caso contrário, key
deve ser um objeto com as propriedades descritas acima.
Se o formato for 'pem'
, a 'key'
também pode ser um certificado X.509.
Como as chaves públicas podem ser derivadas de chaves privadas, uma chave privada pode ser passada em vez de uma chave pública. Nesse caso, esta função se comporta como se crypto.createPrivateKey()
tivesse sido chamada, exceto que o tipo do KeyObject
retornado será 'public'
e que a chave privada não pode ser extraída do KeyObject
retornado. Da mesma forma, se um KeyObject
com tipo 'private'
for fornecido, um novo KeyObject
com tipo 'public'
será retornado e será impossível extrair a chave privada do objeto retornado.
crypto.createSecretKey(key[, encoding])
[Histórico]
Versão | Mudanças |
---|---|
v18.8.0, v16.18.0 | A chave agora pode ter comprimento zero. |
v15.0.0 | A chave também pode ser um ArrayBuffer ou string. O argumento encoding foi adicionado. A chave não pode conter mais de 2 ** 32 - 1 bytes. |
v11.6.0 | Adicionado em: v11.6.0 |
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> A codificação da string quandokey
é uma string.- Retorna: <KeyObject>
Cria e retorna um novo objeto key contendo uma chave secreta para criptografia simétrica ou Hmac
.
crypto.createSign(algorithm[, options])
Adicionado em: v0.1.92
algorithm
<string>options
<Object>stream.Writable
options- Retorna: <Sign>
Cria e retorna um objeto Sign
que usa o algorithm
fornecido. Use crypto.getHashes()
para obter os nomes dos algoritmos de digest disponíveis. O argumento opcional options
controla o comportamento stream.Writable
.
Em alguns casos, uma instância Sign
pode ser criada usando o nome de um algoritmo de assinatura, como 'RSA-SHA256'
, em vez de um algoritmo de digest. Isso usará o algoritmo de digest correspondente. Isso não funciona para todos os algoritmos de assinatura, como 'ecdsa-with-SHA256'
, portanto, é melhor sempre usar nomes de algoritmos de digest.
crypto.createVerify(algorithm[, options])
Adicionado em: v0.1.92
algorithm
<string>options
<Object>stream.Writable
options- Retorna: <Verify>
Cria e retorna um objeto Verify
que usa o algoritmo fornecido. Use crypto.getHashes()
para obter uma matriz de nomes dos algoritmos de assinatura disponíveis. O argumento options
opcional controla o comportamento do stream.Writable
.
Em alguns casos, uma instância Verify
pode ser criada usando o nome de um algoritmo de assinatura, como 'RSA-SHA256'
, em vez de um algoritmo de digestão. Isso usará o algoritmo de digestão correspondente. Isso não funciona para todos os algoritmos de assinatura, como 'ecdsa-with-SHA256'
, portanto, é melhor usar sempre os nomes dos algoritmos de digestão.
crypto.diffieHellman(options)
Adicionado em: v13.9.0, v12.17.0
options
: <Object>privateKey
: <KeyObject>publicKey
: <KeyObject>
Retorna: <Buffer>
Calcula o segredo Diffie-Hellman com base em uma privateKey
e uma publicKey
. Ambas as chaves devem ter o mesmo asymmetricKeyType
, que deve ser um de 'dh'
(para Diffie-Hellman), 'ec'
, 'x448'
, ou 'x25519'
(para ECDH).
crypto.fips
Adicionado em: v6.0.0
Obsoleto desde: v10.0.0
[Estável: 0 - Obsoleto]
Estável: 0 Estabilidade: 0 - Obsoleto
Propriedade para verificar e controlar se um provedor de criptografia compatível com FIPS está atualmente em uso. Definir como verdadeiro requer uma compilação FIPS do Node.js.
Esta propriedade está obsoleta. Use crypto.setFips()
e crypto.getFips()
em vez disso.
crypto.generateKey(type, options, callback)
[Histórico]
Versão | Alterações |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v15.0.0 | Adicionado em: v15.0.0 |
type
: <string> O uso pretendido da chave secreta gerada. Os valores atualmente aceitos são'hmac'
e'aes'
.options
: <Object>length
: <number> O comprimento em bits da chave a ser gerada. Este deve ser um valor maior que 0.- Se
type
for'hmac'
, o mínimo é 8 e o comprimento máximo é 2-1. Se o valor não for um múltiplo de 8, a chave gerada será truncada paraMath.floor(length / 8)
. - Se
type
for'aes'
, o comprimento deve ser um de128
,192
ou256
.
callback
: <Function>err
: <Error>key
: <KeyObject>
Gera assincronamente uma nova chave secreta aleatória do length
fornecido. O type
determinará quais validações serão executadas no 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
})
O tamanho de uma chave HMAC gerada não deve exceder o tamanho do bloco da função hash subjacente. Consulte crypto.createHmac()
para obter mais informações.
crypto.generateKeyPair(type, options, callback)
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v16.10.0 | Adicionada a capacidade de definir parâmetros de sequência RSASSA-PSS-params para pares de chaves RSA-PSS. |
v13.9.0, v12.17.0 | Adicionado suporte para Diffie-Hellman. |
v12.0.0 | Adicionado suporte para pares de chaves RSA-PSS. |
v12.0.0 | Adicionada a capacidade de gerar pares de chaves X25519 e X448. |
v12.0.0 | Adicionada a capacidade de gerar pares de chaves Ed25519 e Ed448. |
v11.6.0 | As funções generateKeyPair e generateKeyPairSync agora produzem objetos de chave se nenhuma codificação foi especificada. |
v10.12.0 | Adicionado em: v10.12.0 |
type
: <string> Deve ser'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
ou'dh'
.options
: <Objeto>modulusLength
: <number> Tamanho da chave em bits (RSA, DSA).publicExponent
: <number> Expoente público (RSA). Padrão:0x10001
.hashAlgorithm
: <string> Nome do resumo da mensagem (RSA-PSS).mgf1HashAlgorithm
: <string> Nome do resumo da mensagem usado por MGF1 (RSA-PSS).saltLength
: <number> Comprimento mínimo do salt em bytes (RSA-PSS).divisorLength
: <number> Tamanho deq
em bits (DSA).namedCurve
: <string> Nome da curva a ser usada (EC).prime
: <Buffer> O parâmetro primo (DH).primeLength
: <number> Comprimento primo em bits (DH).generator
: <number> Gerador personalizado (DH). Padrão:2
.groupName
: <string> Nome do grupo Diffie-Hellman (DH). Vejacrypto.getDiffieHellman()
.paramEncoding
: <string> Deve ser'named'
ou'explicit'
(EC). Padrão:'named'
.publicKeyEncoding
: <Objeto> VejakeyObject.export()
.privateKeyEncoding
: <Objeto> VejakeyObject.export()
.
callback
: <Função>err
: <Erro>publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
Gera um novo par de chaves assimétricas do type
fornecido. RSA, RSA-PSS, DSA, EC, Ed25519, Ed448, X25519, X448 e DH são suportados atualmente.
Se um publicKeyEncoding
ou privateKeyEncoding
foi especificado, esta função se comporta como se keyObject.export()
tivesse sido chamado em seu resultado. Caso contrário, a parte respectiva da chave é retornada como um KeyObject
.
É recomendável codificar as chaves públicas como 'spki'
e as chaves privadas como 'pkcs8'
com criptografia para armazenamento de longo prazo:
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) => {
// Manipule os erros e use o par de chaves gerado.
}
)
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) => {
// Manipule os erros e use o par de chaves gerado.
}
)
Após a conclusão, callback
será chamado com err
definido como undefined
e publicKey
/ privateKey
representando o par de chaves gerado.
Se este método for invocado como sua versão util.promisify()
ed, ele retornará uma Promise
para um Objeto
com propriedades publicKey
e privateKey
.
crypto.generateKeyPairSync(type, options)
[Histórico]
Versão | Mudanças |
---|---|
v16.10.0 | Adicionada a capacidade de definir parâmetros de sequência RSASSA-PSS-params para pares de chaves RSA-PSS. |
v13.9.0, v12.17.0 | Adicionado suporte para Diffie-Hellman. |
v12.0.0 | Adicionado suporte para pares de chaves RSA-PSS. |
v12.0.0 | Adicionada a capacidade de gerar pares de chaves X25519 e X448. |
v12.0.0 | Adicionada a capacidade de gerar pares de chaves Ed25519 e Ed448. |
v11.6.0 | As funções generateKeyPair e generateKeyPairSync agora produzem objetos de chave se nenhuma codificação foi especificada. |
v10.12.0 | Adicionado em: v10.12.0 |
type
: <string> Deve ser'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
ou'dh'
.options
: <Object>modulusLength
: <number> Tamanho da chave em bits (RSA, DSA).publicExponent
: <number> Expoente público (RSA). Padrão:0x10001
.hashAlgorithm
: <string> Nome do resumo da mensagem (RSA-PSS).mgf1HashAlgorithm
: <string> Nome do resumo da mensagem usado por MGF1 (RSA-PSS).saltLength
: <number> Tamanho mínimo do salt em bytes (RSA-PSS).divisorLength
: <number> Tamanho deq
em bits (DSA).namedCurve
: <string> Nome da curva a ser usada (EC).prime
: <Buffer> O parâmetro primo (DH).primeLength
: <number> Comprimento do primo em bits (DH).generator
: <number> Gerador personalizado (DH). Padrão:2
.groupName
: <string> Nome do grupo Diffie-Hellman (DH). Consultecrypto.getDiffieHellman()
.paramEncoding
: <string> Deve ser'named'
ou'explicit'
(EC). Padrão:'named'
.publicKeyEncoding
: <Object> ConsultekeyObject.export()
.privateKeyEncoding
: <Object> ConsultekeyObject.export()
.
Retorna: <Object>
publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
Gera um novo par de chaves assimétricas do type
fornecido. RSA, RSA-PSS, DSA, EC, Ed25519, Ed448, X25519, X448 e DH são suportados atualmente.
Se um publicKeyEncoding
ou privateKeyEncoding
foi especificado, esta função se comporta como se keyObject.export()
tivesse sido chamada em seu resultado. Caso contrário, a parte respectiva da chave é retornada como um KeyObject
.
Ao codificar chaves públicas, é recomendável usar 'spki'
. Ao codificar chaves privadas, é recomendável usar 'pkcs8'
com uma senha forte e manter a senha confidencial.
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',
},
})
O valor de retorno { publicKey, privateKey }
representa o par de chaves gerado. Quando a codificação PEM foi selecionada, a chave respectiva será uma string, caso contrário, será um buffer contendo os dados codificados como DER.
crypto.generateKeySync(type, options)
Adicionado em: v15.0.0
type
: <string> O uso pretendido da chave secreta gerada. Os valores atualmente aceitos são'hmac'
e'aes'
.options
: <Object>length
: <number> O tamanho em bits da chave a ser gerada.- Se
type
for'hmac'
, o mínimo é 8 e o comprimento máximo é 2-1. Se o valor não for um múltiplo de 8, a chave gerada será truncada paraMath.floor(length / 8)
. - Se
type
for'aes'
, o comprimento deve ser um de128
,192
ou256
.
Retorna: <KeyObject>
Gera sincronicamente uma nova chave secreta aleatória do length
fornecido. O type
determinará quais validações serão realizadas no 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
O tamanho de uma chave HMAC gerada não deve exceder o tamanho do bloco da função hash subjacente. Consulte crypto.createHmac()
para obter mais informações.
crypto.generatePrime(size[, options[, callback]])
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v15.8.0 | Adicionado em: v15.8.0 |
size
<number> O tamanho (em bits) do número primo a ser gerado.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> Padrão:false
.bigint
<boolean> Quandotrue
, o número primo gerado é retornado como umbigint
.
callback
<Function>err
<Error>prime
<ArrayBuffer> | <bigint>
Gera um número primo pseudorrandômico de size
bits.
Se options.safe
for true
, o número primo será um número primo seguro - ou seja, (prime - 1) / 2
também será um número primo.
Os parâmetros options.add
e options.rem
podem ser usados para impor requisitos adicionais, por exemplo, para Diffie-Hellman:
- Se
options.add
eoptions.rem
estiverem ambos definidos, o número primo satisfará a condição de queprime % add = rem
. - Se apenas
options.add
estiver definido eoptions.safe
não fortrue
, o número primo satisfará a condição de queprime % add = 1
. - Se apenas
options.add
estiver definido eoptions.safe
estiver definido comotrue
, o número primo satisfará, em vez disso, a condição de queprime % add = 3
. Isso é necessário porqueprime % add = 1
paraoptions.add \> 2
contradiria a condição imposta poroptions.safe
. options.rem
é ignorado seoptions.add
não for fornecido.
Tanto options.add
quanto options.rem
devem ser codificados como sequências big-endian se fornecidos como um ArrayBuffer
, SharedArrayBuffer
, TypedArray
, Buffer
ou DataView
.
Por padrão, o número primo é codificado como uma sequência big-endian de octetos em um <ArrayBuffer>. Se a opção bigint
for true
, um <bigint> é fornecido.
crypto.generatePrimeSync(size[, options])
Adicionado em: v15.8.0
size
<number> O tamanho (em bits) do primo a ser gerado.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> Padrão:false
.bigint
<boolean> Quandotrue
, o primo gerado é retornado como umbigint
.
Retorna: <ArrayBuffer> | <bigint>
Gera um primo pseudoaleatório de size
bits.
Se options.safe
for true
, o primo será um primo seguro - ou seja, (primo - 1) / 2
também será um primo.
Os parâmetros options.add
e options.rem
podem ser usados para impor requisitos adicionais, por exemplo, para Diffie-Hellman:
- Se
options.add
eoptions.rem
estiverem ambos definidos, o primo irá satisfazer a condição de queprimo % add = rem
. - Se apenas
options.add
estiver definido eoptions.safe
não fortrue
, o primo irá satisfazer a condição de queprimo % add = 1
. - Se apenas
options.add
estiver definido eoptions.safe
estiver definido comotrue
, o primo irá, em vez disso, satisfazer a condição de queprimo % add = 3
. Isto é necessário porqueprimo % add = 1
paraoptions.add \> 2
iria contradizer a condição imposta poroptions.safe
. options.rem
é ignorado seoptions.add
não for dado.
Tanto options.add
quanto options.rem
devem ser codificados como sequências big-endian se forem fornecidos como um ArrayBuffer
, SharedArrayBuffer
, TypedArray
, Buffer
ou DataView
.
Por padrão, o primo é codificado como uma sequência big-endian de octetos em um <ArrayBuffer>. Se a opção bigint
for true
, então um <bigint> é fornecido.
crypto.getCipherInfo(nameOrNid[, options])
Adicionado em: v15.0.0
nameOrNid
: <string> | <number> O nome ou nid da cifra para consultar.options
: <Object>Retorna: <Object>
name
<string> O nome da cifranid
<number> O nid da cifrablockSize
<number> O tamanho do bloco da cifra em bytes. Esta propriedade é omitida quandomode
é'stream'
.ivLength
<number> O comprimento esperado ou padrão do vetor de inicialização em bytes. Esta propriedade é omitida se a cifra não usar um vetor de inicialização.keyLength
<number> O comprimento de chave esperado ou padrão em bytes.mode
<string> O modo de cifra. Um de'cbc'
,'ccm'
,'cfb'
,'ctr'
,'ecb'
,'gcm'
,'ocb'
,'ofb'
,'stream'
,'wrap'
,'xts'
.
Retorna informações sobre uma determinada cifra.
Algumas cifras aceitam chaves e vetores de inicialização de comprimento variável. Por padrão, o método crypto.getCipherInfo()
retornará os valores padrão para essas cifras. Para testar se um determinado comprimento de chave ou comprimento de iv é aceitável para uma determinada cifra, use as opções keyLength
e ivLength
. Se os valores fornecidos forem inaceitáveis, undefined
será retornado.
crypto.getCiphers()
Adicionado em: v0.9.3
- Retorna: <string[]> Um array com os nomes dos algoritmos de cifra suportados.
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()
Adicionado em: v2.3.0
- Retorna: <string[]> Um array com os nomes das curvas elípticas suportadas.
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)
Adicionado em: v0.7.5
groupName
<string>- Retorna: <DiffieHellmanGroup>
Cria um objeto de troca de chaves DiffieHellmanGroup
predefinido. Os grupos suportados estão listados na documentação para DiffieHellmanGroup
.
O objeto retornado imita a interface de objetos criados por crypto.createDiffieHellman()
, mas não permitirá alterar as chaves (com diffieHellman.setPublicKey()
, por exemplo). A vantagem de usar este método é que as partes não precisam gerar nem trocar um módulo de grupo antecipadamente, economizando tempo de processador e comunicação.
Exemplo (obtendo um segredo compartilhado):
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 e bobSecret devem ser iguais */
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 e bobSecret devem ser iguais */
console.log(aliceSecret === bobSecret)
crypto.getFips()
Adicionado em: v10.0.0
- Retorna: <number>
1
se e somente se um provedor criptográfico compatível com FIPS estiver em uso no momento,0
caso contrário. Uma futura versão semver-major pode alterar o tipo de retorno desta API para um <boolean>.
crypto.getHashes()
Adicionado em: v0.9.3
- Retorna: <string[]> Um array com os nomes dos algoritmos de hash suportados, como
'RSA-SHA256'
. Algoritmos de hash também são chamados de algoritmos "digest".
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)
Adicionado em: v17.4.0
typedArray
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer>- Retorna: <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> Retorna
typedArray
.
Um alias conveniente para crypto.webcrypto.getRandomValues()
. Esta implementação não está em conformidade com a especificação da Web Crypto, para escrever código compatível com a web, use crypto.webcrypto.getRandomValues()
em vez disso.
crypto.hash(algorithm, data[, outputEncoding])
Adicionado em: v21.7.0, v20.12.0
[Estável: 1 - Experimental]
Estável: 1 Estabilidade: 1.2 - Candidato a lançamento
algorithm
<string> | <undefined>data
<string> | <Buffer> | <TypedArray> | <DataView> Quandodata
é uma string, ela será codificada como UTF-8 antes de ser hash. Se uma codificação de entrada diferente for desejada para uma entrada de string, o usuário pode codificar a string em umTypedArray
usandoTextEncoder
ouBuffer.from()
e passando oTypedArray
codificado para esta API.outputEncoding
<string> | <undefined> Codificação usada para codificar o resumo retornado. Padrão:'hex'
.- Retorna: <string> | <Buffer>
Um utilitário para criar resumos hash únicos de dados. Pode ser mais rápido do que crypto.createHash()
baseado em objeto ao fazer hash de uma quantidade menor de dados (<= 5MB) que esteja prontamente disponível. Se os dados puderem ser grandes ou se forem transmitidos, ainda é recomendado usar crypto.createHash()
em vez disso.
O algorithm
depende dos algoritmos disponíveis suportados pela versão do OpenSSL na plataforma. Exemplos são 'sha256'
, 'sha512'
, etc. Em versões recentes do OpenSSL, openssl list -digest-algorithms
exibirá os algoritmos de resumo disponíveis.
Exemplo:
const crypto = require('node:crypto')
const { Buffer } = require('node:buffer')
// Fazendo o hash de uma string e retornando o resultado como uma string codificada em hexadecimal.
const string = 'Node.js'
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string))
// Codifica uma string codificada em base64 em um Buffer, faz o hash e retorna
// o resultado como um buffer.
const base64 = 'Tm9kZS5qcw=='
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'))
import crypto from 'node:crypto'
import { Buffer } from 'node:buffer'
// Fazendo o hash de uma string e retornando o resultado como uma string codificada em hexadecimal.
const string = 'Node.js'
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string))
// Codifica uma string codificada em base64 em um Buffer, faz o hash e retorna
// o resultado como um buffer.
const base64 = 'Tm9kZS5qcw=='
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'))
crypto.hkdf(digest, ikm, salt, info, keylen, callback)
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v18.8.0, v16.18.0 | O material de chave de entrada agora pode ter comprimento zero. |
v15.0.0 | Adicionado em: v15.0.0 |
digest
<string> O algoritmo de digest a ser usado.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> O material de chave de entrada. Deve ser fornecido, mas pode ter comprimento zero.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> O valor do salt. Deve ser fornecido, mas pode ter comprimento zero.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Valor de info adicional. Deve ser fornecido, mas pode ter comprimento zero e não pode ter mais de 1024 bytes.keylen
<number> O comprimento da chave a ser gerada. Deve ser maior que 0. O valor máximo permitido é255
vezes o número de bytes produzidos pela função de digest selecionada (por exemplo,sha512
gera hashes de 64 bytes, tornando a saída HKDF máxima de 16320 bytes).callback
<Function>err
<Error>derivedKey
<ArrayBuffer>
HKDF é uma função simples de derivação de chaves definida no RFC 5869. O ikm
, salt
e info
fornecidos são usados com o digest
para derivar uma chave de keylen
bytes.
A função callback
fornecida é chamada com dois argumentos: err
e derivedKey
. Se ocorrer um erro ao derivar a chave, err
será definido; caso contrário, err
será null
. A derivedKey
gerada com sucesso será passada para o callback como um <ArrayBuffer>. Um erro será lançado se algum dos argumentos de entrada especificar valores ou tipos inválidos.
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)
[Histórico]
Versão | Mudanças |
---|---|
v18.8.0, v16.18.0 | O material de chave de entrada agora pode ter comprimento zero. |
v15.0.0 | Adicionado em: v15.0.0 |
digest
<string> O algoritmo de resumo a ser usado.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> O material de chave de entrada. Deve ser fornecido, mas pode ter comprimento zero.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> O valor de salt. Deve ser fornecido, mas pode ter comprimento zero.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Valor de informação adicional. Deve ser fornecido, mas pode ter comprimento zero, e não pode ter mais de 1024 bytes.keylen
<number> O comprimento da chave a ser gerada. Deve ser maior que 0. O valor máximo permitido é255
vezes o número de bytes produzidos pela função de resumo selecionada (por exemplo,sha512
gera hashes de 64 bytes, tornando a saída HKDF máxima de 16320 bytes).- Retorna: <ArrayBuffer>
Fornece uma função síncrona de derivação de chave HKDF conforme definido em RFC 5869. O ikm
, salt
e info
fornecidos são usados com o digest
para derivar uma chave de keylen
bytes.
A derivedKey
gerada com sucesso será retornada como um <ArrayBuffer>.
Um erro será lançado se algum dos argumentos de entrada especificar valores ou tipos inválidos, ou se a chave derivada não puder ser gerada.
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)
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v15.0.0 | Os argumentos password e salt também podem ser instâncias de ArrayBuffer. |
v14.0.0 | O parâmetro iterations agora está restrito a valores positivos. Versões anteriores tratavam outros valores como um. |
v8.0.0 | O parâmetro digest agora é sempre obrigatório. |
v6.0.0 | Chamar esta função sem passar o parâmetro digest agora está obsoleto e emitirá um aviso. |
v6.0.0 | A codificação padrão para password se for uma string mudou de binary para utf8 . |
v0.5.5 | Adicionado em: v0.5.5 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>callback
<Function>
Fornece uma implementação assíncrona da Função de Derivação de Chave Baseada em Senha 2 (PBKDF2). Um algoritmo de resumo HMAC selecionado especificado por digest
é aplicado para derivar uma chave do comprimento de byte solicitado (keylen
) da password
, salt
e iterations
.
A função callback
fornecida é chamada com dois argumentos: err
e derivedKey
. Se ocorrer um erro ao derivar a chave, err
será definido; caso contrário, err
será null
. Por padrão, o derivedKey
gerado com sucesso será passado para o callback como um Buffer
. Um erro será lançado se algum dos argumentos de entrada especificar valores ou tipos inválidos.
O argumento iterations
deve ser um número definido o mais alto possível. Quanto maior o número de iterações, mais segura será a chave derivada, mas levará mais tempo para ser concluída.
O salt
deve ser o mais exclusivo possível. Recomenda-se que um salt seja aleatório e tenha pelo menos 16 bytes de comprimento. Consulte NIST SP 800-132 para obter detalhes.
Ao passar strings para password
ou salt
, considere ressalvas ao usar strings como entradas para APIs criptográficas.
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'
})
Um array de funções de resumo suportadas pode ser recuperado usando crypto.getHashes()
.
Esta API usa o threadpool do libuv, que pode ter implicações de desempenho surpreendentes e negativas para algumas aplicações; consulte a documentação de UV_THREADPOOL_SIZE
para mais informações.
crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)
[Histórico]
Versão | Mudanças |
---|---|
v14.0.0 | O parâmetro iterations agora é restrito a valores positivos. Versões anteriores tratavam outros valores como um. |
v6.0.0 | Chamar esta função sem passar o parâmetro digest agora está obsoleto e emitirá um aviso. |
v6.0.0 | A codificação padrão para password se for uma string foi alterada de binary para utf8 . |
v0.9.3 | Adicionado em: v0.9.3 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>- Retorna: <Buffer>
Fornece uma implementação síncrona da Função de Derivação de Chave Baseada em Senha 2 (PBKDF2). Um algoritmo de resumo HMAC selecionado especificado por digest
é aplicado para derivar uma chave do comprimento de byte solicitado (keylen
) da password
, salt
e iterations
.
Se ocorrer um erro, um Error
será lançado, caso contrário, a chave derivada será retornada como um Buffer
.
O argumento iterations
deve ser um número definido o mais alto possível. Quanto maior o número de iterações, mais segura será a chave derivada, mas levará mais tempo para ser concluída.
O salt
deve ser o mais exclusivo possível. Recomenda-se que um salt seja aleatório e tenha pelo menos 16 bytes de comprimento. Consulte NIST SP 800-132 para obter detalhes.
Ao passar strings para password
ou salt
, considere ressalvas ao usar strings como entradas para APIs criptográficas.
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'
Um array de funções de resumo suportadas pode ser recuperado usando crypto.getHashes()
.
crypto.privateDecrypt(privateKey, buffer)
[Histórico]
Versão | Mudanças |
---|---|
v21.6.2, v20.11.1, v18.19.1 | O preenchimento RSA_PKCS1_PADDING foi desativado a menos que a compilação do OpenSSL suporte rejeição implícita. |
v15.0.0 | Adicionado string, ArrayBuffer e CryptoKey como tipos de chave permitidos. O oaepLabel pode ser um ArrayBuffer. O buffer pode ser uma string ou ArrayBuffer. Todos os tipos que aceitam buffers são limitados a um máximo de 2 ** 31 - 1 bytes. |
v12.11.0 | A opção oaepLabel foi adicionada. |
v12.9.0 | A opção oaepHash foi adicionada. |
v11.6.0 | Esta função agora suporta objetos de chave. |
v0.11.14 | Adicionado em: v0.11.14 |
privateKey
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>oaepHash
<string> A função de hash a ser usada para preenchimento OAEP e MGF1. Padrão:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> O rótulo a ser usado para preenchimento OAEP. Se não especificado, nenhum rótulo é usado.padding
<crypto.constants> Um valor de preenchimento opcional definido emcrypto.constants
, que pode ser:crypto.constants.RSA_NO_PADDING
,crypto.constants.RSA_PKCS1_PADDING
oucrypto.constants.RSA_PKCS1_OAEP_PADDING
.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Retorna: <Buffer> Um novo
Buffer
com o conteúdo descriptografado.
Descriptografa buffer
com privateKey
. buffer
foi criptografado anteriormente usando a chave pública correspondente, por exemplo, usando crypto.publicEncrypt()
.
Se privateKey
não for um KeyObject
, esta função se comporta como se privateKey
tivesse sido passado para crypto.createPrivateKey()
. Se for um objeto, a propriedade padding
pode ser passada. Caso contrário, esta função usa RSA_PKCS1_OAEP_PADDING
.
O uso de crypto.constants.RSA_PKCS1_PADDING
em crypto.privateDecrypt()
requer que o OpenSSL suporte a rejeição implícita (rsa_pkcs1_implicit_rejection
). Se a versão do OpenSSL usada pelo Node.js não suportar esse recurso, tentar usar RSA_PKCS1_PADDING
falhará.
crypto.privateEncrypt(privateKey, buffer)
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | Adicionados string, ArrayBuffer e CryptoKey como tipos de chave permitidos. A senha pode ser um ArrayBuffer. O buffer pode ser uma string ou ArrayBuffer. Todos os tipos que aceitam buffers são limitados a um máximo de 2 ** 31 - 1 bytes. |
v11.6.0 | Esta função agora suporta objetos de chave. |
v1.1.0 | Adicionado em: v1.1.0 |
privateKey
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> Uma chave privada codificada em PEM.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Uma senha opcional para a chave privada.padding
<crypto.constants> Um valor de preenchimento opcional definido emcrypto.constants
, que pode ser:crypto.constants.RSA_NO_PADDING
oucrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> A codificação de string a ser usada quandobuffer
,key
oupassphrase
são strings.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Retorna: <Buffer> Um novo
Buffer
com o conteúdo criptografado.
Criptografa buffer
com privateKey
. Os dados retornados podem ser descriptografados usando a chave pública correspondente, por exemplo, usando crypto.publicDecrypt()
.
Se privateKey
não for um KeyObject
, esta função se comporta como se privateKey
tivesse sido passado para crypto.createPrivateKey()
. Se for um objeto, a propriedade padding
pode ser passada. Caso contrário, esta função usa RSA_PKCS1_PADDING
.
crypto.publicDecrypt(key, buffer)
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | Adicionado string, ArrayBuffer e CryptoKey como tipos de chave aceitáveis. A senha pode ser um ArrayBuffer. O buffer pode ser uma string ou ArrayBuffer. Todos os tipos que aceitam buffers são limitados a um máximo de 2 ** 31 - 1 bytes. |
v11.6.0 | Esta função agora suporta objetos de chave. |
v1.1.0 | Adicionado em: v1.1.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Uma senha opcional para a chave privada.padding
<crypto.constants> Um valor de preenchimento opcional definido emcrypto.constants
, que pode ser:crypto.constants.RSA_NO_PADDING
oucrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> A codificação de string a ser usada quandobuffer
,key
oupassphrase
são strings.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Retorna: <Buffer> Um novo
Buffer
com o conteúdo descriptografado.
Descriptografa buffer
com key
. buffer
foi criptografado anteriormente usando a chave privada correspondente, por exemplo, usando crypto.privateEncrypt()
.
Se key
não for um KeyObject
, esta função se comporta como se key
tivesse sido passada para crypto.createPublicKey()
. Se for um objeto, a propriedade padding
pode ser passada. Caso contrário, esta função usa RSA_PKCS1_PADDING
.
Como as chaves públicas RSA podem ser derivadas de chaves privadas, uma chave privada pode ser passada em vez de uma chave pública.
crypto.publicEncrypt(key, buffer)
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | Adicionadas string, ArrayBuffer e CryptoKey como tipos de chave permitidos. oaepLabel e passphrase podem ser ArrayBuffers. O buffer pode ser uma string ou ArrayBuffer. Todos os tipos que aceitam buffers são limitados a um máximo de 2 ** 31 - 1 bytes. |
v12.11.0 | A opção oaepLabel foi adicionada. |
v12.9.0 | A opção oaepHash foi adicionada. |
v11.6.0 | Esta função agora suporta objetos de chave. |
v0.11.14 | Adicionado em: v0.11.14 |
key
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> Uma chave pública ou privada codificada em PEM, <KeyObject> ou <CryptoKey>.oaepHash
<string> A função hash a ser usada para preenchimento OAEP e MGF1. Padrão:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> O rótulo a ser usado para preenchimento OAEP. Se não especificado, nenhum rótulo é usado.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Uma senha opcional para a chave privada.padding
<crypto.constants> Um valor de preenchimento opcional definido emcrypto.constants
, que pode ser:crypto.constants.RSA_NO_PADDING
,crypto.constants.RSA_PKCS1_PADDING
oucrypto.constants.RSA_PKCS1_OAEP_PADDING
.encoding
<string> A codificação de string a ser usada quandobuffer
,key
,oaepLabel
oupassphrase
são strings.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Retorna: <Buffer> Um novo
Buffer
com o conteúdo criptografado.
Criptografa o conteúdo de buffer
com key
e retorna um novo Buffer
com o conteúdo criptografado. Os dados retornados podem ser descriptografados usando a chave privada correspondente, por exemplo, usando crypto.privateDecrypt()
.
Se key
não for um KeyObject
, esta função se comporta como se key
tivesse sido passada para crypto.createPublicKey()
. Se for um objeto, a propriedade padding
pode ser passada. Caso contrário, esta função usa RSA_PKCS1_OAEP_PADDING
.
Como as chaves públicas RSA podem ser derivadas de chaves privadas, uma chave privada pode ser passada em vez de uma chave pública.
crypto.randomBytes(size[, callback])
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v9.0.0 | Passar null como o argumento callback agora lança ERR_INVALID_CALLBACK . |
v0.5.8 | Adicionado em: v0.5.8 |
size
<number> O número de bytes a serem gerados. Osize
não deve ser maior que2**31 - 1
.callback
<Function>Retorna: <Buffer> se a função
callback
não for fornecida.
Gera dados pseudoaleatórios criptograficamente fortes. O argumento size
é um número que indica o número de bytes a serem gerados.
Se uma função callback
for fornecida, os bytes serão gerados assincronamente e a função callback
será invocada com dois argumentos: err
e buf
. Se ocorrer um erro, err
será um objeto Error
; caso contrário, será null
. O argumento buf
é um Buffer
contendo os bytes gerados.
// Assíncrono
const { randomBytes } = await import('node:crypto')
randomBytes(256, (err, buf) => {
if (err) throw err
console.log(`${buf.length} bytes de dados aleatórios: ${buf.toString('hex')}`)
})
// Assíncrono
const { randomBytes } = require('node:crypto')
randomBytes(256, (err, buf) => {
if (err) throw err
console.log(`${buf.length} bytes de dados aleatórios: ${buf.toString('hex')}`)
})
Se a função callback
não for fornecida, os bytes aleatórios serão gerados sincronicamente e retornados como um Buffer
. Um erro será lançado se houver um problema ao gerar os bytes.
// Síncrono
const { randomBytes } = await import('node:crypto')
const buf = randomBytes(256)
console.log(`${buf.length} bytes de dados aleatórios: ${buf.toString('hex')}`)
// Síncrono
const { randomBytes } = require('node:crypto')
const buf = randomBytes(256)
console.log(`${buf.length} bytes de dados aleatórios: ${buf.toString('hex')}`)
O método crypto.randomBytes()
não será concluído até que haja entropia suficiente disponível. Isso normalmente nunca deve levar mais do que alguns milissegundos. A única vez em que a geração dos bytes aleatórios pode concebivelmente bloquear por um período de tempo mais longo é logo após a inicialização, quando todo o sistema ainda está com pouca entropia.
Esta API usa o pool de threads do libuv, o que pode ter implicações de desempenho surpreendentes e negativas para algumas aplicações; veja a documentação UV_THREADPOOL_SIZE
para mais informações.
A versão assíncrona de crypto.randomBytes()
é realizada em uma única solicitação de pool de threads. Para minimizar a variação do comprimento da tarefa do pool de threads, particione grandes solicitações randomBytes
ao fazer isso como parte do atendimento a uma solicitação do cliente.
crypto.randomFill(buffer[, offset][, size], callback)
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v9.0.0 | O argumento buffer pode ser qualquer TypedArray ou DataView . |
v7.10.0, v6.13.0 | Adicionado em: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Deve ser fornecido. O tamanho dobuffer
fornecido não deve ser maior que2**31 - 1
.offset
<number> Padrão:0
size
<number> Padrão:buffer.length - offset
. Osize
não deve ser maior que2**31 - 1
.callback
<Function>function(err, buf) {}
.
Esta função é semelhante a crypto.randomBytes()
, mas requer que o primeiro argumento seja um Buffer
que será preenchido. Também requer que um callback seja passado.
Se a função callback
não for fornecida, um erro será lançado.
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'))
})
// O acima é equivalente ao seguinte:
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'))
})
// O acima é equivalente ao seguinte:
randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err
console.log(buf.toString('hex'))
})
Qualquer instância de ArrayBuffer
, TypedArray
ou DataView
pode ser passada como buffer
.
Embora isso inclua instâncias de Float32Array
e Float64Array
, esta função não deve ser usada para gerar números de ponto flutuante aleatórios. O resultado pode conter +Infinity
, -Infinity
e NaN
, e mesmo que o array contenha apenas números finitos, eles não são extraídos de uma distribuição aleatória uniforme e não têm limites inferiores ou superiores significativos.
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'))
})
Esta API usa o threadpool do libuv, que pode ter implicações de desempenho surpreendentes e negativas para algumas aplicações; consulte a documentação UV_THREADPOOL_SIZE
para obter mais informações.
A versão assíncrona de crypto.randomFill()
é realizada em uma única solicitação de threadpool. Para minimizar a variação do comprimento da tarefa do threadpool, particione grandes solicitações de randomFill
ao fazer isso como parte do atendimento a uma solicitação do cliente.
crypto.randomFillSync(buffer[, offset][, size])
[Histórico]
Versão | Mudanças |
---|---|
v9.0.0 | O argumento buffer pode ser qualquer TypedArray ou DataView . |
v7.10.0, v6.13.0 | Adicionado em: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Deve ser fornecido. O tamanho dobuffer
fornecido não deve ser maior que2**31 - 1
.offset
<number> Padrão:0
size
<number> Padrão:buffer.length - offset
. Osize
não deve ser maior que2**31 - 1
.- Retorna: <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> O objeto passado como argumento
buffer
.
Versão síncrona de 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'))
// O acima é equivalente ao seguinte:
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'))
// O acima é equivalente ao seguinte:
randomFillSync(buf, 5, 5)
console.log(buf.toString('hex'))
Qualquer instância de ArrayBuffer
, TypedArray
ou DataView
pode ser passada como 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])
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v14.10.0, v12.19.0 | Adicionado em: v14.10.0, v12.19.0 |
min
<integer> Início do intervalo aleatório (inclusivo). Padrão:0
.max
<integer> Fim do intervalo aleatório (exclusivo).callback
<Function>function(err, n) {}
.
Retorna um inteiro aleatório n
tal que min \<= n \< max
. Esta implementação evita o viés de módulo.
O intervalo (max - min
) deve ser menor que 2. min
e max
devem ser inteiros seguros.
Se a função callback
não for fornecida, o inteiro aleatório é gerado de forma síncrona.
// Assíncrono
const { randomInt } = await import('node:crypto')
randomInt(3, (err, n) => {
if (err) throw err
console.log(`Número aleatório escolhido de (0, 1, 2): ${n}`)
})
// Assíncrono
const { randomInt } = require('node:crypto')
randomInt(3, (err, n) => {
if (err) throw err
console.log(`Número aleatório escolhido de (0, 1, 2): ${n}`)
})
// Síncrono
const { randomInt } = await import('node:crypto')
const n = randomInt(3)
console.log(`Número aleatório escolhido de (0, 1, 2): ${n}`)
// Síncrono
const { randomInt } = require('node:crypto')
const n = randomInt(3)
console.log(`Número aleatório escolhido de (0, 1, 2): ${n}`)
// Com argumento `min`
const { randomInt } = await import('node:crypto')
const n = randomInt(1, 7)
console.log(`O dado rolou: ${n}`)
// Com argumento `min`
const { randomInt } = require('node:crypto')
const n = randomInt(1, 7)
console.log(`O dado rolou: ${n}`)
crypto.randomUUID([options])
Adicionado em: v15.6.0, v14.17.0
options
<Objeto>disableEntropyCache
<boolean> Por padrão, para melhorar o desempenho, o Node.js gera e armazena em cache dados aleatórios suficientes para gerar até 128 UUIDs aleatórios. Para gerar um UUID sem usar o cache, definadisableEntropyCache
comotrue
. Padrão:false
.
Retorna: <string>
Gera um UUID aleatório RFC 4122 versão 4. O UUID é gerado usando um gerador de números pseudoaleatórios criptográfico.
crypto.scrypt(password, salt, keylen[, options], callback)
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora gera ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v15.0.0 | Os argumentos password e salt também podem ser instâncias ArrayBuffer. |
v12.8.0, v10.17.0 | O valor maxmem agora pode ser qualquer inteiro seguro. |
v10.9.0 | Os nomes das opções cost , blockSize e parallelization foram adicionados. |
v10.5.0 | Adicionado em: v10.5.0 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Objeto>cost
<number> Parâmetro de custo de CPU/memória. Deve ser uma potência de dois maior que um. Padrão:16384
.blockSize
<number> Parâmetro de tamanho do bloco. Padrão:8
.parallelization
<number> Parâmetro de paralelização. Padrão:1
.N
<number> Alias paracost
. Apenas um dos dois pode ser especificado.r
<number> Alias parablockSize
. Apenas um dos dois pode ser especificado.p
<number> Alias paraparallelization
. Apenas um dos dois pode ser especificado.maxmem
<number> Limite superior de memória. É um erro quando (aproximadamente)128 * N * r > maxmem
. Padrão:32 * 1024 * 1024
.
callback
<Function>
Fornece uma implementação scrypt assíncrona. Scrypt é uma função de derivação de chave baseada em senha que é projetada para ser computacionalmente e em termos de memória dispendiosa, a fim de tornar ataques de força bruta não recompensadores.
O salt
deve ser o mais exclusivo possível. Recomenda-se que um salt seja aleatório e tenha pelo menos 16 bytes de comprimento. Veja NIST SP 800-132 para detalhes.
Ao passar strings para password
ou salt
, por favor, considere ressalvas ao usar strings como entradas para APIs criptográficas.
A função callback
é chamada com dois argumentos: err
e derivedKey
. err
é um objeto de exceção quando a derivação de chave falha, caso contrário, err
é null
. derivedKey
é passada para o callback como um Buffer
.
Uma exceção é lançada quando qualquer um dos argumentos de entrada especifica valores ou tipos inválidos.
const { scrypt } = await import('node:crypto')
// Usando os padrões de fábrica.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...08d59ae'
})
// Usando um parâmetro N personalizado. Deve ser uma potência de dois.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...aa39b34'
})
const { scrypt } = require('node:crypto')
// Usando os padrões de fábrica.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...08d59ae'
})
// Usando um parâmetro N personalizado. Deve ser uma potência de dois.
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])
[Histórico]
Versão | Mudanças |
---|---|
v12.8.0, v10.17.0 | O valor maxmem agora pode ser qualquer inteiro seguro. |
v10.9.0 | Os nomes das opções cost , blockSize e parallelization foram adicionados. |
v10.5.0 | Adicionado em: v10.5.0 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Object>cost
<number> Parâmetro de custo de CPU/memória. Deve ser uma potência de dois maior que um. Padrão:16384
.blockSize
<number> Parâmetro de tamanho do bloco. Padrão:8
.parallelization
<number> Parâmetro de paralelização. Padrão:1
.N
<number> Alias paracost
. Apenas um dos dois pode ser especificado.r
<number> Alias parablockSize
. Apenas um dos dois pode ser especificado.p
<number> Alias paraparallelization
. Apenas um dos dois pode ser especificado.maxmem
<number> Limite superior da memória. É um erro quando (aproximadamente)128 * N * r \> maxmem
. Padrão:32 * 1024 * 1024
.
Retorna: <Buffer>
Fornece uma implementação síncrona de scrypt. Scrypt é uma função de derivação de chave baseada em senha que é projetada para ser dispendiosa computacionalmente e em termos de memória, a fim de tornar os ataques de força bruta pouco recompensadores.
O salt
deve ser o mais exclusivo possível. Recomenda-se que um salt seja aleatório e tenha pelo menos 16 bytes de comprimento. Consulte NIST SP 800-132 para obter detalhes.
Ao passar strings para password
ou salt
, considere ressalvas ao usar strings como entradas para APIs criptográficas.
Uma exceção é lançada quando a derivação da chave falha, caso contrário, a chave derivada é retornada como um Buffer
.
Uma exceção é lançada quando qualquer um dos argumentos de entrada especifica valores ou tipos inválidos.
const { scryptSync } = await import('node:crypto')
// Usando os valores padrão de fábrica.
const key1 = scryptSync('password', 'salt', 64)
console.log(key1.toString('hex')) // '3745e48...08d59ae'
// Usando um parâmetro N personalizado. Deve ser uma potência de dois.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 })
console.log(key2.toString('hex')) // '3745e48...aa39b34'
const { scryptSync } = require('node:crypto')
// Usando os valores padrão de fábrica.
const key1 = scryptSync('password', 'salt', 64)
console.log(key1.toString('hex')) // '3745e48...08d59ae'
// Usando um parâmetro N personalizado. Deve ser uma potência de dois.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 })
console.log(key2.toString('hex')) // '3745e48...aa39b34'
crypto.secureHeapUsed()
Adicionado em: v15.6.0
- Retorna: <Object>
total
<number> O tamanho total do heap seguro alocado, conforme especificado usando o sinalizador de linha de comando--secure-heap=n
.min
<number> A alocação mínima do heap seguro, conforme especificado usando o sinalizador de linha de comando--secure-heap-min
.used
<number> O número total de bytes atualmente alocados do heap seguro.utilization
<number> A razão calculada deused
paratotal
de bytes alocados.
crypto.setEngine(engine[, flags])
[Histórico]
Versão | Mudanças |
---|---|
v22.4.0, v20.16.0 | O suporte a mecanismos personalizados no OpenSSL 3 está obsoleto. |
v0.11.11 | Adicionado em: v0.11.11 |
engine
<string>flags
<crypto.constants> Padrão:crypto.constants.ENGINE_METHOD_ALL
Carrega e define o engine
para algumas ou todas as funções OpenSSL (selecionadas por flags). O suporte para mecanismos personalizados no OpenSSL está obsoleto a partir do OpenSSL 3.
engine
pode ser um id ou um caminho para a biblioteca compartilhada do mecanismo.
O argumento opcional flags
usa ENGINE_METHOD_ALL
por padrão. flags
é um campo de bits que usa um ou uma mistura dos seguintes flags (definidos em 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)
Adicionado em: v10.0.0
bool
<boolean>true
para habilitar o modo FIPS.
Habilita o provedor criptográfico compatível com FIPS em uma build do Node.js habilitada para FIPS. Lança um erro se o modo FIPS não estiver disponível.
crypto.sign(algorithm, data, key[, callback])
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v15.12.0 | Argumento de callback opcional adicionado. |
v13.2.0, v12.16.0 | Esta função agora suporta assinaturas IEEE-P1363 DSA e ECDSA. |
v12.0.0 | Adicionado em: v12.0.0 |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>callback
<Function>Retorna: <Buffer> se a função
callback
não for fornecida.
Calcula e retorna a assinatura para data
usando a chave privada e o algoritmo fornecidos. Se algorithm
for null
ou undefined
, então o algoritmo depende do tipo de chave (especialmente Ed25519 e Ed448).
Se key
não for um KeyObject
, esta função se comporta como se key
tivesse sido passado para crypto.createPrivateKey()
. Se for um objeto, as seguintes propriedades adicionais podem ser passadas:
dsaEncoding
<string> Para DSA e ECDSA, esta opção especifica o formato da assinatura gerada. Pode ser um dos seguintes:'der'
(padrão): estrutura de assinatura ASN.1 codificada em DER codificando(r, s)
.'ieee-p1363'
: Formato de assinaturar || s
conforme proposto no IEEE-P1363.
padding
<integer> Valor de preenchimento opcional para RSA, um dos seguintes:crypto.constants.RSA_PKCS1_PADDING
(padrão)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
usará MGF1 com a mesma função hash usada para assinar a mensagem, conforme especificado na seção 3.1 do RFC 4055.
saltLength
<integer> Comprimento do salt para quando o preenchimento éRSA_PKCS1_PSS_PADDING
. O valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
define o comprimento do salt para o tamanho do digest,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(padrão) define-o para o valor máximo permitido.
Se a função callback
for fornecida, esta função usa o threadpool do libuv.
crypto.subtle
Adicionado em: v17.4.0
- Tipo: <SubtleCrypto>
Um alias conveniente para crypto.webcrypto.subtle
.
crypto.timingSafeEqual(a, b)
[Histórico]
Versão | Mudanças |
---|---|
v15.0.0 | Os argumentos a e b também podem ser ArrayBuffer. |
v6.6.0 | Adicionado em: v6.6.0 |
a
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>b
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>- Retorna: <boolean>
Esta função compara os bytes subjacentes que representam as instâncias ArrayBuffer
, TypedArray
ou DataView
fornecidas usando um algoritmo de tempo constante.
Esta função não vaza informações de tempo que permitiriam a um invasor adivinhar um dos valores. Isso é adequado para comparar digests HMAC ou valores secretos, como cookies de autenticação ou URLs de capacidade.
a
e b
devem ser ambos Buffer
s, TypedArray
s ou DataView
s, e devem ter o mesmo comprimento de byte. Um erro é lançado se a
e b
tiverem comprimentos de byte diferentes.
Se pelo menos um de a
e b
for um TypedArray
com mais de um byte por entrada, como Uint16Array
, o resultado será calculado usando a ordem de byte da plataforma.
Quando ambas as entradas são Float32Array
s ou Float64Array
s, esta função pode retornar resultados inesperados devido à codificação IEEE 754 de números de ponto flutuante. Em particular, nem x === y
nem Object.is(x, y)
implica que as representações de byte de dois números de ponto flutuante x
e y
são iguais.
O uso de crypto.timingSafeEqual
não garante que o código circundante seja seguro em termos de tempo. Deve-se ter cuidado para garantir que o código circundante não introduza vulnerabilidades de tempo.
crypto.verify(algorithm, data, key, signature[, callback])
[Histórico]
Versão | Mudanças |
---|---|
v18.0.0 | Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK . |
v15.12.0 | Argumento de callback opcional adicionado. |
v15.0.0 | Os argumentos data, key e signature também podem ser ArrayBuffer. |
v13.2.0, v12.16.0 | Esta função agora suporta assinaturas IEEE-P1363 DSA e ECDSA. |
v12.0.0 | Adicionado em: v12.0.0 |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>callback
<Function>Retorna: <boolean>
true
oufalse
dependendo da validade da assinatura para os dados e chave pública se a funçãocallback
não for fornecida.
Verifica a assinatura fornecida para data
usando a chave e o algoritmo fornecidos. Se algorithm
for null
ou undefined
, o algoritmo depende do tipo de chave (especialmente Ed25519 e Ed448).
Se key
não for um KeyObject
, esta função se comporta como se key
tivesse sido passado para crypto.createPublicKey()
. Se for um objeto, as seguintes propriedades adicionais podem ser passadas:
dsaEncoding
<string> Para DSA e ECDSA, esta opção especifica o formato da assinatura. Pode ser um dos seguintes:'der'
(padrão): Estrutura de assinatura ASN.1 com codificação DER codificando(r, s)
.'ieee-p1363'
: Formato de assinaturar || s
conforme proposto no IEEE-P1363.
padding
<integer> Valor de preenchimento opcional para RSA, um dos seguintes:crypto.constants.RSA_PKCS1_PADDING
(padrão)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
usará MGF1 com a mesma função de hash usada para assinar a mensagem, conforme especificado na seção 3.1 de RFC 4055.
saltLength
<integer> Comprimento do salt para quando o preenchimento forRSA_PKCS1_PSS_PADDING
. O valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
define o comprimento do salt para o tamanho do resumo,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(padrão) o define para o valor máximo permitido.
O argumento signature
é a assinatura previamente calculada para os data
.
Como as chaves públicas podem ser derivadas de chaves privadas, uma chave privada ou uma chave pública pode ser passada para key
.
Se a função callback
for fornecida, esta função usa o threadpool do libuv.
crypto.webcrypto
Adicionado em: v15.0.0
Tipo: <Crypto> Uma implementação do padrão da Web Crypto API.
Consulte a documentação da Web Crypto API para obter detalhes.
Notas
Usando strings como entradas para APIs criptográficas
Por razões históricas, muitas APIs criptográficas fornecidas pelo Node.js aceitam strings como entradas onde o algoritmo criptográfico subjacente funciona em sequências de bytes. Esses exemplos incluem textos simples, textos cifrados, chaves simétricas, vetores de inicialização, senhas, salts, tags de autenticação e dados adicionais autenticados.
Ao passar strings para APIs criptográficas, considere os seguintes fatores.
- Nem todas as sequências de bytes são strings UTF-8 válidas. Portanto, quando uma sequência de bytes de comprimento
n
é derivada de uma string, sua entropia é geralmente menor do que a entropia de uma sequência den
bytes aleatória ou pseudoaleatória. Por exemplo, nenhuma string UTF-8 resultará na sequência de bytesc0 af
. Chaves secretas devem quase exclusivamente ser sequências de bytes aleatórias ou pseudoaleatórias. - Da mesma forma, ao converter sequências de bytes aleatórias ou pseudoaleatórias em strings UTF-8, subsequências que não representam pontos de código válidos podem ser substituídas pelo caractere de substituição Unicode (
U+FFFD
). A representação de bytes da string Unicode resultante pode, portanto, não ser igual à sequência de bytes da qual a string foi criada. As saídas de cifras, funções de hash, algoritmos de assinatura e funções de derivação de chave são sequências de bytes pseudoaleatórias e não devem ser usadas como strings Unicode. - Quando as strings são obtidas da entrada do usuário, alguns caracteres Unicode podem ser representados de várias maneiras equivalentes que resultam em sequências de bytes diferentes. Por exemplo, ao passar uma senha de usuário para uma função de derivação de chave, como PBKDF2 ou scrypt, o resultado da função de derivação de chave depende de se a string usa caracteres compostos ou decompostos. O Node.js não normaliza as representações de caracteres. Os desenvolvedores devem considerar o uso de
String.prototype.normalize()
nas entradas do usuário antes de passá-las para APIs criptográficas.
API de streams legada (anterior ao Node.js 0.10)
O módulo Crypto foi adicionado ao Node.js antes que houvesse o conceito de uma API Stream unificada e antes que houvesse objetos Buffer
para lidar com dados binários. Assim, muitas classes crypto
têm métodos que não são normalmente encontrados em outras classes Node.js que implementam a API de streams (por exemplo, update()
, final()
ou digest()
). Além disso, muitos métodos aceitavam e retornavam strings codificadas em 'latin1'
por padrão, em vez de Buffer
s. Esse padrão foi alterado após o Node.js v0.8 para usar objetos Buffer
por padrão.
Suporte para algoritmos fracos ou comprometidos
O módulo node:crypto
ainda suporta alguns algoritmos que já estão comprometidos e não são recomendados para uso. A API também permite o uso de cifras e hashes com um tamanho de chave pequeno, que são muito fracos para uso seguro.
Os usuários devem assumir total responsabilidade pela seleção do algoritmo criptográfico e do tamanho da chave de acordo com seus requisitos de segurança.
Com base nas recomendações do NIST SP 800-131A:
- MD5 e SHA-1 não são mais aceitáveis onde a resistência a colisões é necessária, como assinaturas digitais.
- Recomenda-se que a chave usada com algoritmos RSA, DSA e DH tenha pelo menos 2048 bits e a da curva de ECDSA e ECDH pelo menos 224 bits, para serem seguras para uso por vários anos.
- Os grupos DH de
modp1
,modp2
emodp5
têm um tamanho de chave menor que 2048 bits e não são recomendados.
Consulte a referência para outras recomendações e detalhes.
Alguns algoritmos que têm fraquezas conhecidas e são de pouca relevância na prática estão disponíveis apenas por meio do provedor legado, que não está habilitado por padrão.
Modo CCM
CCM é um dos algoritmos AEAD suportados. Aplicativos que usam este modo devem seguir certas restrições ao usar a API de cifra:
- O comprimento da tag de autenticação deve ser especificado durante a criação da cifra definindo a opção
authTagLength
e deve ser um de 4, 6, 8, 10, 12, 14 ou 16 bytes. - O comprimento do vetor de inicialização (nonce)
N
deve estar entre 7 e 13 bytes (7 ≤ N ≤ 13
). - O comprimento do texto sem formatação é limitado a
2 ** (8 * (15 - N))
bytes. - Ao descriptografar, a tag de autenticação deve ser definida via
setAuthTag()
antes de chamarupdate()
. Caso contrário, a descriptografia falhará efinal()
lançará um erro em conformidade com a seção 2.6 de RFC 3610. - O uso de métodos de stream como
write(data)
,end(data)
oupipe()
no modo CCM pode falhar, pois o CCM não pode lidar com mais de um bloco de dados por instância. - Ao passar dados autenticados adicionais (AAD), o comprimento da mensagem real em bytes deve ser passado para
setAAD()
por meio da opçãoplaintextLength
. Muitas bibliotecas de criptografia incluem a tag de autenticação no texto cifrado, o que significa que elas produzem textos cifrados do comprimentoplaintextLength + authTagLength
. O Node.js não inclui a tag de autenticação, portanto, o comprimento do texto cifrado é sempreplaintextLength
. Isso não é necessário se nenhum AAD for usado. - Como o CCM processa toda a mensagem de uma vez,
update()
deve ser chamado exatamente uma vez. - Mesmo que chamar
update()
seja suficiente para criptografar/descriptografar a mensagem, os aplicativos devem chamarfinal()
para calcular ou verificar a tag de autenticação.
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()
// Agora transmita { 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('Falha na autenticação!', { 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()
// Agora transmita { 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('Falha na autenticação!', { cause: err })
}
console.log(receivedPlaintext)
Modo FIPS
Ao usar o OpenSSL 3, o Node.js suporta FIPS 140-2 quando usado com um provedor OpenSSL 3 apropriado, como o provedor FIPS do OpenSSL 3 que pode ser instalado seguindo as instruções no arquivo README do FIPS do OpenSSL.
Para suporte a FIPS no Node.js, você precisará de:
- Um provedor OpenSSL 3 FIPS instalado corretamente.
- Um arquivo de configuração do módulo FIPS do OpenSSL 3.
- Um arquivo de configuração do OpenSSL 3 que referencia o arquivo de configuração do módulo FIPS.
O Node.js precisará ser configurado com um arquivo de configuração do OpenSSL que aponte para o provedor FIPS. Um exemplo de arquivo de configuração é este:
nodejs_conf = nodejs_init
.include /<caminho absoluto>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
[provider_sect]
default = default_sect
# O nome da seção fips deve corresponder ao nome da seção dentro do {#the-fips-section-name-should-match-the-section-name-inside-the}
# fipsmodule.cnf incluído.
fips = fips_sect
[default_sect]
activate = 1
onde fipsmodule.cnf
é o arquivo de configuração do módulo FIPS gerado a partir da etapa de instalação do provedor FIPS:
openssl fipsinstall
Defina a variável de ambiente OPENSSL_CONF
para apontar para o seu arquivo de configuração e OPENSSL_MODULES
para o local da biblioteca dinâmica do provedor FIPS. Ex:
export OPENSSL_CONF=/<caminho para o arquivo de configuração>/nodejs.cnf
export OPENSSL_MODULES=/<caminho para a lib openssl>/ossl-modules
O modo FIPS pode então ser habilitado no Node.js por:
- Iniciar o Node.js com as flags de linha de comando
--enable-fips
ou--force-fips
. - Chamar programaticamente
crypto.setFips(true)
.
Opcionalmente, o modo FIPS pode ser habilitado no Node.js por meio do arquivo de configuração do OpenSSL. Ex:
nodejs_conf = nodejs_init
.include /<caminho absoluto>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
alg_section = algorithm_sect
[provider_sect]
default = default_sect
# O nome da seção fips deve corresponder ao nome da seção dentro do {#included-fipsmodulecnf}
# fipsmodule.cnf incluído.
fips = fips_sect
[default_sect]
activate = 1
[algorithm_sect]
default_properties = fips=yes
Constantes de criptografia
As seguintes constantes exportadas por crypto.constants
se aplicam a vários usos dos módulos node:crypto
, node:tls
e node:https
e são geralmente específicas do OpenSSL.
Opções do OpenSSL
Consulte a lista de Flags SSL OP para obter detalhes.
Constante | Descrição |
---|---|
SSL_OP_ALL | Aplica várias soluções para bugs dentro do OpenSSL. Veja https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html para detalhes. |
SSL_OP_ALLOW_NO_DHE_KEX | Instrui o OpenSSL a permitir um modo de troca de chave não baseado em [EC]DHE para TLS v1.3 |
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION | Permite a renegociação legada insegura entre o OpenSSL e clientes ou servidores não corrigidos. Veja https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html . |
SSL_OP_CIPHER_SERVER_PREFERENCE | Tenta usar as preferências do servidor em vez das do cliente ao selecionar uma cifra. O comportamento depende da versão do protocolo. Veja https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html . |
SSL_OP_CISCO_ANYCONNECT | Instrui o OpenSSL a usar o identificador de versão da Cisco de DTLS_BAD_VER. |
SSL_OP_COOKIE_EXCHANGE | Instrui o OpenSSL a ativar a troca de cookies. |
SSL_OP_CRYPTOPRO_TLSEXT_BUG | Instrui o OpenSSL a adicionar a extensão server-hello de uma versão inicial do rascunho do cryptopro. |
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS | Instrui o OpenSSL a desabilitar uma solução para vulnerabilidade do SSL 3.0/TLS 1.0 adicionada no OpenSSL 0.9.6d. |
SSL_OP_LEGACY_SERVER_CONNECT | Permite a conexão inicial com servidores que não oferecem suporte a RI. |
SSL_OP_NO_COMPRESSION | Instrui o OpenSSL a desabilitar o suporte para compressão SSL/TLS. |
SSL_OP_NO_ENCRYPT_THEN_MAC | Instrui o OpenSSL a desabilitar o encrypt-then-MAC. |
SSL_OP_NO_QUERY_MTU | |
SSL_OP_NO_RENEGOTIATION | Instrui o OpenSSL a desabilitar a renegociação. |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION | Instrui o OpenSSL a sempre iniciar uma nova sessão ao realizar a renegociação. |
SSL_OP_NO_SSLv2 | Instrui o OpenSSL a desligar o SSL v2 |
SSL_OP_NO_SSLv3 | Instrui o OpenSSL a desligar o SSL v3 |
SSL_OP_NO_TICKET | Instrui o OpenSSL a desabilitar o uso de tickets RFC4507bis. |
SSL_OP_NO_TLSv1 | Instrui o OpenSSL a desligar o TLS v1 |
SSL_OP_NO_TLSv1_1 | Instrui o OpenSSL a desligar o TLS v1.1 |
SSL_OP_NO_TLSv1_2 | Instrui o OpenSSL a desligar o TLS v1.2 |
SSL_OP_NO_TLSv1_3 | Instrui o OpenSSL a desligar o TLS v1.3 |
SSL_OP_PRIORITIZE_CHACHA | Instrui o servidor OpenSSL a priorizar ChaCha20-Poly1305 quando o cliente o fizer. Esta opção não tem efeito se SSL_OP_CIPHER_SERVER_PREFERENCE não estiver habilitado. |
SSL_OP_TLS_ROLLBACK_BUG | Instrui o OpenSSL a desabilitar a detecção de ataque de reversão de versão. |
Constantes do motor OpenSSL
Constante | Descrição |
---|---|
ENGINE_METHOD_RSA | Limitar o uso do motor para RSA |
ENGINE_METHOD_DSA | Limitar o uso do motor para DSA |
ENGINE_METHOD_DH | Limitar o uso do motor para DH |
ENGINE_METHOD_RAND | Limitar o uso do motor para RAND |
ENGINE_METHOD_EC | Limitar o uso do motor para EC |
ENGINE_METHOD_CIPHERS | Limitar o uso do motor para CIPHERS |
ENGINE_METHOD_DIGESTS | Limitar o uso do motor para DIGESTS |
ENGINE_METHOD_PKEY_METHS | Limitar o uso do motor para PKEY_METHS |
ENGINE_METHOD_PKEY_ASN1_METHS | Limitar o uso do motor para PKEY_ASN1_METHS |
ENGINE_METHOD_ALL | |
ENGINE_METHOD_NONE |
Outras constantes do OpenSSL
Constante | Descrição |
---|---|
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 | Define o comprimento do salt para RSA_PKCS1_PSS_PADDING para o tamanho do digest ao assinar ou verificar. |
RSA_PSS_SALTLEN_MAX_SIGN | Define o comprimento do salt para RSA_PKCS1_PSS_PADDING para o valor máximo permissível ao assinar dados. |
RSA_PSS_SALTLEN_AUTO | Faz com que o comprimento do salt para RSA_PKCS1_PSS_PADDING seja determinado automaticamente ao verificar uma assinatura. |
POINT_CONVERSION_COMPRESSED | |
POINT_CONVERSION_UNCOMPRESSED | |
POINT_CONVERSION_HYBRID |
Constantes de criptografia do Node.js
Constante | Descrição |
---|---|
defaultCoreCipherList | Especifica a lista de cifras padrão incorporada usada pelo Node.js. |
defaultCipherList | Especifica a lista de cifras padrão ativa usada pelo processo atual do Node.js. |