Crypto
[Estable: 2 - Estable]
Estable: 2 Estabilidad: 2 - Estable
Código fuente: lib/crypto.js
El módulo node:crypto
proporciona funcionalidad criptográfica que incluye un conjunto de wrappers para las funciones hash, HMAC, cifrado, descifrado, firma y verificación de OpenSSL.
const { createHmac } = await import('node:crypto');
const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
const { createHmac } = require('node:crypto');
const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
Determinar si el soporte de crypto no está disponible
Es posible que Node.js se construya sin incluir soporte para el módulo node:crypto
. En tales casos, intentar import
desde crypto
o llamar a require('node:crypto')
resultará en un error.
Cuando se utiliza CommonJS, el error lanzado puede ser capturado utilizando try/catch:
let crypto;
try {
crypto = require('node:crypto');
} catch (err) {
console.error('¡el soporte de crypto está deshabilitado!');
}
Cuando se utiliza la palabra clave léxica ESM import
, el error solo puede ser capturado si un controlador para process.on('uncaughtException')
está registrado antes de cualquier intento de cargar el módulo (utilizando, por ejemplo, un módulo de precarga).
Cuando se utiliza ESM, si existe la posibilidad de que el código se ejecute en una compilación de Node.js donde el soporte de crypto no está habilitado, considere la posibilidad de utilizar la función import()
en lugar de la palabra clave léxica import
:
let crypto;
try {
crypto = await import('node:crypto');
} catch (err) {
console.error('¡el soporte de crypto está deshabilitado!');
}
Clase: Certificate
Agregado en: v0.11.8
SPKAC es un mecanismo de Solicitud de Firma de Certificado implementado originalmente por Netscape y especificado formalmente como parte del elemento keygen
de HTML5.
\<keygen\>
está obsoleto desde HTML 5.2 y los nuevos proyectos ya no deberían usar este elemento.
El módulo node:crypto
proporciona la clase Certificate
para trabajar con datos SPKAC. El uso más común es el manejo de la salida generada por el elemento \<keygen\>
de HTML5. Node.js utiliza internamente la implementación SPKAC de OpenSSL.
Método estático: Certificate.exportChallenge(spkac[, encoding])
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | El argumento spkac puede ser un ArrayBuffer. Se limitó el tamaño del argumento spkac a un máximo de 2**31 - 1 bytes. |
v9.0.0 | Agregado en: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenaspkac
.- Devuelve: <Buffer> El componente de desafío de la estructura de datos
spkac
, que incluye una clave pública y un desafío.
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Imprime: el desafío como una cadena UTF8
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Imprime: el desafío como una cadena UTF8
Método estático: Certificate.exportPublicKey(spkac[, encoding])
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | El argumento spkac puede ser un ArrayBuffer. Se limitó el tamaño del argumento spkac a un máximo de 2**31 - 1 bytes. |
v9.0.0 | Añadido en: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenaspkac
.- Devuelve: <Buffer> El componente de clave pública de la estructura de datos
spkac
, que incluye una clave pública y un desafío.
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>
Método estático: Certificate.verifySpkac(spkac[, encoding])
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | El argumento spkac puede ser un ArrayBuffer. Se agregó la codificación. Se limitó el tamaño del argumento spkac a un máximo de 2**31 - 1 bytes. |
v9.0.0 | Añadido en: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenaspkac
.- Devuelve: <boolean>
true
si la estructura de datosspkac
dada es válida,false
en caso contrario.
import { Buffer } from 'node:buffer';
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// Prints: true or false
const { Buffer } = require('node:buffer');
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// Prints: true or false
API Legado
[Estable: 0 - Obsoleto]
Estable: 0 Estabilidad: 0 - Obsoleto
Como una interfaz legada, es posible crear nuevas instancias de la clase crypto.Certificate
como se ilustra en los ejemplos a continuación.
new crypto.Certificate()
Las instancias de la clase Certificate
pueden ser creadas usando la palabra clave new
o llamando a crypto.Certificate()
como una función:
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])
Añadido en: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenaspkac
.- Devuelve: <Buffer> El componente de desafío de la estructura de datos
spkac
, que incluye una clave pública y un desafío.
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Prints: the challenge as a UTF8 string
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Prints: the challenge as a UTF8 string
certificate.exportPublicKey(spkac[, encoding])
Agregado en: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenaspkac
.- Devuelve: <Buffer> El componente de clave pública de la estructura de datos
spkac
, que incluye una clave pública y un desafío.
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Imprime: la clave pública como <Buffer ...>
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Imprime: la clave pública como <Buffer ...>
certificate.verifySpkac(spkac[, encoding])
Agregado en: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenaspkac
.- Devuelve: <boolean>
true
si la estructura de datosspkac
dada es válida,false
en caso contrario.
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 o 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 o false
Clase: Cipher
Añadido en: v0.1.94
- Extiende: <stream.Transform>
Las instancias de la clase Cipher
se utilizan para cifrar datos. La clase se puede utilizar de dos maneras:
- Como un stream que es tanto legible como escribible, donde los datos planos no cifrados se escriben para producir datos cifrados en el lado legible, o
- Utilizando los métodos
cipher.update()
ycipher.final()
para producir los datos cifrados.
El método crypto.createCipheriv()
se utiliza para crear instancias de Cipher
. Los objetos Cipher
no deben crearse directamente utilizando la palabra clave new
.
Ejemplo: Usando objetos Cipher
como streams:
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
// Once we have the key and iv, we can create and use the cipher...
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = '';
cipher.setEncoding('hex');
cipher.on('data', (chunk) => encrypted += chunk);
cipher.on('end', () => console.log(encrypted));
cipher.write('some clear text data');
cipher.end();
});
});
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
// Once we have the key and iv, we can create and use the cipher...
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = '';
cipher.setEncoding('hex');
cipher.on('data', (chunk) => encrypted += chunk);
cipher.on('end', () => console.log(encrypted));
cipher.write('some clear text data');
cipher.end();
});
});
Ejemplo: Usando Cipher
y streams canalizados:
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import {
pipeline,
} from 'node:stream';
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
const input = createReadStream('test.js');
const output = createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const {
pipeline,
} = require('node:stream');
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
const input = createReadStream('test.js');
const output = createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
Ejemplo: Usando los métodos cipher.update()
y cipher.final()
:
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);
});
});
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);
});
});
cipher.final([outputEncoding])
Agregado en: v0.1.94
outputEncoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string> Cualquier contenido cifrado restante. Si se especifica
outputEncoding
, se devuelve una cadena. Si no se proporcionaoutputEncoding
, se devuelve unBuffer
.
Una vez que se ha llamado al método cipher.final()
, el objeto Cipher
ya no se puede usar para cifrar datos. Los intentos de llamar a cipher.final()
más de una vez provocarán que se arroje un error.
cipher.getAuthTag()
Agregado en: v1.0.0
- Devuelve: <Buffer> Cuando se utiliza un modo de cifrado autenticado (actualmente se admiten
GCM
,CCM
,OCB
ychacha20-poly1305
), el métodocipher.getAuthTag()
devuelve unBuffer
que contiene la etiqueta de autenticación que se ha calculado a partir de los datos proporcionados.
El método cipher.getAuthTag()
solo debe llamarse una vez que el cifrado se haya completado utilizando el método cipher.final()
.
Si la opción authTagLength
se estableció durante la creación de la instancia cipher
, esta función devolverá exactamente authTagLength
bytes.
cipher.setAAD(buffer[, options])
Agregado en: v1.0.0
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object>stream.transform
opcionesDevuelve: <Cipher> La misma instancia de
Cipher
para el encadenamiento de métodos.
Cuando se utiliza un modo de cifrado autenticado (actualmente se admiten GCM
, CCM
, OCB
y chacha20-poly1305
), el método cipher.setAAD()
establece el valor utilizado para el parámetro de entrada datos autenticados adicionales (AAD).
La opción plaintextLength
es opcional para GCM
y OCB
. Cuando se utiliza CCM
, la opción plaintextLength
debe especificarse y su valor debe coincidir con la longitud del texto sin cifrar en bytes. Consulte modo CCM.
El método cipher.setAAD()
debe llamarse antes de cipher.update()
.
cipher.setAutoPadding([autoPadding])
Agregado en: v0.7.1
autoPadding
<boolean> Predeterminado:true
- Devuelve: <Cipher> La misma instancia de
Cipher
para el encadenamiento de métodos.
Cuando se utilizan algoritmos de cifrado por bloques, la clase Cipher
agregará automáticamente relleno a los datos de entrada al tamaño de bloque apropiado. Para deshabilitar el relleno predeterminado, llame a cipher.setAutoPadding(false)
.
Cuando autoPadding
es false
, la longitud de todos los datos de entrada debe ser un múltiplo del tamaño de bloque del cifrado o cipher.final()
generará un error. Deshabilitar el relleno automático es útil para el relleno no estándar, por ejemplo, usar 0x0
en lugar del relleno PKCS.
El método cipher.setAutoPadding()
debe llamarse antes de cipher.final()
.
cipher.update(data[, inputEncoding][, outputEncoding])
[Historial]
Versión | Cambios |
---|---|
v6.0.0 | El inputEncoding predeterminado cambió de binary a utf8 . |
v0.1.94 | Agregado en: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de los datos.outputEncoding
<string> La codificación del valor devuelto.- Devuelve: <Buffer> | <string>
Actualiza el cifrado con data
. Si se proporciona el argumento inputEncoding
, el argumento data
es una cadena que utiliza la codificación especificada. Si no se proporciona el argumento inputEncoding
, data
debe ser un Buffer
, TypedArray
o DataView
. Si data
es un Buffer
, TypedArray
o DataView
, entonces se ignora inputEncoding
.
El outputEncoding
especifica el formato de salida de los datos cifrados. Si se especifica outputEncoding
, se devuelve una cadena que utiliza la codificación especificada. Si no se proporciona outputEncoding
, se devuelve un Buffer
.
El método cipher.update()
se puede llamar varias veces con datos nuevos hasta que se llame a cipher.final()
. Llamar a cipher.update()
después de cipher.final()
provocará que se produzca un error.
Clase: Decipher
Agregado en: v0.1.94
- Extiende: <stream.Transform>
Las instancias de la clase Decipher
se utilizan para descifrar datos. La clase se puede usar de dos maneras:
- Como un stream que es tanto legible como escribible, donde se escriben datos cifrados sin formato para producir datos descifrados en el lado legible, o
- Usando los métodos
decipher.update()
ydecipher.final()
para producir los datos descifrados.
El método crypto.createDecipheriv()
se utiliza para crear instancias de Decipher
. Los objetos Decipher
no deben crearse directamente usando la palabra clave new
.
Ejemplo: Usando objetos Decipher
como streams:
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
let decrypted = '';
decipher.on('readable', () => {
let chunk;
while (null !== (chunk = decipher.read())) {
decrypted += chunk.toString('utf8');
}
});
decipher.on('end', () => {
console.log(decrypted);
// Prints: some clear text data
});
// Encrypted with same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
let decrypted = '';
decipher.on('readable', () => {
let chunk;
while (null !== (chunk = decipher.read())) {
decrypted += chunk.toString('utf8');
}
});
decipher.on('end', () => {
console.log(decrypted);
// Prints: some clear text data
});
// Encrypted with same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();
Ejemplo: Usando Decipher
y streams canalizados:
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
const input = createReadStream('test.enc');
const output = createWriteStream('test.js');
input.pipe(decipher).pipe(output);
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
const input = createReadStream('test.enc');
const output = createWriteStream('test.js');
input.pipe(decipher).pipe(output);
Ejemplo: Usando los métodos decipher.update()
y decipher.final()
:
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
// Encrypted using same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
// Encrypted using same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data
decipher.final([outputEncoding])
Añadido en: v0.1.94
outputEncoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string> Cualquier contenido descifrado restante. Si se especifica
outputEncoding
, se devuelve una cadena. Si no se proporcionaoutputEncoding
, se devuelve unBuffer
.
Una vez que se ha llamado al método decipher.final()
, el objeto Decipher
ya no se puede utilizar para descifrar datos. Los intentos de llamar a decipher.final()
más de una vez provocarán que se lance un error.
decipher.setAAD(buffer[, options])
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | El argumento buffer puede ser una cadena o ArrayBuffer y está limitado a no más de 2 ** 31 - 1 bytes. |
v7.2.0 | Este método ahora devuelve una referencia a decipher . |
v1.0.0 | Añadido en: v1.0.0 |
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object>stream.transform
opcionesDevuelve: <Decipher> El mismo Decipher para el encadenamiento de métodos.
Cuando se utiliza un modo de cifrado autenticado (actualmente se admiten GCM
, CCM
, OCB
y chacha20-poly1305
), el método decipher.setAAD()
establece el valor utilizado para el parámetro de entrada de datos autenticados adicionales (AAD).
El argumento options
es opcional para GCM
. Cuando se utiliza CCM
, se debe especificar la opción plaintextLength
y su valor debe coincidir con la longitud del texto cifrado en bytes. Consulte modo CCM.
El método decipher.setAAD()
debe llamarse antes de decipher.update()
.
Cuando se pasa una cadena como buffer
, considere advertencias al usar cadenas como entradas para las API criptográficas.
decipher.setAuthTag(buffer[, encoding])
[Historial]
Versión | Cambios |
---|---|
v22.0.0, v20.13.0 | El uso de longitudes de etiqueta GCM distintas de 128 bits sin especificar la opción authTagLength al crear decipher está obsoleto. |
v15.0.0 | El argumento buffer puede ser una cadena o ArrayBuffer y está limitado a no más de 2 ** 31 - 1 bytes. |
v11.0.0 | Este método ahora lanza un error si la longitud de la etiqueta GCM no es válida. |
v7.2.0 | Este método ahora devuelve una referencia a decipher . |
v1.0.0 | Añadido en: v1.0.0 |
buffer
<string> | <Buffer> | <ArrayBuffer> | <TypedArray> | <DataView>encoding
<string> Codificación de cadena a utilizar cuandobuffer
es una cadena.- Devuelve: <Decipher> El mismo Decipher para el encadenamiento de métodos.
Cuando se utiliza un modo de cifrado autenticado (actualmente se admiten GCM
, CCM
, OCB
y chacha20-poly1305
), el método decipher.setAuthTag()
se utiliza para pasar la etiqueta de autenticación recibida. Si no se proporciona ninguna etiqueta, o si el texto cifrado ha sido manipulado, decipher.final()
lanzará un error, indicando que el texto cifrado debe ser descartado debido a un fallo de autenticación. Si la longitud de la etiqueta no es válida según NIST SP 800-38D o no coincide con el valor de la opción authTagLength
, decipher.setAuthTag()
lanzará un error.
El método decipher.setAuthTag()
debe ser llamado antes de decipher.update()
para el modo CCM
o antes de decipher.final()
para los modos GCM
y OCB
y chacha20-poly1305
. decipher.setAuthTag()
sólo puede ser llamado una vez.
Cuando se pasa una cadena como etiqueta de autenticación, por favor, considere advertencias al usar cadenas como entradas para las APIs criptográficas.
decipher.setAutoPadding([autoPadding])
Agregado en: v0.7.1
autoPadding
<boolean> Predeterminado:true
- Devuelve: <Decipher> El mismo Decipher para el encadenamiento de métodos.
Cuando los datos se han cifrado sin relleno de bloque estándar, llamar a decipher.setAutoPadding(false)
desactivará el relleno automático para evitar que decipher.final()
compruebe y elimine el relleno.
Desactivar el relleno automático solo funcionará si la longitud de los datos de entrada es un múltiplo del tamaño del bloque de los cifrados.
El método decipher.setAutoPadding()
debe ser llamado antes de decipher.final()
.
decipher.update(data[, inputEncoding][, outputEncoding])
[Historial]
Versión | Cambios |
---|---|
v6.0.0 | El inputEncoding predeterminado cambió de binary a utf8 . |
v0.1.94 | Agregado en: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de la cadenadata
.outputEncoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Actualiza el descifrado con data
. Si se proporciona el argumento inputEncoding
, el argumento data
es una cadena que utiliza la codificación especificada. Si no se proporciona el argumento inputEncoding
, data
debe ser un Buffer
. Si data
es un Buffer
entonces inputEncoding
se ignora.
El outputEncoding
especifica el formato de salida de los datos cifrados. Si se especifica el outputEncoding
, se devuelve una cadena utilizando la codificación especificada. Si no se proporciona ningún outputEncoding
, se devuelve un Buffer
.
El método decipher.update()
se puede llamar varias veces con nuevos datos hasta que se llame a decipher.final()
. Llamar a decipher.update()
después de decipher.final()
provocará que se lance un error.
Incluso si el cifrado subyacente implementa la autenticación, la autenticidad y la integridad del texto plano devuelto por esta función pueden ser inciertas en este momento. Para los algoritmos de cifrado autenticados, la autenticidad generalmente solo se establece cuando la aplicación llama a decipher.final()
.
Clase: DiffieHellman
Añadido en: v0.5.0
La clase DiffieHellman
es una utilidad para crear intercambios de claves Diffie-Hellman.
Las instancias de la clase DiffieHellman
se pueden crear utilizando la función crypto.createDiffieHellman()
.
import assert from 'node:assert';
const {
createDiffieHellman,
} = await import('node:crypto');
// Generar las claves de Alice...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Generar las claves de Bob...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// Intercambiar y generar el secreto...
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');
// Generar las claves de Alice...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Generar las claves de Bob...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// Intercambiar y generar el secreto...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
Añadido en: v0.5.0
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de una cadenaotherPublicKey
.outputEncoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Calcula el secreto compartido usando otherPublicKey
como la clave pública de la otra parte y devuelve el secreto compartido calculado. La clave proporcionada se interpreta utilizando el inputEncoding
especificado, y el secreto se codifica utilizando el outputEncoding
especificado. Si no se proporciona el inputEncoding
, se espera que otherPublicKey
sea un Buffer
, TypedArray
o DataView
.
Si se proporciona outputEncoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
diffieHellman.generateKeys([encoding])
Añadido en: v0.5.0
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Genera valores de clave Diffie-Hellman privada y pública a menos que ya hayan sido generados o calculados, y devuelve la clave pública en la encoding
especificada. Esta clave debe ser transferida a la otra parte. Si se proporciona encoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
Esta función es un simple contenedor alrededor de DH_generate_key()
. En particular, una vez que se ha generado o establecido una clave privada, la llamada a esta función solo actualiza la clave pública, pero no genera una nueva clave privada.
diffieHellman.getGenerator([encoding])
Añadido en: v0.5.0
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Devuelve el generador Diffie-Hellman en la encoding
especificada. Si se proporciona encoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
diffieHellman.getPrime([encoding])
Añadido en: v0.5.0
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Devuelve el primo Diffie-Hellman en la encoding
especificada. Si se proporciona encoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
diffieHellman.getPrivateKey([encoding])
Agregado en: v0.5.0
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Devuelve la clave privada de Diffie-Hellman en la encoding
especificada. Si se proporciona encoding
, se devuelve una string; de lo contrario, se devuelve un Buffer
.
diffieHellman.getPublicKey([encoding])
Agregado en: v0.5.0
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Devuelve la clave pública de Diffie-Hellman en la encoding
especificada. Si se proporciona encoding
, se devuelve una string; de lo contrario, se devuelve un Buffer
.
diffieHellman.setPrivateKey(privateKey[, encoding])
Agregado en: v0.5.0
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la stringprivateKey
.
Establece la clave privada Diffie-Hellman. Si se proporciona el argumento encoding
, se espera que privateKey
sea una string. Si no se proporciona encoding
, se espera que privateKey
sea un Buffer
, TypedArray
o DataView
.
Esta función no calcula automáticamente la clave pública asociada. Se puede usar diffieHellman.setPublicKey()
o diffieHellman.generateKeys()
para proporcionar manualmente la clave pública o para derivarla automáticamente.
diffieHellman.setPublicKey(publicKey[, encoding])
Agregado en: v0.5.0
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenapublicKey
.
Establece la clave pública de Diffie-Hellman. Si se proporciona el argumento encoding
, se espera que publicKey
sea una cadena. Si no se proporciona encoding
, se espera que publicKey
sea un Buffer
, TypedArray
o DataView
.
diffieHellman.verifyError
Agregado en: v0.11.12
Un campo de bits que contiene cualquier advertencia y/o error resultante de una verificación realizada durante la inicialización del objeto DiffieHellman
.
Los siguientes valores son válidos para esta propiedad (como se define en el módulo node:constants
):
DH_CHECK_P_NOT_SAFE_PRIME
DH_CHECK_P_NOT_PRIME
DH_UNABLE_TO_CHECK_GENERATOR
DH_NOT_SUITABLE_GENERATOR
Clase: DiffieHellmanGroup
Agregado en: v0.7.5
La clase DiffieHellmanGroup
toma un grupo modp bien conocido como su argumento. Funciona igual que DiffieHellman
, excepto que no permite cambiar sus claves después de la creación. En otras palabras, no implementa los métodos setPublicKey()
o setPrivateKey()
.
const { createDiffieHellmanGroup } = await import('node:crypto');
const dh = createDiffieHellmanGroup('modp16');
const { createDiffieHellmanGroup } = require('node:crypto');
const dh = createDiffieHellmanGroup('modp16');
Los siguientes grupos son compatibles:
'modp14'
(2048 bits, RFC 3526 Sección 3)'modp15'
(3072 bits, RFC 3526 Sección 4)'modp16'
(4096 bits, RFC 3526 Sección 5)'modp17'
(6144 bits, RFC 3526 Sección 6)'modp18'
(8192 bits, RFC 3526 Sección 7)
Los siguientes grupos todavía son compatibles pero están obsoletos (ver Advertencias):
'modp1'
(768 bits, RFC 2409 Sección 6.1)'modp2'
(1024 bits, RFC 2409 Sección 6.2)'modp5'
(1536 bits, RFC 3526 Sección 2)
Estos grupos obsoletos podrían eliminarse en futuras versiones de Node.js.
Clase: ECDH
Agregado en: v0.11.14
La clase ECDH
es una utilidad para crear intercambios de claves Diffie-Hellman de curva elíptica (ECDH).
Las instancias de la clase ECDH
se pueden crear usando la función crypto.createECDH()
.
import assert from 'node:assert';
const {
createECDH,
} = await import('node:crypto');
// Genera las claves de Alice...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();
// Genera las claves de Bob...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();
// Intercambia y genera el secreto...
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');
// Genera las claves de Alice...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();
// Genera las claves de Bob...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();
// Intercambia y genera el secreto...
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]]])
Agregado en: v10.0.0
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>curve
<string>inputEncoding
<string> La codificación de la cadenakey
.outputEncoding
<string> La codificación del valor de retorno.format
<string> Predeterminado:'uncompressed'
- Devuelve: <Buffer> | <string>
Convierte la clave pública EC Diffie-Hellman especificada por key
y curve
al formato especificado por format
. El argumento format
especifica la codificación de puntos y puede ser 'compressed'
, 'uncompressed'
o 'hybrid'
. La clave suministrada se interpreta utilizando la inputEncoding
especificada, y la clave devuelta se codifica utilizando la outputEncoding
especificada.
Utilice crypto.getCurves()
para obtener una lista de nombres de curvas disponibles. En las versiones recientes de OpenSSL, openssl ecparam -list_curves
también mostrará el nombre y la descripción de cada curva elíptica disponible.
Si no se especifica format
, el punto se devolverá en formato 'uncompressed'
.
Si no se proporciona inputEncoding
, se espera que key
sea un Buffer
, TypedArray
o DataView
.
Ejemplo (descomprimiendo una clave):
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');
// La clave convertida y la clave pública sin comprimir deben ser iguales
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');
// La clave convertida y la clave pública sin comprimir deben ser iguales
console.log(uncompressedKey === ecdh.getPublicKey('hex'));
ecdh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
[Historial]
Versión | Cambios |
---|---|
v10.0.0 | Se cambió el formato de error para admitir mejor el error de clave pública no válida. |
v6.0.0 | El inputEncoding predeterminado cambió de binary a utf8 . |
v0.11.14 | Añadido en: v0.11.14 |
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de la cadenaotherPublicKey
.outputEncoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Calcula el secreto compartido usando otherPublicKey
como la clave pública de la otra parte y devuelve el secreto compartido calculado. La clave suministrada se interpreta utilizando el inputEncoding
especificado, y el secreto devuelto se codifica utilizando el outputEncoding
especificado. Si no se proporciona el inputEncoding
, se espera que otherPublicKey
sea un Buffer
, TypedArray
o DataView
.
Si se proporciona outputEncoding
, se devolverá una cadena; de lo contrario, se devolverá un Buffer
.
ecdh.computeSecret
lanzará un error ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
cuando otherPublicKey
se encuentre fuera de la curva elíptica. Dado que otherPublicKey
generalmente se suministra desde un usuario remoto a través de una red insegura, asegúrese de manejar esta excepción en consecuencia.
ecdh.generateKeys([encoding[, format]])
Agregado en: v0.11.14
encoding
<string> La codificación del valor de retorno.format
<string> Predeterminado:'uncompressed'
- Devuelve: <Buffer> | <string>
Genera valores de clave privada y pública EC Diffie-Hellman, y devuelve la clave pública en el format
y encoding
especificados. Esta clave debe transferirse a la otra parte.
El argumento format
especifica la codificación de puntos y puede ser 'compressed'
o 'uncompressed'
. Si no se especifica format
, el punto se devolverá en formato 'uncompressed'
.
Si se proporciona encoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
ecdh.getPrivateKey([encoding])
Agregado en: v0.11.14
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string> El EC Diffie-Hellman en el
encoding
especificado.
Si se especifica encoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
ecdh.getPublicKey([encoding][, format])
Agregado en: v0.11.14
encoding
<string> La codificación del valor de retorno.format
<string> Predeterminado:'uncompressed'
- Devuelve: <Buffer> | <string> La clave pública EC Diffie-Hellman en el
encoding
yformat
especificados.
El argumento format
especifica la codificación de puntos y puede ser 'compressed'
o 'uncompressed'
. Si no se especifica format
, el punto se devolverá en formato 'uncompressed'
.
Si se especifica encoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
ecdh.setPrivateKey(privateKey[, encoding])
Añadido en: v0.11.14
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenaprivateKey
.
Establece la clave privada EC Diffie-Hellman. Si se proporciona encoding
, se espera que privateKey
sea una cadena; de lo contrario, se espera que privateKey
sea un Buffer
, TypedArray
o DataView
.
Si privateKey
no es válido para la curva especificada cuando se creó el objeto ECDH
, se genera un error. Al establecer la clave privada, también se genera el punto (clave) público asociado y se establece en el objeto ECDH
.
ecdh.setPublicKey(publicKey[, encoding])
Añadido en: v0.11.14
Obsoleto desde: v5.2.0
[Estable: 0 - Obsoleto]
Estable: 0 Estabilidad: 0 - Obsoleto
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de la cadenapublicKey
.
Establece la clave pública EC Diffie-Hellman. Si se proporciona encoding
, se espera que publicKey
sea una cadena; de lo contrario, se espera un Buffer
, TypedArray
o DataView
.
Normalmente, no hay razón para llamar a este método porque ECDH
solo requiere una clave privada y la clave pública de la otra parte para calcular el secreto compartido. Por lo general, se llamará a ecdh.generateKeys()
o ecdh.setPrivateKey()
. El método ecdh.setPrivateKey()
intenta generar el punto/clave pública asociado con la clave privada que se está estableciendo.
Ejemplo (obtención de un secreto compartido):
const {
createECDH,
createHash,
} = await import('node:crypto');
const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');
// This is a shortcut way of specifying one of Alice's previous private
// keys. It would be unwise to use such a predictable private key in a real
// application.
alice.setPrivateKey(
createHash('sha256').update('alice', 'utf8').digest(),
);
// Bob uses a newly generated cryptographically strong
// pseudorandom key pair
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
// aliceSecret and bobSecret should be the same shared secret value
console.log(aliceSecret === bobSecret);
const {
createECDH,
createHash,
} = require('node:crypto');
const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');
// This is a shortcut way of specifying one of Alice's previous private
// keys. It would be unwise to use such a predictable private key in a real
// application.
alice.setPrivateKey(
createHash('sha256').update('alice', 'utf8').digest(),
);
// Bob uses a newly generated cryptographically strong
// pseudorandom key pair
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
// aliceSecret and bobSecret should be the same shared secret value
console.log(aliceSecret === bobSecret);
Clase: Hash
Añadido en: v0.1.92
- Extiende: <stream.Transform>
La clase Hash
es una utilidad para crear resúmenes hash de datos. Puede utilizarse de dos maneras:
- Como un stream que es tanto legible como escribible, donde los datos se escriben para producir un resumen hash calculado en el lado legible, o
- Utilizando los métodos
hash.update()
yhash.digest()
para producir el hash calculado.
El método crypto.createHash()
se utiliza para crear instancias de Hash
. Los objetos Hash
no deben crearse directamente utilizando la palabra clave new
.
Ejemplo: Utilización de objetos Hash
como streams:
const {
createHash,
} = await import('node:crypto');
const hash = createHash('sha256');
hash.on('readable', () => {
// Sólo un elemento va a ser producido por el
// stream 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', () => {
// Sólo un elemento va a ser producido por el
// stream hash.
const data = hash.read();
if (data) {
console.log(data.toString('hex'));
// Imprime:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
});
hash.write('some data to hash');
hash.end();
Ejemplo: Utilización de Hash
y streams canalizados:
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);
Ejemplo: Utilización de los métodos hash.update()
y 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])
Agregado en: v13.1.0
options
<Objeto> Opciones destream.transform
- Devuelve: <Hash>
Crea un nuevo objeto Hash
que contiene una copia profunda del estado interno del objeto Hash
actual.
El argumento opcional options
controla el comportamiento del flujo. Para las funciones hash XOF como 'shake256'
, la opción outputLength
se puede utilizar para especificar la longitud de salida deseada en bytes.
Se produce un error cuando se intenta copiar el objeto Hash
después de que se haya llamado a su método hash.digest()
.
// Calcula un hash rodante.
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.
// Calcula un hash rodante.
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])
Agregado en: v0.1.92
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Calcula el resumen de todos los datos pasados para ser hasheados (usando el método hash.update()
). Si se proporciona encoding
se devolverá una cadena; de lo contrario, se devuelve un Buffer
.
El objeto Hash
no se puede volver a utilizar después de que se haya llamado al método hash.digest()
. Las llamadas múltiples provocarán que se lance un error.
hash.update(data[, inputEncoding])
[Historial]
Versión | Cambios |
---|---|
v6.0.0 | El inputEncoding predeterminado cambió de binary a utf8 . |
v0.1.92 | Añadido en: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de la cadenadata
.
Actualiza el contenido del hash con los data
dados, cuya codificación se indica en inputEncoding
. Si no se proporciona encoding
y los data
son una cadena, se aplica una codificación de 'utf8'
. Si data
es un Buffer
, TypedArray
o DataView
, entonces se ignora inputEncoding
.
Se puede llamar a esto muchas veces con nuevos datos a medida que se transmiten.
Clase: Hmac
Añadido en: v0.1.94
- Extiende: <stream.Transform>
La clase Hmac
es una utilidad para crear resúmenes criptográficos HMAC. Se puede usar de una de estas dos maneras:
- Como un stream que es tanto legible como escribible, donde los datos se escriben para producir un resumen HMAC calculado en el lado legible, o
- Usando los métodos
hmac.update()
yhmac.digest()
para producir el resumen HMAC calculado.
El método crypto.createHmac()
se usa para crear instancias de Hmac
. Los objetos Hmac
no deben crearse directamente usando la palabra clave new
.
Ejemplo: Usando objetos Hmac
como streams:
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = hmac.read();
if (data) {
console.log(data.toString('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f33ad9c87c518115a45971f7f77e
}
});
hmac.write('some data to hash');
hmac.end();
const {
createHmac,
} = require('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = hmac.read();
if (data) {
console.log(data.toString('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
});
hmac.write('some data to hash');
hmac.end();
Ejemplo: Usando Hmac
y streams canalizados:
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);
Ejemplo: Usando los métodos hmac.update()
y hmac.digest()
:
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
const {
createHmac,
} = require('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
hmac.digest([encoding])
Agregado en: v0.1.94
encoding
<string> La codificación del valor de retorno.- Devuelve: <Buffer> | <string>
Calcula el resumen HMAC de todos los datos pasados usando hmac.update()
. Si se proporciona encoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
El objeto Hmac
no se puede volver a utilizar después de que se haya llamado a hmac.digest()
. Las llamadas múltiples a hmac.digest()
provocarán que se lance un error.
hmac.update(data[, inputEncoding])
[Historial]
Versión | Cambios |
---|---|
v6.0.0 | El inputEncoding predeterminado cambió de binary a utf8 . |
v0.1.94 | Agregado en: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de la cadenadata
.
Actualiza el contenido de Hmac
con los data
dados, cuya codificación se da en inputEncoding
. Si no se proporciona encoding
y los data
son una cadena, se aplica una codificación de 'utf8'
. Si data
es un Buffer
, TypedArray
o DataView
, entonces inputEncoding
se ignora.
Esto se puede llamar muchas veces con nuevos datos a medida que se transmiten.
Clase: KeyObject
[Historial]
Versión | Cambios |
---|---|
v14.5.0, v12.19.0 | Las instancias de esta clase ahora se pueden pasar a hilos de trabajo usando postMessage . |
v11.13.0 | Esta clase ahora se exporta. |
v11.6.0 | Agregado en: v11.6.0 |
Node.js usa una clase KeyObject
para representar una clave simétrica o asimétrica, y cada tipo de clave expone diferentes funciones. Los métodos crypto.createSecretKey()
, crypto.createPublicKey()
y crypto.createPrivateKey()
se utilizan para crear instancias de KeyObject
. Los objetos KeyObject
no deben crearse directamente usando la palabra clave new
.
La mayoría de las aplicaciones deberían considerar usar la nueva API KeyObject
en lugar de pasar claves como cadenas o Buffer
s debido a las características de seguridad mejoradas.
Las instancias de KeyObject
se pueden pasar a otros hilos a través de postMessage()
. El receptor obtiene un KeyObject
clonado y el KeyObject
no necesita estar listado en el argumento transferList
.
Método estático: KeyObject.from(key)
Añadido en: v15.0.0
key
<CryptoKey>- Devuelve: <KeyObject>
Ejemplo: Convertir una instancia de CryptoKey
a un 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 (tamaño de la clave simétrica en 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 (tamaño de la clave simétrica en bytes)
})();
keyObject.asymmetricKeyDetails
[Historial]
Versión | Cambios |
---|---|
v16.9.0 | Expone los parámetros de la secuencia RSASSA-PSS-params para las claves RSA-PSS. |
v15.7.0 | Añadido en: v15.7.0 |
- <Object>
modulusLength
: <number> Tamaño de la clave en bits (RSA, DSA).publicExponent
: <bigint> Exponente público (RSA).hashAlgorithm
: <string> Nombre del resumen del mensaje (RSA-PSS).mgf1HashAlgorithm
: <string> Nombre del resumen del mensaje utilizado por MGF1 (RSA-PSS).saltLength
: <number> Longitud mínima de la sal en bytes (RSA-PSS).divisorLength
: <number> Tamaño deq
en bits (DSA).namedCurve
: <string> Nombre de la curva (EC).
Esta propiedad existe sólo en las claves asimétricas. Dependiendo del tipo de la clave, este objeto contiene información sobre la clave. Ninguna de la información obtenida a través de esta propiedad puede ser utilizada para identificar de forma única una clave o para comprometer la seguridad de la clave.
Para las claves RSA-PSS, si el material de la clave contiene una secuencia RSASSA-PSS-params
, las propiedades hashAlgorithm
, mgf1HashAlgorithm
y saltLength
se establecerán.
Otros detalles de la clave pueden ser expuestos a través de esta API utilizando atributos adicionales.
keyObject.asymmetricKeyType
[Historial]
Versión | Cambios |
---|---|
v13.9.0, v12.17.0 | Se agregó soporte para 'dh' . |
v12.0.0 | Se agregó soporte para 'rsa-pss' . |
v12.0.0 | Esta propiedad ahora devuelve undefined para instancias de KeyObject de tipo no reconocido en lugar de abortar. |
v12.0.0 | Se agregó soporte para 'x25519' y 'x448' . |
v12.0.0 | Se agregó soporte para 'ed25519' y 'ed448' . |
v11.6.0 | Agregado en: v11.6.0 |
Para claves asimétricas, esta propiedad representa el tipo de clave. Los tipos de clave admitidos son:
'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 propiedad es undefined
para tipos KeyObject
no reconocidos y claves simétricas.
keyObject.equals(otherKeyObject)
Agregado en: v17.7.0, v16.15.0
otherKeyObject
: <KeyObject> UnKeyObject
con el que compararkeyObject
.- Devuelve: <boolean>
Devuelve true
o false
dependiendo de si las claves tienen exactamente el mismo tipo, valor y parámetros. Este método no es de tiempo constante.
keyObject.export([options])
[Historial]
Versión | Cambios |
---|---|
v15.9.0 | Se agregó soporte para el formato 'jwk' . |
v11.6.0 | Agregado en: v11.6.0 |
Para claves simétricas, se pueden utilizar las siguientes opciones de codificación:
format
: <string> Debe ser'buffer'
(predeterminado) o'jwk'
.
Para claves públicas, se pueden utilizar las siguientes opciones de codificación:
type
: <string> Debe ser uno de'pkcs1'
(solo RSA) o'spki'
.format
: <string> Debe ser'pem'
,'der'
o'jwk'
.
Para claves privadas, se pueden utilizar las siguientes opciones de codificación:
type
: <string> Debe ser uno de'pkcs1'
(solo RSA),'pkcs8'
o'sec1'
(solo EC).format
: <string> Debe ser'pem'
,'der'
o'jwk'
.cipher
: <string> Si se especifica, la clave privada se cifrará con elcipher
y lapassphrase
dados utilizando el cifrado basado en contraseña PKCS#5 v2.0.passphrase
: <string> | <Buffer> La contraseña para usar para el cifrado, veacipher
.
El tipo de resultado depende del formato de codificación seleccionado, cuando PEM el resultado es una cadena, cuando DER será un búfer que contiene los datos codificados como DER, cuando JWK será un objeto.
Cuando se seleccionó el formato de codificación JWK, se ignoran todas las demás opciones de codificación.
Las claves de tipo PKCS#1, SEC1 y PKCS#8 se pueden cifrar utilizando una combinación de las opciones cipher
y format
. El type
PKCS#8 se puede utilizar con cualquier format
para cifrar cualquier algoritmo de clave (RSA, EC o DH) especificando un cipher
. PKCS#1 y SEC1 solo se pueden cifrar especificando un cipher
cuando se utiliza el format
PEM. Para una máxima compatibilidad, utilice PKCS#8 para claves privadas cifradas. Dado que PKCS#8 define su propio mecanismo de cifrado, el cifrado a nivel de PEM no es compatible al cifrar una clave PKCS#8. Consulte RFC 5208 para el cifrado PKCS#8 y RFC 1421 para el cifrado PKCS#1 y SEC1.
keyObject.symmetricKeySize
Añadido en: v11.6.0
Para claves secretas, esta propiedad representa el tamaño de la clave en bytes. Esta propiedad es undefined
para claves asimétricas.
keyObject.toCryptoKey(algorithm, extractable, keyUsages)
Añadido en: v23.0.0
algorithm
: <AlgorithmIdentifier> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>extractable
: <boolean>keyUsages
: <string[]> Consulte Usos de clave.- Devuelve: <CryptoKey>
Convierte una instancia de KeyObject
en una CryptoKey
.
keyObject.type
Añadido en: v11.6.0
Dependiendo del tipo de este KeyObject
, esta propiedad es 'secret'
para claves secretas (simétricas), 'public'
para claves públicas (asimétricas) o 'private'
para claves privadas (asimétricas).
Clase: Sign
Añadido en: v0.1.92
- Extiende: <stream.Writable>
La clase Sign
es una utilidad para generar firmas. Se puede usar de dos maneras:
- Como un flujo de escritura, donde se escriben los datos que se van a firmar y el método
sign.sign()
se utiliza para generar y devolver la firma, o - Usando los métodos
sign.update()
ysign.sign()
para producir la firma.
El método crypto.createSign()
se utiliza para crear instancias de Sign
. El argumento es el nombre de cadena de la función hash que se va a utilizar. Los objetos Sign
no deben crearse directamente utilizando la palabra clave new
.
Ejemplo: Usando objetos Sign
y Verify
como flujos:
const {
generateKeyPairSync,
createSign,
createVerify,
} = await import('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
});
const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');
const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Prints: true
const {
generateKeyPairSync,
createSign,
createVerify,
} = require('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
});
const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');
const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Prints: true
Ejemplo: Usando los métodos sign.update()
y verify.update()
:
const {
generateKeyPairSync,
createSign,
createVerify,
} = await import('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
});
const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);
const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Prints: true
const {
generateKeyPairSync,
createSign,
createVerify,
} = require('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
});
const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);
const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Prints: true
sign.sign(privateKey[, outputEncoding])
[Historia]
Versión | Cambios |
---|---|
v15.0.0 | La privateKey también puede ser un ArrayBuffer y CryptoKey. |
v13.2.0, v12.16.0 | Esta función ahora es compatible con firmas IEEE-P1363 DSA y ECDSA. |
v12.0.0 | Esta función ahora es compatible con claves RSA-PSS. |
v11.6.0 | Esta función ahora es compatible con objetos de clave. |
v8.0.0 | Se agregó soporte para RSASSA-PSS y opciones adicionales. |
v0.1.92 | Agregado en: v0.1.92 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>outputEncoding
<string> La codificación del valor de retorno.
Calcula la firma de todos los datos pasados a través de sign.update()
o sign.write()
.
Si privateKey
no es un KeyObject
, esta función se comporta como si privateKey
se hubiera pasado a crypto.createPrivateKey()
. Si es un objeto, se pueden pasar las siguientes propiedades adicionales:
dsaEncoding
<string> Para DSA y ECDSA, esta opción especifica el formato de la firma generada. Puede ser uno de los siguientes:'der'
(predeterminado): estructura de firma ASN.1 codificada en DER que codifica(r, s)
.'ieee-p1363'
: Formato de firmar || s
como se propone en IEEE-P1363.
padding
<integer> Valor de relleno opcional para RSA, uno de los siguientes:crypto.constants.RSA_PKCS1_PADDING
(predeterminado)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
usará MGF1 con la misma función hash utilizada para firmar el mensaje como se especifica en la sección 3.1 de RFC 4055, a menos que se haya especificado una función hash MGF1 como parte de la clave de acuerdo con la sección 3.3 de RFC 4055.
saltLength
<integer> Longitud de la sal cuando el relleno esRSA_PKCS1_PSS_PADDING
. El valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
establece la longitud de la sal al tamaño del resumen,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(predeterminado) la establece al valor máximo permisible.
Si se proporciona outputEncoding
, se devuelve una cadena; de lo contrario, se devuelve un Buffer
.
El objeto Sign
no se puede volver a utilizar después de que se haya llamado al método sign.sign()
. Varias llamadas a sign.sign()
provocarán que se produzca un error.
sign.update(data[, inputEncoding])
[Historial]
Versión | Cambios |
---|---|
v6.0.0 | La inputEncoding predeterminada cambió de binary a utf8 . |
v0.1.92 | Añadido en: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de la cadenadata
.
Actualiza el contenido de Sign
con los data
dados, cuya codificación se indica en inputEncoding
. Si no se proporciona encoding
y data
es una cadena, se aplica una codificación de 'utf8'
. Si data
es un Buffer
, TypedArray
o DataView
, entonces se ignora inputEncoding
.
Esto se puede llamar muchas veces con datos nuevos a medida que se transmiten.
Clase: Verify
Añadido en: v0.1.92
- Extiende: <stream.Writable>
La clase Verify
es una utilidad para verificar firmas. Se puede utilizar de una de estas dos maneras:
- Como un stream de escritura donde los datos escritos se utilizan para validar la firma suministrada, o
- Utilizando los métodos
verify.update()
yverify.verify()
para verificar la firma.
El método crypto.createVerify()
se utiliza para crear instancias de Verify
. Los objetos Verify
no se deben crear directamente utilizando la palabra clave new
.
Ver Sign
para ejemplos.
verify.update(data[, inputEncoding])
[Historial]
Versión | Cambios |
---|---|
v6.0.0 | La inputEncoding predeterminada cambió de binary a utf8 . |
v0.1.92 | Añadido en: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> La codificación de la cadenadata
.
Actualiza el contenido de Verify
con los data
dados, cuya codificación se indica en inputEncoding
. Si no se proporciona inputEncoding
y data
es una cadena, se aplica una codificación de 'utf8'
. Si data
es un Buffer
, TypedArray
o DataView
, entonces se ignora inputEncoding
.
Esto se puede llamar muchas veces con datos nuevos a medida que se transmiten.
verify.verify(object, signature[, signatureEncoding])
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | El objeto también puede ser un ArrayBuffer y CryptoKey. |
v13.2.0, v12.16.0 | Esta función ahora es compatible con las firmas DSA y ECDSA de IEEE-P1363. |
v12.0.0 | Esta función ahora es compatible con las claves RSA-PSS. |
v11.7.0 | La clave ahora puede ser una clave privada. |
v8.0.0 | Se añadió compatibilidad para RSASSA-PSS y opciones adicionales. |
v0.1.92 | Añadido en: v0.1.92 |
object
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>signatureEncoding
<string> La codificación de la cadenasignature
.Devuelve: <boolean>
true
ofalse
dependiendo de la validez de la firma para los datos y la clave pública.
Verifica los datos proporcionados utilizando el object
y la signature
dados.
Si object
no es un KeyObject
, esta función se comporta como si object
se hubiera pasado a crypto.createPublicKey()
. Si es un objeto, se pueden pasar las siguientes propiedades adicionales:
dsaEncoding
<string> Para DSA y ECDSA, esta opción especifica el formato de la firma. Puede ser uno de los siguientes:'der'
(predeterminado): Estructura de firma ASN.1 codificada en DER que codifica(r, s)
.'ieee-p1363'
: Formato de firmar || s
como se propone en IEEE-P1363.
padding
<integer> Valor de relleno opcional para RSA, uno de los siguientes:crypto.constants.RSA_PKCS1_PADDING
(predeterminado)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
utilizará MGF1 con la misma función hash utilizada para verificar el mensaje, tal como se especifica en la sección 3.1 de RFC 4055, a menos que se haya especificado una función hash MGF1 como parte de la clave de conformidad con la sección 3.3 de RFC 4055.
saltLength
<integer> Longitud de la sal para cuando el relleno esRSA_PKCS1_PSS_PADDING
. El valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
establece la longitud de la sal al tamaño del resumen,crypto.constants.RSA_PSS_SALTLEN_AUTO
(predeterminado) hace que se determine automáticamente.
El argumento signature
es la firma calculada previamente para los datos, en signatureEncoding
. Si se especifica un signatureEncoding
, se espera que signature
sea una cadena; de lo contrario, se espera que signature
sea un Buffer
, TypedArray
o DataView
.
El objeto verify
no se puede volver a utilizar después de que se haya llamado a verify.verify()
. Varias llamadas a verify.verify()
darán como resultado que se lance un error.
Dado que las claves públicas pueden derivarse de las claves privadas, se puede pasar una clave privada en lugar de una clave pública.
Clase: X509Certificate
Agregado en: v15.6.0
Encapsula un certificado X509 y proporciona acceso de solo lectura a su información.
const { X509Certificate } = await import('node:crypto');
const x509 = new X509Certificate('{... certificado codificado en pem ...}');
console.log(x509.subject);
const { X509Certificate } = require('node:crypto');
const x509 = new X509Certificate('{... certificado codificado en pem ...}');
console.log(x509.subject);
new X509Certificate(buffer)
Agregado en: v15.6.0
buffer
<string> | <TypedArray> | <Buffer> | <DataView> Un certificado X509 codificado en PEM o DER.
x509.ca
Agregado en: v15.6.0
- Tipo: <boolean> Será
true
si este es un certificado de Autoridad de Certificación (CA).
x509.checkEmail(email[, options])
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | La opción subject ahora tiene como valor predeterminado 'default' . |
v17.5.0, v16.15.0 | La opción subject ahora se puede establecer en 'default' . |
v17.5.0, v16.14.1 | Se eliminaron las opciones wildcards , partialWildcards , multiLabelWildcards y singleLabelSubdomains ya que no tenían ningún efecto. |
v15.6.0 | Agregado en: v15.6.0 |
email
<string>options
<Object>subject
<string>'default'
,'always'
o'never'
. Predeterminado:'default'
.
Devuelve: <string> | <undefined> Devuelve
email
si el certificado coincide,undefined
si no lo hace.
Comprueba si el certificado coincide con la dirección de correo electrónico dada.
Si la opción 'subject'
no está definida o está establecida en 'default'
, el asunto del certificado solo se considera si la extensión de nombre alternativo del asunto no existe o no contiene ninguna dirección de correo electrónico.
Si la opción 'subject'
está establecida en 'always'
y si la extensión de nombre alternativo del asunto no existe o no contiene una dirección de correo electrónico coincidente, se considera el asunto del certificado.
Si la opción 'subject'
está establecida en 'never'
, el asunto del certificado nunca se considera, incluso si el certificado no contiene nombres alternativos de asunto.
x509.checkHost(name[, options])
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | La opción subject ahora tiene como valor predeterminado 'default' . |
v17.5.0, v16.15.0 | La opción subject ahora se puede establecer en 'default' . |
v15.6.0 | Agregado en: v15.6.0 |
name
<string>options
<Object>Devuelve: <string> | <undefined> Devuelve un nombre de asunto que coincide con
name
, oundefined
si ningún nombre de asunto coincide conname
.
Comprueba si el certificado coincide con el nombre de host dado.
Si el certificado coincide con el nombre de host dado, se devuelve el nombre de asunto coincidente. El nombre devuelto puede ser una coincidencia exacta (por ejemplo, foo.example.com
) o puede contener comodines (por ejemplo, *.example.com
). Debido a que las comparaciones de nombres de host no distinguen entre mayúsculas y minúsculas, el nombre de asunto devuelto también puede diferir del name
dado en el uso de mayúsculas.
Si la opción 'subject'
no está definida o se establece en 'default'
, el asunto del certificado solo se considera si la extensión del nombre alternativo del asunto no existe o no contiene ningún nombre DNS. Este comportamiento es coherente con RFC 2818 ("HTTP Over TLS").
Si la opción 'subject'
se establece en 'always'
y si la extensión del nombre alternativo del asunto no existe o no contiene un nombre DNS coincidente, se considera el asunto del certificado.
Si la opción 'subject'
se establece en 'never'
, el asunto del certificado nunca se considera, incluso si el certificado no contiene nombres alternativos del asunto.
x509.checkIP(ip)
[Historial]
Versión | Cambios |
---|---|
v17.5.0, v16.14.1 | El argumento options ha sido eliminado ya que no tenía efecto. |
v15.6.0 | Añadido en: v15.6.0 |
ip
<string>- Devuelve: <string> | <undefined> Devuelve
ip
si el certificado coincide,undefined
si no coincide.
Comprueba si el certificado coincide con la dirección IP dada (IPv4 o IPv6).
Solo se consideran los nombres alternativos del sujeto iPAddress
RFC 5280, y deben coincidir exactamente con la dirección ip
dada. Se ignoran otros nombres alternativos del sujeto, así como el campo del sujeto del certificado.
x509.checkIssued(otherCert)
Añadido en: v15.6.0
otherCert
<X509Certificate>- Devuelve: <boolean>
Comprueba si este certificado fue emitido por el otherCert
dado.
x509.checkPrivateKey(privateKey)
Añadido en: v15.6.0
privateKey
<KeyObject> Una clave privada.- Devuelve: <boolean>
Comprueba si la clave pública de este certificado es consistente con la clave privada dada.
x509.extKeyUsage
Añadido en: v15.6.0
- Tipo: <string[]>
Un array que detalla los usos extendidos de la clave para este certificado.
x509.fingerprint
Añadido en: v15.6.0
- Tipo: <string>
La huella digital SHA-1 de este certificado.
Debido a que SHA-1 está roto criptográficamente y a que la seguridad de SHA-1 es significativamente peor que la de los algoritmos que se utilizan comúnmente para firmar certificados, considere usar x509.fingerprint256
en su lugar.
x509.fingerprint256
Agregado en: v15.6.0
- Tipo: <string>
La huella digital SHA-256 de este certificado.
x509.fingerprint512
Agregado en: v17.2.0, v16.14.0
- Tipo: <string>
La huella digital SHA-512 de este certificado.
Dado que calcular la huella digital SHA-256 suele ser más rápido y porque es solo la mitad del tamaño de la huella digital SHA-512, x509.fingerprint256
puede ser una mejor opción. Si bien SHA-512 presumiblemente proporciona un nivel de seguridad más alto en general, la seguridad de SHA-256 coincide con la de la mayoría de los algoritmos que se utilizan comúnmente para firmar certificados.
x509.infoAccess
[Historial]
Versión | Cambios |
---|---|
v17.3.1, v16.13.2 | Partes de esta cadena pueden estar codificadas como literales de cadena JSON en respuesta a CVE-2021-44532. |
v15.6.0 | Agregado en: v15.6.0 |
- Tipo: <string>
Una representación textual de la extensión de acceso a la información de la autoridad del certificado.
Esta es una lista separada por saltos de línea de descripciones de acceso. Cada línea comienza con el método de acceso y el tipo de ubicación de acceso, seguido de dos puntos y el valor asociado con la ubicación de acceso.
Después del prefijo que denota el método de acceso y el tipo de ubicación de acceso, el resto de cada línea podría estar entre comillas para indicar que el valor es un literal de cadena JSON. Por compatibilidad con versiones anteriores, Node.js solo usa literales de cadena JSON dentro de esta propiedad cuando es necesario para evitar ambigüedades. El código de terceros debe estar preparado para manejar ambos formatos de entrada posibles.
x509.issuer
Agregado en: v15.6.0
- Tipo: <string>
La identificación del emisor incluida en este certificado.
x509.issuerCertificate
Agregado en: v15.9.0
- Tipo: <X509Certificate>
El certificado del emisor o undefined
si el certificado del emisor no está disponible.
x509.publicKey
Agregado en: v15.6.0
- Tipo: <KeyObject>
La clave pública <KeyObject> para este certificado.
x509.raw
Agregado en: v15.6.0
- Tipo: <Buffer>
Un Buffer
que contiene la codificación DER de este certificado.
x509.serialNumber
Agregado en: v15.6.0
- Tipo: <string>
El número de serie de este certificado.
Los números de serie son asignados por las autoridades de certificación y no identifican de forma única los certificados. Considere usar x509.fingerprint256
como un identificador único en su lugar.
x509.subject
Agregado en: v15.6.0
- Tipo: <string>
El sujeto completo de este certificado.
x509.subjectAltName
[Historial]
Versión | Cambios |
---|---|
v17.3.1, v16.13.2 | Partes de esta cadena pueden estar codificadas como literales de cadena JSON en respuesta a CVE-2021-44532. |
v15.6.0 | Agregado en: v15.6.0 |
- Tipo: <string>
El nombre alternativo del sujeto especificado para este certificado.
Esta es una lista de nombres alternativos del sujeto separados por comas. Cada entrada comienza con una cadena que identifica el tipo de nombre alternativo del sujeto, seguida de dos puntos y el valor asociado con la entrada.
Las versiones anteriores de Node.js asumieron incorrectamente que es seguro dividir esta propiedad en la secuencia de dos caracteres ', '
(consulte CVE-2021-44532). Sin embargo, tanto los certificados maliciosos como los legítimos pueden contener nombres alternativos del sujeto que incluyen esta secuencia cuando se representan como una cadena.
Después del prefijo que denota el tipo de entrada, el resto de cada entrada puede estar entre comillas para indicar que el valor es un literal de cadena JSON. Por compatibilidad con versiones anteriores, Node.js solo usa literales de cadena JSON dentro de esta propiedad cuando es necesario para evitar la ambigüedad. El código de terceros debe estar preparado para manejar ambos formatos de entrada posibles.
x509.toJSON()
Agregado en: v15.6.0
- Tipo: <string>
No existe una codificación JSON estándar para los certificados X509. El método toJSON()
devuelve una cadena que contiene el certificado codificado en PEM.
x509.toLegacyObject()
Agregado en: v15.6.0
- Tipo: <Object>
Devuelve información sobre este certificado utilizando la codificación de objeto de certificado heredada.
x509.toString()
Agregado en: v15.6.0
- Tipo: <string>
Devuelve el certificado codificado en PEM.
x509.validFrom
Agregado en: v15.6.0
- Tipo: <string>
La fecha/hora a partir de la cual este certificado es válido.
x509.validFromDate
Agregado en: v23.0.0
- Tipo: <Date>
La fecha/hora a partir de la cual este certificado es válido, encapsulada en un objeto Date
.
x509.validTo
Agregado en: v15.6.0
- Tipo: <string>
La fecha/hora hasta la cual este certificado es válido.
x509.validToDate
Agregado en: v23.0.0
- Tipo: <Date>
La fecha/hora hasta la cual este certificado es válido, encapsulada en un objeto Date
.
x509.verify(publicKey)
Agregado en: v15.6.0
publicKey
<KeyObject> Una clave pública.- Devuelve: <boolean>
Verifica que este certificado fue firmado por la clave pública dada. No realiza ninguna otra comprobación de validación en el certificado.
Métodos y propiedades del módulo node:crypto
crypto.checkPrime(candidate[, options], callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una callback inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.8.0 | Añadido en: v15.8.0 |
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> Un posible número primo codificado como una secuencia de octetos big endian de longitud arbitraria.options
<Object>checks
<number> El número de iteraciones probabilísticas de primalidad de Miller-Rabin a realizar. Cuando el valor es0
(cero), se utiliza un número de comprobaciones que produce una tasa de falsos positivos de como máximo 2 para entradas aleatorias. Se debe tener cuidado al seleccionar un número de comprobaciones. Consulte la documentación de OpenSSL para la funciónBN_is_prime_ex
para obtener más detalles sobre las opciones denchecks
. Predeterminado:0
callback
<Function>
Comprueba la primalidad del candidate
.
crypto.checkPrimeSync(candidate[, options])
Agregada en: v15.8.0
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> Un posible número primo codificado como una secuencia de octetos big endian de longitud arbitraria.options
<Object>checks
<number> El número de iteraciones probabilísticas de primalidad de Miller-Rabin a realizar. Cuando el valor es0
(cero), se utiliza un número de comprobaciones que produce una tasa de falsos positivos de como máximo 2 para la entrada aleatoria. Se debe tener cuidado al seleccionar un número de comprobaciones. Consulte la documentación de OpenSSL para la funciónBN_is_prime_ex
opcionesnchecks
para obtener más detalles. Predeterminado:0
Devuelve: <boolean>
true
si el candidato es un número primo con una probabilidad de error inferior a0.25 ** options.checks
.
Comprueba la primalidad del candidate
.
crypto.constants
Agregada en: v6.3.0
Un objeto que contiene constantes de uso común para operaciones relacionadas con la criptografía y la seguridad. Las constantes específicas actualmente definidas se describen en Constantes criptográficas.
crypto.createCipheriv(algorithm, key, iv[, options])
[Historial]
Versión | Cambios |
---|---|
v17.9.0, v16.17.0 | La opción authTagLength ahora es opcional cuando se usa el cifrado chacha20-poly1305 y el valor predeterminado es de 16 bytes. |
v15.0.0 | Los argumentos password e iv pueden ser un ArrayBuffer y cada uno está limitado a un máximo de 2 ** 31 - 1 bytes. |
v11.6.0 | El argumento key ahora puede ser un KeyObject . |
v11.2.0, v10.17.0 | Ahora se admite el cifrado chacha20-poly1305 (la variante IETF de ChaCha20-Poly1305). |
v10.10.0 | Ahora se admiten los cifrados en modo OCB. |
v10.2.0 | Ahora se puede usar la opción authTagLength para producir etiquetas de autenticación más cortas en modo GCM y el valor predeterminado es de 16 bytes. |
v9.9.0 | El parámetro iv ahora puede ser null para los cifrados que no necesitan un vector de inicialización. |
v0.1.94 | Añadido en: 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- Devuelve: <Cipher>
Crea y devuelve un objeto Cipher
, con el algorithm
, la key
y el vector de inicialización (iv
) dados.
El argumento options
controla el comportamiento de la transmisión y es opcional, excepto cuando se usa un cifrado en modo CCM u OCB (por ejemplo, 'aes-128-ccm'
). En ese caso, la opción authTagLength
es obligatoria y especifica la longitud de la etiqueta de autenticación en bytes, consulte modo CCM. En el modo GCM, la opción authTagLength
no es obligatoria, pero se puede usar para establecer la longitud de la etiqueta de autenticación que devolverá getAuthTag()
y el valor predeterminado es de 16 bytes. Para chacha20-poly1305
, la opción authTagLength
tiene un valor predeterminado de 16 bytes.
El algorithm
depende de OpenSSL, ejemplos son 'aes192'
, etc. En las versiones recientes de OpenSSL, openssl list -cipher-algorithms
mostrará los algoritmos de cifrado disponibles.
La key
es la clave sin procesar utilizada por el algorithm
e iv
es un vector de inicialización. Ambos argumentos deben ser cadenas codificadas 'utf8'
, Buffers, TypedArray
o DataView
s. La key
puede ser opcionalmente un KeyObject
de tipo secret
. Si el cifrado no necesita un vector de inicialización, iv
puede ser null
.
Cuando pase cadenas para key
o iv
, considere las advertencias al usar cadenas como entradas para las API criptográficas.
Los vectores de inicialización deben ser impredecibles y únicos; idealmente, serán criptográficamente aleatorios. No tienen que ser secretos: los IV generalmente se agregan a los mensajes de texto cifrado sin cifrar. Puede sonar contradictorio que algo tenga que ser impredecible y único, pero no tiene que ser secreto; recuerde que un atacante no debe poder predecir de antemano cuál será un IV dado.
crypto.createDecipheriv(algorithm, key, iv[, options])
[Historial]
Versión | Cambios |
---|---|
v17.9.0, v16.17.0 | La opción authTagLength ahora es opcional al usar el cifrado chacha20-poly1305 y tiene un valor predeterminado de 16 bytes. |
v11.6.0 | El argumento key ahora puede ser un KeyObject . |
v11.2.0, v10.17.0 | Ahora se admite el cifrado chacha20-poly1305 (la variante IETF de ChaCha20-Poly1305). |
v10.10.0 | Ahora se admiten cifrados en modo OCB. |
v10.2.0 | La opción authTagLength ahora se puede usar para restringir las longitudes de etiquetas de autenticación GCM aceptadas. |
v9.9.0 | El parámetro iv ahora puede ser null para cifrados que no necesitan un vector de inicialización. |
v0.1.94 | Añadido en: 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- Devuelve: <Decipher>
Crea y devuelve un objeto Decipher
que usa el algorithm
, la key
y el vector de inicialización (iv
) dados.
El argumento options
controla el comportamiento del flujo y es opcional, excepto cuando se usa un cifrado en modo CCM u OCB (por ejemplo, 'aes-128-ccm'
). En ese caso, la opción authTagLength
es obligatoria y especifica la longitud de la etiqueta de autenticación en bytes, consulte modo CCM. Para AES-GCM y chacha20-poly1305
, la opción authTagLength
tiene un valor predeterminado de 16 bytes y debe establecerse en un valor diferente si se usa una longitud diferente.
El algorithm
depende de OpenSSL, los ejemplos son 'aes192'
, etc. En las versiones recientes de OpenSSL, openssl list -cipher-algorithms
mostrará los algoritmos de cifrado disponibles.
La key
es la clave sin procesar utilizada por el algorithm
e iv
es un vector de inicialización. Ambos argumentos deben ser cadenas codificadas en 'utf8'
, Buffers, TypedArray
o DataView
s. La key
puede ser opcionalmente un KeyObject
de tipo secret
. Si el cifrado no necesita un vector de inicialización, iv
puede ser null
.
Cuando pase cadenas para key
o iv
, considere las advertencias al usar cadenas como entradas para las API criptográficas.
Los vectores de inicialización deben ser impredecibles y únicos; idealmente, serán criptográficamente aleatorios. No tienen que ser secretos: los IV normalmente se agregan a los mensajes de texto cifrado sin cifrar. Puede sonar contradictorio que algo tenga que ser impredecible y único, pero no tiene que ser secreto; recuerde que un atacante no debe poder predecir de antemano cuál será un IV determinado.
crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])
[Historial]
Versión | Cambios |
---|---|
v8.0.0 | El argumento prime ahora puede ser cualquier TypedArray o DataView . |
v8.0.0 | El argumento prime ahora puede ser un Uint8Array . |
v6.0.0 | El valor predeterminado para los parámetros de codificación cambió de binary a utf8 . |
v0.11.12 | Añadido en: v0.11.12 |
prime
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>primeEncoding
<string> La codificación de la cadenaprime
.generator
<number> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Predeterminado:2
generatorEncoding
<string> La codificación de la cadenagenerator
.- Devuelve: <DiffieHellman>
Crea un objeto de intercambio de claves DiffieHellman
utilizando el prime
proporcionado y un generator
específico opcional.
El argumento generator
puede ser un número, una cadena o un Buffer
. Si no se especifica generator
, se utiliza el valor 2
.
Si se especifica primeEncoding
, se espera que prime
sea una cadena; de lo contrario, se espera un Buffer
, TypedArray
o DataView
.
Si se especifica generatorEncoding
, se espera que generator
sea una cadena; de lo contrario, se espera un número, Buffer
, TypedArray
o DataView
.
crypto.createDiffieHellman(primeLength[, generator])
Añadido en: v0.5.0
primeLength
<number>generator
<number> Predeterminado:2
- Devuelve: <DiffieHellman>
Crea un objeto de intercambio de claves DiffieHellman
y genera un número primo de primeLength
bits utilizando un generator
numérico específico opcional. Si no se especifica generator
, se utiliza el valor 2
.
crypto.createDiffieHellmanGroup(name)
Añadido en: v0.9.3
name
<string>- Devuelve: <DiffieHellmanGroup>
Un alias para crypto.getDiffieHellman()
crypto.createECDH(curveName)
Añadido en: v0.11.14
Crea un objeto de intercambio de claves Diffie-Hellman de curva elíptica (ECDH
) utilizando una curva predefinida especificada por la cadena curveName
. Utilice crypto.getCurves()
para obtener una lista de nombres de curva disponibles. En las versiones recientes de OpenSSL, openssl ecparam -list_curves
también mostrará el nombre y la descripción de cada curva elíptica disponible.
crypto.createHash(algorithm[, options])
[Historial]
Versión | Cambios |
---|---|
v12.8.0 | Se agregó la opción outputLength para las funciones hash XOF. |
v0.1.92 | Añadido en: v0.1.92 |
algorithm
<string>options
<Object> Opciones destream.transform
- Devuelve: <Hash>
Crea y devuelve un objeto Hash
que se puede utilizar para generar resúmenes hash utilizando el algorithm
dado. El argumento options
opcional controla el comportamiento del flujo. Para funciones hash XOF como 'shake256'
, se puede utilizar la opción outputLength
para especificar la longitud de salida deseada en bytes.
El algorithm
depende de los algoritmos disponibles admitidos por la versión de OpenSSL en la plataforma. Los ejemplos son 'sha256'
, 'sha512'
, etc. En las versiones recientes de OpenSSL, openssl list -digest-algorithms
mostrará los algoritmos de resumen disponibles.
Ejemplo: generar la suma sha256 de un archivo
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', () => {
// Only one element is going to be produced by the
// hash stream.
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', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hash.update(data);
else {
console.log(`${hash.digest('hex')} ${filename}`);
}
});
crypto.createHmac(algorithm, key[, options])
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | La clave también puede ser un ArrayBuffer o CryptoKey. Se agregó la opción de codificación. La clave no puede contener más de 2 ** 32 - 1 bytes. |
v11.6.0 | El argumento key ahora puede ser un KeyObject . |
v0.1.94 | Agregado en: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>options
<Object>stream.transform
optionsencoding
<string> La codificación de cadena a utilizar cuandokey
es una cadena.
Devuelve: <Hmac>
Crea y devuelve un objeto Hmac
que utiliza el algorithm
y la key
dados. El argumento options
opcional controla el comportamiento del flujo.
El algorithm
depende de los algoritmos disponibles soportados por la versión de OpenSSL en la plataforma. Algunos ejemplos son 'sha256'
, 'sha512'
, etc. En las versiones recientes de OpenSSL, openssl list -digest-algorithms
mostrará los algoritmos de resumen disponibles.
La key
es la clave HMAC utilizada para generar el hash HMAC criptográfico. Si es un KeyObject
, su tipo debe ser secret
. Si es una cadena, considere las advertencias al usar cadenas como entradas para las API criptográficas. Si se obtuvo de una fuente de entropía criptográficamente segura, como crypto.randomBytes()
o crypto.generateKey()
, su longitud no debe exceder el tamaño de bloque de algorithm
(por ejemplo, 512 bits para SHA-256).
Ejemplo: generar el HMAC sha256 de un archivo
import {
createReadStream,
} from 'node:fs';
import { argv } from 'node:process';
const {
createHmac,
} = await import('node:crypto');
const filename = argv[2];
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hmac.update(data);
else {
console.log(`${hmac.digest('hex')} ${filename}`);
}
});
const {
createReadStream,
} = require('node:fs');
const {
createHmac,
} = require('node:crypto');
const { argv } = require('node:process');
const filename = argv[2];
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hmac.update(data);
else {
console.log(`${hmac.digest('hex')} ${filename}`);
}
});
crypto.createPrivateKey(key)
[Historial]
Versión | Cambios |
---|---|
v15.12.0 | La clave también puede ser un objeto JWK. |
v15.0.0 | La clave también puede ser un ArrayBuffer. Se añadió la opción de codificación. La clave no puede contener más de 2 ** 32 - 1 bytes. |
v11.6.0 | Añadido en: v11.6.0 |
key
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Objeto> El material de la clave, ya sea en formato PEM, DER o JWK.format
: <string> Debe ser'pem'
,'der'
o'jwk'
. Predeterminado:'pem'
.type
: <string> Debe ser'pkcs1'
,'pkcs8'
o'sec1'
. Esta opción sólo es necesaria si elformat
es'der'
y se ignora en caso contrario.passphrase
: <string> | <Buffer> La frase de contraseña para usar para el descifrado.encoding
: <string> La codificación de cadena que se utilizará cuandokey
sea una cadena.
Devuelve: <KeyObject>
Crea y devuelve un nuevo objeto clave que contiene una clave privada. Si key
es una cadena o Buffer
, se asume que el format
es 'pem'
; de lo contrario, key
debe ser un objeto con las propiedades descritas anteriormente.
Si la clave privada está cifrada, debe especificarse una passphrase
. La longitud de la frase de contraseña está limitada a 1024 bytes.
crypto.createPublicKey(key)
[Historial]
Versión | Cambios |
---|---|
v15.12.0 | La clave también puede ser un objeto JWK. |
v15.0.0 | La clave también puede ser un ArrayBuffer. Se añadió la opción de codificación. La clave no puede contener más de 2 ** 32 - 1 bytes. |
v11.13.0 | El argumento key ahora puede ser un KeyObject con tipo private . |
v11.7.0 | El argumento key ahora puede ser una clave privada. |
v11.6.0 | Añadido en: v11.6.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Object> El material de la clave, ya sea en formato PEM, DER o JWK.format
: <string> Debe ser'pem'
,'der'
o'jwk'
. Predeterminado:'pem'
.type
: <string> Debe ser'pkcs1'
o'spki'
. Esta opción solo es necesaria si elformat
es'der'
y se ignora en caso contrario.encoding
<string> La codificación de cadena que se utilizará cuandokey
sea una cadena.
Devuelve: <KeyObject>
Crea y devuelve un nuevo objeto de clave que contiene una clave pública. Si key
es una cadena o Buffer
, se asume que el format
es 'pem'
; si key
es un KeyObject
con tipo 'private'
, la clave pública se deriva de la clave privada dada; de lo contrario, key
debe ser un objeto con las propiedades descritas anteriormente.
Si el formato es 'pem'
, la 'key'
también puede ser un certificado X.509.
Dado que las claves públicas se pueden derivar de claves privadas, se puede pasar una clave privada en lugar de una clave pública. En ese caso, esta función se comporta como si se hubiera llamado a crypto.createPrivateKey()
, excepto que el tipo del KeyObject
devuelto será 'public'
y que la clave privada no se puede extraer del KeyObject
devuelto. Del mismo modo, si se proporciona un KeyObject
con tipo 'private'
, se devolverá un nuevo KeyObject
con tipo 'public'
y será imposible extraer la clave privada del objeto devuelto.
crypto.createSecretKey(key[, encoding])
[Historial]
Versión | Cambios |
---|---|
v18.8.0, v16.18.0 | La clave ahora puede tener longitud cero. |
v15.0.0 | La clave también puede ser un ArrayBuffer o una cadena. Se añadió el argumento de codificación. La clave no puede contener más de 2 ** 32 - 1 bytes. |
v11.6.0 | Añadido en: v11.6.0 |
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> La codificación de cadena cuandokey
es una cadena.- Devuelve: <KeyObject>
Crea y devuelve un nuevo objeto de clave que contiene una clave secreta para el cifrado simétrico o Hmac
.
crypto.createSign(algorithm[, options])
Añadido en: v0.1.92
algorithm
<string>options
<Object> Opciones destream.Writable
- Devuelve: <Sign>
Crea y devuelve un objeto Sign
que utiliza el algorithm
dado. Utilice crypto.getHashes()
para obtener los nombres de los algoritmos de resumen disponibles. El argumento options
opcional controla el comportamiento de stream.Writable
.
En algunos casos, se puede crear una instancia de Sign
utilizando el nombre de un algoritmo de firma, como 'RSA-SHA256'
, en lugar de un algoritmo de resumen. Esto utilizará el algoritmo de resumen correspondiente. Esto no funciona para todos los algoritmos de firma, como 'ecdsa-with-SHA256'
, por lo que es mejor utilizar siempre nombres de algoritmos de resumen.
crypto.createVerify(algorithm[, options])
Agregado en: v0.1.92
algorithm
<string>options
<Object> Opcionesstream.Writable
- Devuelve: <Verify>
Crea y devuelve un objeto Verify
que utiliza el algoritmo dado. Utilice crypto.getHashes()
para obtener una matriz de nombres de los algoritmos de firma disponibles. El argumento opcional options
controla el comportamiento de stream.Writable
.
En algunos casos, se puede crear una instancia de Verify
utilizando el nombre de un algoritmo de firma, como 'RSA-SHA256'
, en lugar de un algoritmo de resumen. Esto utilizará el algoritmo de resumen correspondiente. Esto no funciona para todos los algoritmos de firma, como 'ecdsa-with-SHA256'
, por lo que es mejor utilizar siempre los nombres de los algoritmos de resumen.
crypto.diffieHellman(options)
Agregado en: v13.9.0, v12.17.0
options
: <Object>privateKey
: <KeyObject>publicKey
: <KeyObject>
Devuelve: <Buffer>
Calcula el secreto de Diffie-Hellman basado en una privateKey
y una publicKey
. Ambas claves deben tener el mismo asymmetricKeyType
, que debe ser uno de 'dh'
(para Diffie-Hellman), 'ec'
, 'x448'
o 'x25519'
(para ECDH).
crypto.fips
Agregado en: v6.0.0
Obsoleto desde: v10.0.0
[Estable: 0 - Obsoleto]
Estable: 0 Estabilidad: 0 - Obsoleto
Propiedad para comprobar y controlar si se está utilizando actualmente un proveedor criptográfico compatible con FIPS. Establecer en true requiere una compilación FIPS de Node.js.
Esta propiedad está obsoleta. Por favor, use crypto.setFips()
y crypto.getFips()
en su lugar.
crypto.generateKey(type, options, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada no válida al argumento callback ahora arroja ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.0.0 | Agregado en: v15.0.0 |
type
: <string> El uso previsto de la clave secreta generada. Los valores aceptados actualmente son'hmac'
y'aes'
.options
: <Object>length
: <number> La longitud en bits de la clave a generar. Esto debe ser un valor mayor que 0.- Si
type
es'hmac'
, el mínimo es 8 y la longitud máxima es 2-1. Si el valor no es un múltiplo de 8, la clave generada se truncará aMath.floor(length / 8)
. - Si
type
es'aes'
, la longitud debe ser una de128
,192
o256
.
callback
: <Function>err
: <Error>key
: <KeyObject>
Genera asincrónicamente una nueva clave secreta aleatoria de la length
dada. El type
determinará qué validaciones se realizarán en la 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
});
El tamaño de una clave HMAC generada no debe exceder el tamaño de bloque de la función hash subyacente. Consulte crypto.createHmac()
para obtener más información.
crypto.generateKeyPair(type, options, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una callback inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v16.10.0 | Agrega la capacidad de definir parámetros de secuencia RSASSA-PSS-params para pares de claves RSA-PSS. |
v13.9.0, v12.17.0 | Agrega soporte para Diffie-Hellman. |
v12.0.0 | Agrega soporte para pares de claves RSA-PSS. |
v12.0.0 | Agrega la capacidad de generar pares de claves X25519 y X448. |
v12.0.0 | Agrega la capacidad de generar pares de claves Ed25519 y Ed448. |
v11.6.0 | Las funciones generateKeyPair y generateKeyPairSync ahora producen objetos de clave si no se especificó ninguna codificación. |
v10.12.0 | Agregado en: v10.12.0 |
type
: <string> Debe ser'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
o'dh'
.options
: <Object>modulusLength
: <number> Tamaño de la clave en bits (RSA, DSA).publicExponent
: <number> Exponente público (RSA). Predeterminado:0x10001
.hashAlgorithm
: <string> Nombre del resumen del mensaje (RSA-PSS).mgf1HashAlgorithm
: <string> Nombre del resumen del mensaje utilizado por MGF1 (RSA-PSS).saltLength
: <number> Longitud mínima de la sal en bytes (RSA-PSS).divisorLength
: <number> Tamaño deq
en bits (DSA).namedCurve
: <string> Nombre de la curva a utilizar (EC).prime
: <Buffer> El parámetro primo (DH).primeLength
: <number> Longitud prima en bits (DH).generator
: <number> Generador personalizado (DH). Predeterminado:2
.groupName
: <string> Nombre del grupo Diffie-Hellman (DH). Consultecrypto.getDiffieHellman()
.paramEncoding
: <string> Debe ser'named'
o'explicit'
(EC). Predeterminado:'named'
.publicKeyEncoding
: <Object> ConsultekeyObject.export()
.privateKeyEncoding
: <Object> ConsultekeyObject.export()
.
callback
: <Function>err
: <Error>publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
Genera un nuevo par de claves asimétricas del type
dado. Actualmente se admiten RSA, RSA-PSS, DSA, EC, Ed25519, Ed448, X25519, X448 y DH.
Si se especificó un publicKeyEncoding
o privateKeyEncoding
, esta función se comporta como si se hubiera llamado a keyObject.export()
en su resultado. De lo contrario, la parte respectiva de la clave se devuelve como un KeyObject
.
Se recomienda codificar las claves públicas como 'spki'
y las claves privadas como 'pkcs8'
con cifrado para el almacenamiento a largo plazo:
const {
generateKeyPair,
} = await import('node:crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
}, (err, publicKey, privateKey) => {
// Handle errors and use the generated key pair.
});
const {
generateKeyPair,
} = require('node:crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
}, (err, publicKey, privateKey) => {
// Handle errors and use the generated key pair.
});
Al finalizar, se llamará a callback
con err
establecido en undefined
y publicKey
/ privateKey
representando el par de claves generado.
Si este método se invoca como su versión util.promisify()
ed, devuelve una Promise
para un Object
con propiedades publicKey
y privateKey
.
crypto.generateKeyPairSync(type, options)
[Historial]
Versión | Cambios |
---|---|
v16.10.0 | Se agregó la capacidad de definir parámetros de secuencia RSASSA-PSS-params para pares de claves RSA-PSS. |
v13.9.0, v12.17.0 | Se agregó soporte para Diffie-Hellman. |
v12.0.0 | Se agregó soporte para pares de claves RSA-PSS. |
v12.0.0 | Se agregó la capacidad de generar pares de claves X25519 y X448. |
v12.0.0 | Se agregó la capacidad de generar pares de claves Ed25519 y Ed448. |
v11.6.0 | Las funciones generateKeyPair y generateKeyPairSync ahora producen objetos clave si no se especificó ninguna codificación. |
v10.12.0 | Se agregó en: v10.12.0 |
type
: <string> Debe ser'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
o'dh'
.options
: <Object>modulusLength
: <number> Tamaño de la clave en bits (RSA, DSA).publicExponent
: <number> Exponente público (RSA). Predeterminado:0x10001
.hashAlgorithm
: <string> Nombre del resumen del mensaje (RSA-PSS).mgf1HashAlgorithm
: <string> Nombre del resumen del mensaje utilizado por MGF1 (RSA-PSS).saltLength
: <number> Longitud mínima de la sal en bytes (RSA-PSS).divisorLength
: <number> Tamaño deq
en bits (DSA).namedCurve
: <string> Nombre de la curva a utilizar (EC).prime
: <Buffer> El parámetro primo (DH).primeLength
: <number> Longitud prima en bits (DH).generator
: <number> Generador personalizado (DH). Predeterminado:2
.groupName
: <string> Nombre del grupo Diffie-Hellman (DH). Consultecrypto.getDiffieHellman()
.paramEncoding
: <string> Debe ser'named'
o'explicit'
(EC). Predeterminado:'named'
.publicKeyEncoding
: <Object> ConsultekeyObject.export()
.privateKeyEncoding
: <Object> ConsultekeyObject.export()
.
Devuelve: <Object>
publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
Genera un nuevo par de claves asimétricas del type
dado. Actualmente se admiten RSA, RSA-PSS, DSA, EC, Ed25519, Ed448, X25519, X448 y DH.
Si se especificó una publicKeyEncoding
o privateKeyEncoding
, esta función se comporta como si se hubiera llamado a keyObject.export()
en su resultado. De lo contrario, la parte respectiva de la clave se devuelve como un KeyObject
.
Al codificar claves públicas, se recomienda utilizar 'spki'
. Al codificar claves privadas, se recomienda utilizar 'pkcs8'
con una contraseña segura y mantener la confidencialidad de la contraseña.
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',
},
});
El valor de retorno { publicKey, privateKey }
representa el par de claves generado. Cuando se seleccionó la codificación PEM, la clave respectiva será una cadena, de lo contrario, será un búfer que contiene los datos codificados como DER.
crypto.generateKeySync(type, options)
Agregado en: v15.0.0
type
: <string> El uso previsto de la clave secreta generada. Los valores aceptados actualmente son'hmac'
y'aes'
.options
: <Object>length
: <number> La longitud en bits de la clave a generar.- Si
type
es'hmac'
, el mínimo es 8 y la longitud máxima es 2-1. Si el valor no es múltiplo de 8, la clave generada se truncará aMath.floor(length / 8)
. - Si
type
es'aes'
, la longitud debe ser una de128
,192
o256
.
Devuelve: <KeyObject>
Genera sincrónicamente una nueva clave secreta aleatoria de la length
dada. El type
determinará qué validaciones se realizarán en la 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
El tamaño de una clave HMAC generada no debe exceder el tamaño de bloque de la función hash subyacente. Consulte crypto.createHmac()
para obtener más información.
crypto.generatePrime(size[, options[, callback]])
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una callback inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.8.0 | Agregado en: v15.8.0 |
size
<number> El tamaño (en bits) del primo a generar.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> Predeterminado:false
.bigint
<boolean> Cuando estrue
, el primo generado se devuelve como unbigint
.
callback
<Function>err
<Error>prime
<ArrayBuffer> | <bigint>
Genera un primo pseudoaleatorio de size
bits.
Si options.safe
es true
, el primo será un primo seguro, es decir, (prime - 1) / 2
también será un primo.
Los parámetros options.add
y options.rem
se pueden usar para imponer requisitos adicionales, por ejemplo, para Diffie-Hellman:
- Si
options.add
yoptions.rem
están ambos establecidos, el primo satisfará la condición de queprime % add = rem
. - Si solo se establece
options.add
yoptions.safe
no estrue
, el primo satisfará la condición de queprime % add = 1
. - Si solo se establece
options.add
yoptions.safe
se establece entrue
, el primo satisfará en cambio la condición de queprime % add = 3
. Esto es necesario porqueprime % add = 1
paraoptions.add \> 2
contradiría la condición impuesta poroptions.safe
. options.rem
se ignora si no se proporcionaoptions.add
.
Tanto options.add
como options.rem
deben codificarse como secuencias big-endian si se dan como ArrayBuffer
, SharedArrayBuffer
, TypedArray
, Buffer
o DataView
.
De forma predeterminada, el primo se codifica como una secuencia big-endian de octetos en un <ArrayBuffer>. Si la opción bigint
es true
, entonces se proporciona un <bigint>.
crypto.generatePrimeSync(size[, options])
Agregado en: v15.8.0
size
<number> El tamaño (en bits) del número primo a generar.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> Predeterminado:false
.bigint
<boolean> Cuando estrue
, el número primo generado se devuelve como unbigint
.
Devuelve: <ArrayBuffer> | <bigint>
Genera un número primo pseudoaleatorio de size
bits.
Si options.safe
es true
, el número primo será un número primo seguro; es decir, (prime - 1) / 2
también será un número primo.
Los parámetros options.add
y options.rem
se pueden utilizar para aplicar requisitos adicionales, por ejemplo, para Diffie-Hellman:
- Si
options.add
yoptions.rem
están ambos establecidos, el número primo satisfará la condición de queprime % add = rem
. - Si solo se establece
options.add
yoptions.safe
no estrue
, el número primo satisfará la condición de queprime % add = 1
. - Si solo se establece
options.add
yoptions.safe
se establece entrue
, el número primo satisfará en su lugar la condición de queprime % add = 3
. Esto es necesario porqueprime % add = 1
paraoptions.add \> 2
contradeciría la condición impuesta poroptions.safe
. options.rem
se ignora si no se proporcionaoptions.add
.
Tanto options.add
como options.rem
deben codificarse como secuencias big-endian si se proporcionan como ArrayBuffer
, SharedArrayBuffer
, TypedArray
, Buffer
o DataView
.
De forma predeterminada, el número primo se codifica como una secuencia big-endian de octetos en un <ArrayBuffer>. Si la opción bigint
es true
, entonces se proporciona un <bigint>.
crypto.getCipherInfo(nameOrNid[, options])
Agregado en: v15.0.0
nameOrNid
: <string> | <number> El nombre o nid del cifrado a consultar.options
: <Object>Devuelve: <Object>
name
<string> El nombre del cifradonid
<number> El nid del cifradoblockSize
<number> El tamaño del bloque del cifrado en bytes. Esta propiedad se omite cuandomode
es'stream'
.ivLength
<number> La longitud del vector de inicialización esperada o predeterminada en bytes. Esta propiedad se omite si el cifrado no utiliza un vector de inicialización.keyLength
<number> La longitud de clave esperada o predeterminada en bytes.mode
<string> El modo de cifrado. Uno de'cbc'
,'ccm'
,'cfb'
,'ctr'
,'ecb'
,'gcm'
,'ocb'
,'ofb'
,'stream'
,'wrap'
,'xts'
.
Devuelve información sobre un cifrado dado.
Algunos cifrados aceptan claves y vectores de inicialización de longitud variable. Por defecto, el método crypto.getCipherInfo()
devolverá los valores predeterminados para estos cifrados. Para probar si una longitud de clave o una longitud de IV dadas son aceptables para un cifrado dado, utilice las opciones keyLength
e ivLength
. Si los valores dados no son aceptables, se devolverá undefined
.
crypto.getCiphers()
Agregado en: v0.9.3
- Devuelve: <string[]> Un array con los nombres de los algoritmos de cifrado soportados.
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()
Agregado en: v2.3.0
- Devuelve: <string[]> Un array con los nombres de las curvas elípticas soportadas.
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)
Agregado en: v0.7.5
groupName
<string>- Devuelve: <DiffieHellmanGroup>
Crea un objeto de intercambio de claves DiffieHellmanGroup
predefinido. Los grupos soportados se listan en la documentación para DiffieHellmanGroup
.
El objeto devuelto imita la interfaz de los objetos creados por crypto.createDiffieHellman()
, pero no permitirá cambiar las claves (con diffieHellman.setPublicKey()
, por ejemplo). La ventaja de usar este método es que las partes no tienen que generar ni intercambiar un módulo de grupo de antemano, ahorrando tiempo de procesador y comunicación.
Ejemplo (obtener un secreto compartido):
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 y bobSecret deberían ser iguales */
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 y bobSecret deberían ser iguales */
console.log(aliceSecret === bobSecret);
crypto.getFips()
Agregado en: v10.0.0
- Devuelve: <number>
1
si y solo si un proveedor de criptografía compatible con FIPS está actualmente en uso,0
en caso contrario. Una futura versión semver-major puede cambiar el tipo de retorno de esta API a un <boolean>.
crypto.getHashes()
Agregado en: v0.9.3
- Devuelve: <string[]> Un array de los nombres de los algoritmos hash soportados, como
'RSA-SHA256'
. Los algoritmos hash también se denominan 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)
Agregado en: v17.4.0
typedArray
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer>- Devuelve: <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> Devuelve
typedArray
.
Un alias conveniente para crypto.webcrypto.getRandomValues()
. Esta implementación no es compatible con la especificación Web Crypto, para escribir código compatible con la web utilice crypto.webcrypto.getRandomValues()
en su lugar.
crypto.hash(algorithm, data[, outputEncoding])
Agregado en: v21.7.0, v20.12.0
[Estable: 1 - Experimental]
Estable: 1 Estabilidad: 1.2 - Candidato a lanzamiento
algorithm
<string> | <undefined>data
<string> | <Buffer> | <TypedArray> | <DataView> Cuandodata
es una cadena, se codificará como UTF-8 antes de ser hasheada. Si se desea una codificación de entrada diferente para una entrada de cadena, el usuario podría codificar la cadena en unTypedArray
usandoTextEncoder
oBuffer.from()
y pasar elTypedArray
codificado a esta API en su lugar.outputEncoding
<string> | <undefined> Codificación usada para codificar el resumen devuelto. Predeterminado:'hex'
.- Devuelve: <string> | <Buffer>
Una utilidad para crear resúmenes hash únicos de datos. Puede ser más rápido que el crypto.createHash()
basado en objetos al hashear una cantidad menor de datos (<= 5 MB) que están disponibles de inmediato. Si los datos pueden ser grandes o si se transmiten, todavía se recomienda usar crypto.createHash()
en su lugar.
El algorithm
depende de los algoritmos disponibles compatibles con la versión de OpenSSL en la plataforma. Los ejemplos son 'sha256'
, 'sha512'
, etc. En las versiones recientes de OpenSSL, openssl list -digest-algorithms
mostrará los algoritmos de resumen disponibles.
Ejemplo:
const crypto = require('node:crypto');
const { Buffer } = require('node:buffer');
// Hasheando una cadena y devolviendo el resultado como una cadena codificada en hexadecimal.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));
// Codifica una cadena codificada en base64 en un Buffer, la hashea y devuelve
// el resultado como un búfer.
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';
// Hasheando una cadena y devolviendo el resultado como una cadena codificada en hexadecimal.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));
// Codifica una cadena codificada en base64 en un Buffer, la hashea y devuelve
// el resultado como un búfer.
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)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una callback inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v18.8.0, v16.18.0 | El material de clave de entrada ahora puede tener longitud cero. |
v15.0.0 | Añadido en: v15.0.0 |
digest
<string> El algoritmo digest a usar.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> El material de clave de entrada. Debe proporcionarse pero puede tener longitud cero.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> El valor de salt. Debe proporcionarse pero puede tener longitud cero.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Valor de información adicional. Debe proporcionarse pero puede tener longitud cero, y no puede tener más de 1024 bytes.keylen
<number> La longitud de la clave a generar. Debe ser mayor que 0. El valor máximo permitido es255
veces el número de bytes producidos por la función digest seleccionada (p. ej.,sha512
genera hashes de 64 bytes, haciendo que la salida HKDF máxima sea de 16320 bytes).callback
<Function>err
<Error>derivedKey
<ArrayBuffer>
HKDF es una función de derivación de clave simple definida en RFC 5869. Los ikm
, salt
e info
dados se utilizan con el digest
para derivar una clave de keylen
bytes.
La función callback
suministrada se llama con dos argumentos: err
y derivedKey
. Si ocurre un error al derivar la clave, se establecerá err
; de lo contrario, err
será null
. La derivedKey
generada con éxito se pasará al callback como un <ArrayBuffer>. Se lanzará un error si alguno de los argumentos de entrada especifica valores o tipos no vá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)
[Historial]
Versión | Cambios |
---|---|
v18.8.0, v16.18.0 | El material de clave de entrada ahora puede tener longitud cero. |
v15.0.0 | Añadido en: v15.0.0 |
digest
<string> El algoritmo de resumen a utilizar.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> El material de clave de entrada. Debe proporcionarse, pero puede tener longitud cero.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> El valor de salt. Debe proporcionarse, pero puede tener longitud cero.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Valor de info adicional. Debe proporcionarse, pero puede tener longitud cero, y no puede superar los 1024 bytes.keylen
<number> La longitud de la clave a generar. Debe ser mayor que 0. El valor máximo permitido es255
veces el número de bytes producidos por la función de resumen seleccionada (por ejemplo,sha512
genera hashes de 64 bytes, lo que hace que la salida HKDF máxima sea de 16320 bytes).- Devuelve: <ArrayBuffer>
Proporciona una función de derivación de claves HKDF síncrona como se define en RFC 5869. El ikm
, salt
e info
dados se utilizan con el digest
para derivar una clave de keylen
bytes.
La derivedKey
generada correctamente se devolverá como un <ArrayBuffer>.
Se lanzará un error si alguno de los argumentos de entrada especifica valores o tipos no válidos, o si no se puede generar la clave derivada.
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)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar un callback inválido al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.0.0 | Los argumentos password y salt también pueden ser instancias de ArrayBuffer. |
v14.0.0 | El parámetro iterations ahora está restringido a valores positivos. Las versiones anteriores trataban otros valores como uno. |
v8.0.0 | El parámetro digest ahora siempre es requerido. |
v6.0.0 | Llamar a esta función sin pasar el parámetro digest ahora está obsoleto y emitirá una advertencia. |
v6.0.0 | La codificación predeterminada para password si es una cadena cambió de binary a utf8 . |
v0.5.5 | Añadido en: v0.5.5 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>callback
<Function>
Proporciona una implementación asíncrona de la Función de Derivación de Claves Basada en Contraseña 2 (PBKDF2). Un algoritmo de resumen HMAC seleccionado especificado por digest
se aplica para derivar una clave de la longitud de bytes solicitada (keylen
) de la password
, salt
e iterations
.
La función callback
suministrada se llama con dos argumentos: err
y derivedKey
. Si ocurre un error al derivar la clave, se establecerá err
; de lo contrario, err
será null
. Por defecto, la derivedKey
generada correctamente se pasará al callback como un Buffer
. Se lanzará un error si alguno de los argumentos de entrada especifica valores o tipos no válidos.
El argumento iterations
debe ser un número establecido lo más alto posible. Cuanto mayor sea el número de iteraciones, más segura será la clave derivada, pero tardará más tiempo en completarse.
El salt
debe ser lo más único posible. Se recomienda que un salt sea aleatorio y de al menos 16 bytes de longitud. Consulte NIST SP 800-132 para obtener más detalles.
Cuando se pasan cadenas para password
o salt
, por favor considere las advertencias al usar cadenas 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'
});
Se puede recuperar una matriz de funciones hash admitidas utilizando crypto.getHashes()
.
Esta API utiliza el threadpool de libuv, lo que puede tener implicaciones de rendimiento sorprendentes y negativas para algunas aplicaciones; consulte la documentación de UV_THREADPOOL_SIZE
para obtener más información.
crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)
[Historial]
Versión | Cambios |
---|---|
v14.0.0 | El parámetro iterations ahora está restringido a valores positivos. Las versiones anteriores trataban otros valores como uno. |
v6.0.0 | Llamar a esta función sin pasar el parámetro digest ahora está en desuso y emitirá una advertencia. |
v6.0.0 | La codificación predeterminada para password si es una cadena cambió de binary a utf8 . |
v0.9.3 | Agregado en: v0.9.3 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>- Devuelve: <Buffer>
Proporciona una implementación sincrónica de la función de derivación de claves basada en contraseñas 2 (PBKDF2). Un algoritmo de resumen HMAC seleccionado especificado por digest
se aplica para derivar una clave de la longitud de bytes solicitada (keylen
) de la password
, salt
e iterations
.
Si ocurre un error, se lanzará un Error
, de lo contrario, la clave derivada se devolverá como un Buffer
.
El argumento iterations
debe ser un número establecido lo más alto posible. Cuanto mayor sea el número de iteraciones, más segura será la clave derivada, pero tardará más tiempo en completarse.
El salt
debe ser lo más único posible. Se recomienda que un salt sea aleatorio y tenga al menos 16 bytes de longitud. Consulte NIST SP 800-132 para obtener más detalles.
Cuando pase cadenas para password
o salt
, considere las advertencias al usar cadenas como entradas a las API 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'
Se puede recuperar una matriz de funciones de resumen admitidas mediante crypto.getHashes()
.
crypto.privateDecrypt(privateKey, buffer)
[Historial]
Versión | Cambios |
---|---|
v21.6.2, v20.11.1, v18.19.1 | El relleno RSA_PKCS1_PADDING se deshabilitó a menos que la compilación de OpenSSL admita el rechazo implícito. |
v15.0.0 | Se agregaron string, ArrayBuffer y CryptoKey como tipos de clave permitidos. El oaepLabel puede ser un ArrayBuffer. El buffer puede ser un string o ArrayBuffer. Todos los tipos que aceptan buffers están limitados a un máximo de 2 ** 31 - 1 bytes. |
v12.11.0 | Se agregó la opción oaepLabel . |
v12.9.0 | Se agregó la opción oaepHash . |
v11.6.0 | Esta función ahora admite objetos de clave. |
v0.11.14 | Agregado en: v0.11.14 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>oaepHash
<string> La función hash que se utilizará para el relleno OAEP y MGF1. Predeterminado:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> La etiqueta que se utilizará para el relleno OAEP. Si no se especifica, no se utiliza ninguna etiqueta.padding
<crypto.constants> Un valor de relleno opcional definido encrypto.constants
, que puede ser:crypto.constants.RSA_NO_PADDING
,crypto.constants.RSA_PKCS1_PADDING
ocrypto.constants.RSA_PKCS1_OAEP_PADDING
.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Devuelve: <Buffer> Un nuevo
Buffer
con el contenido descifrado.
Descifra buffer
con privateKey
. buffer
se cifró previamente utilizando la clave pública correspondiente, por ejemplo, utilizando crypto.publicEncrypt()
.
Si privateKey
no es un KeyObject
, esta función se comporta como si privateKey
se hubiera pasado a crypto.createPrivateKey()
. Si es un objeto, se puede pasar la propiedad padding
. De lo contrario, esta función utiliza RSA_PKCS1_OAEP_PADDING
.
El uso de crypto.constants.RSA_PKCS1_PADDING
en crypto.privateDecrypt()
requiere que OpenSSL admita el rechazo implícito (rsa_pkcs1_implicit_rejection
). Si la versión de OpenSSL utilizada por Node.js no admite esta función, el intento de utilizar RSA_PKCS1_PADDING
fallará.
crypto.privateEncrypt(privateKey, buffer)
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | Se agregaron string, ArrayBuffer y CryptoKey como tipos de clave permitidos. La frase de contraseña puede ser un ArrayBuffer. El búfer puede ser un string o ArrayBuffer. Todos los tipos que aceptan búferes están limitados a un máximo de 2 ** 31 - 1 bytes. |
v11.6.0 | Esta función ahora soporta objetos clave. |
v1.1.0 | Agregado en: v1.1.0 |
privateKey
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> Una clave privada codificada en PEM.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Una frase de contraseña opcional para la clave privada.padding
<crypto.constants> Un valor de relleno opcional definido encrypto.constants
, que puede ser:crypto.constants.RSA_NO_PADDING
ocrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> La codificación de cadena a usar cuandobuffer
,key
opassphrase
son cadenas.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Devuelve: <Buffer> Un nuevo
Buffer
con el contenido encriptado.
Encripta buffer
con privateKey
. Los datos devueltos pueden ser desencriptados usando la clave pública correspondiente, por ejemplo usando crypto.publicDecrypt()
.
Si privateKey
no es un KeyObject
, esta función se comporta como si privateKey
se hubiera pasado a crypto.createPrivateKey()
. Si es un objeto, se puede pasar la propiedad padding
. De lo contrario, esta función usa RSA_PKCS1_PADDING
.
crypto.publicDecrypt(key, buffer)
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | Se agregaron string, ArrayBuffer y CryptoKey como tipos de clave permitidos. La contraseña puede ser un ArrayBuffer. El buffer puede ser un string o ArrayBuffer. Todos los tipos que aceptan buffers están limitados a un máximo de 2 ** 31 - 1 bytes. |
v11.6.0 | Esta función ahora admite objetos de clave. |
v1.1.0 | Agregado en: v1.1.0 |
key
<Objeto> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Una contraseña opcional para la clave privada.padding
<crypto.constants> Un valor de padding opcional definido encrypto.constants
, que puede ser:crypto.constants.RSA_NO_PADDING
ocrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> La codificación de cadena a utilizar cuandobuffer
,key
opassphrase
son cadenas.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Devuelve: <Buffer> Un nuevo
Buffer
con el contenido descifrado.
Descifra el buffer
con key
. El buffer
se cifró previamente utilizando la clave privada correspondiente, por ejemplo, utilizando crypto.privateEncrypt()
.
Si key
no es un KeyObject
, esta función se comporta como si key
se hubiera pasado a crypto.createPublicKey()
. Si es un objeto, se puede pasar la propiedad padding
. De lo contrario, esta función utiliza RSA_PKCS1_PADDING
.
Dado que las claves públicas RSA se pueden derivar de las claves privadas, se puede pasar una clave privada en lugar de una clave pública.
crypto.publicEncrypt(key, buffer)
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | Se agregaron string, ArrayBuffer y CryptoKey como tipos de clave permitidos. oaepLabel y passphrase pueden ser ArrayBuffers. El buffer puede ser un string o ArrayBuffer. Todos los tipos que aceptan buffers están limitados a un máximo de 2 ** 31 - 1 bytes. |
v12.11.0 | Se agregó la opción oaepLabel . |
v12.9.0 | Se agregó la opción oaepHash . |
v11.6.0 | Esta función ahora soporta objetos key. |
v0.11.14 | Agregado en: v0.11.14 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> Una clave pública o privada codificada en PEM, <KeyObject> o <CryptoKey>.oaepHash
<string> La función hash a utilizar para el relleno OAEP y MGF1. Por defecto:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> La etiqueta a utilizar para el relleno OAEP. Si no se especifica, no se utiliza ninguna etiqueta.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Una frase de contraseña opcional para la clave privada.padding
<crypto.constants> Un valor de relleno opcional definido encrypto.constants
, que puede ser:crypto.constants.RSA_NO_PADDING
,crypto.constants.RSA_PKCS1_PADDING
ocrypto.constants.RSA_PKCS1_OAEP_PADDING
.encoding
<string> La codificación de cadena a utilizar cuandobuffer
,key
,oaepLabel
opassphrase
son strings.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Devuelve: <Buffer> Un nuevo
Buffer
con el contenido encriptado.
Encripta el contenido de buffer
con key
y devuelve un nuevo Buffer
con el contenido encriptado. Los datos devueltos se pueden desencriptar utilizando la clave privada correspondiente, por ejemplo utilizando crypto.privateDecrypt()
.
Si key
no es un KeyObject
, esta función se comporta como si key
hubiera sido pasado a crypto.createPublicKey()
. Si es un objeto, se puede pasar la propiedad padding
. De lo contrario, esta función utiliza RSA_PKCS1_OAEP_PADDING
.
Dado que las claves públicas RSA se pueden derivar de las claves privadas, se puede pasar una clave privada en lugar de una clave pública.
crypto.randomBytes(size[, callback])
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar un callback inválido al argumento callback ahora arroja ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v9.0.0 | Pasar null como el argumento callback ahora arroja ERR_INVALID_CALLBACK . |
v0.5.8 | Agregado en: v0.5.8 |
size
<number> El número de bytes a generar. Elsize
no debe ser mayor que2**31 - 1
.callback
<Function>Devuelve: <Buffer> si la función
callback
no es proporcionada.
Genera datos pseudorandom seguros criptográficamente. El argumento size
es un número que indica la cantidad de bytes a generar.
Si se proporciona una función callback
, los bytes se generan de forma asíncrona y la función callback
se invoca con dos argumentos: err
y buf
. Si ocurre un error, err
será un objeto Error
; de lo contrario, será null
. El argumento buf
es un Buffer
que contiene los bytes generados.
// Asíncrono
const {
randomBytes,
} = await import('node:crypto');
randomBytes(256, (err, buf) => {
if (err) throw err;
console.log(`${buf.length} bytes de datos aleatorios: ${buf.toString('hex')}`);
});
// Asíncrono
const {
randomBytes,
} = require('node:crypto');
randomBytes(256, (err, buf) => {
if (err) throw err;
console.log(`${buf.length} bytes de datos aleatorios: ${buf.toString('hex')}`);
});
Si no se proporciona la función callback
, los bytes aleatorios se generan de forma síncrona y se devuelven como un Buffer
. Se lanzará un error si hay un problema al generar los bytes.
// Síncrono
const {
randomBytes,
} = await import('node:crypto');
const buf = randomBytes(256);
console.log(
`${buf.length} bytes de datos aleatorios: ${buf.toString('hex')}`);
// Síncrono
const {
randomBytes,
} = require('node:crypto');
const buf = randomBytes(256);
console.log(
`${buf.length} bytes de datos aleatorios: ${buf.toString('hex')}`);
El método crypto.randomBytes()
no se completará hasta que haya suficiente entropía disponible. Normalmente, esto no debería tardar más de unos pocos milisegundos. La única vez que la generación de bytes aleatorios puede bloquearse durante un período de tiempo más prolongado es inmediatamente después del arranque, cuando todo el sistema todavía tiene poca entropía.
Esta API utiliza el threadpool de libuv, lo que puede tener implicaciones de rendimiento sorprendentes y negativas para algunas aplicaciones; consulte la documentación de UV_THREADPOOL_SIZE
para obtener más información.
La versión asíncrona de crypto.randomBytes()
se lleva a cabo en una única solicitud de threadpool. Para minimizar la variación en la duración de las tareas del threadpool, particione las solicitudes grandes de randomBytes
cuando lo haga como parte del cumplimiento de una solicitud del cliente.
crypto.randomFill(buffer[, offset][, size], callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una callback no válida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v9.0.0 | El argumento buffer puede ser cualquier TypedArray o DataView . |
v7.10.0, v6.13.0 | Añadido en: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Debe ser suministrado. El tamaño delbuffer
proporcionado no debe ser mayor que2**31 - 1
.offset
<number> Predeterminado:0
size
<number> Predeterminado:buffer.length - offset
. Elsize
no debe ser mayor que2**31 - 1
.callback
<Function>function(err, buf) {}
.
Esta función es similar a crypto.randomBytes()
pero requiere que el primer argumento sea un Buffer
que será rellenado. También requiere que se pase un callback.
Si no se proporciona la función callback
, se lanzará un error.
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'));
});
// Lo anterior es equivalente a lo siguiente:
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'));
});
// Lo anterior es equivalente a lo siguiente:
randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
Cualquier instancia de ArrayBuffer
, TypedArray
o DataView
puede ser pasada como buffer
.
Aunque esto incluye instancias de Float32Array
y Float64Array
, esta función no debe ser utilizada para generar números de punto flotante aleatorios. El resultado puede contener +Infinity
, -Infinity
y NaN
, e incluso si el array contiene sólo números finitos, no se extraen de una distribución aleatoria uniforme y no tienen límites inferiores o 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 utiliza el threadpool de libuv, lo cual puede tener implicaciones de rendimiento sorprendentes y negativas para algunas aplicaciones; consulte la documentación de UV_THREADPOOL_SIZE
para más información.
La versión asíncrona de crypto.randomFill()
se lleva a cabo en una única solicitud de threadpool. Para minimizar la variación de la longitud de la tarea del threadpool, particione las solicitudes grandes de randomFill
cuando lo haga como parte del cumplimiento de una solicitud de cliente.
crypto.randomFillSync(buffer[, offset][, size])
[Historial]
Versión | Cambios |
---|---|
v9.0.0 | El argumento buffer puede ser cualquier TypedArray o DataView . |
v7.10.0, v6.13.0 | Añadido en: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Debe ser proporcionado. El tamaño delbuffer
proporcionado no debe ser mayor que2**31 - 1
.offset
<number> Predeterminado:0
size
<number> Predeterminado:buffer.length - offset
. Elsize
no debe ser mayor que2**31 - 1
.- Devuelve: <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> El objeto pasado como argumento
buffer
.
Versión 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'));
// The above is equivalent to the following:
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'));
// The above is equivalent to the following:
randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));
Cualquier instancia de ArrayBuffer
, TypedArray
o DataView
puede ser pasada 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])
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v14.10.0, v12.19.0 | Añadido en: v14.10.0, v12.19.0 |
min
<integer> Inicio del rango aleatorio (inclusivo). Predeterminado:0
.max
<integer> Fin del rango aleatorio (exclusivo).callback
<Function>function(err, n) {}
.
Devuelve un entero aleatorio n
tal que min \<= n \< max
. Esta implementación evita el sesgo de módulo.
El rango (max - min
) debe ser menor que 2. min
y max
deben ser enteros seguros.
Si no se proporciona la función callback
, el entero aleatorio se genera de forma síncrona.
// Asíncrono
const {
randomInt,
} = await import('node:crypto');
randomInt(3, (err, n) => {
if (err) throw err;
console.log(`Número aleatorio elegido de (0, 1, 2): ${n}`);
});
// Asíncrono
const {
randomInt,
} = require('node:crypto');
randomInt(3, (err, n) => {
if (err) throw err;
console.log(`Número aleatorio elegido de (0, 1, 2): ${n}`);
});
// Síncrono
const {
randomInt,
} = await import('node:crypto');
const n = randomInt(3);
console.log(`Número aleatorio elegido de (0, 1, 2): ${n}`);
// Síncrono
const {
randomInt,
} = require('node:crypto');
const n = randomInt(3);
console.log(`Número aleatorio elegido de (0, 1, 2): ${n}`);
// Con el argumento `min`
const {
randomInt,
} = await import('node:crypto');
const n = randomInt(1, 7);
console.log(`El dado rodó: ${n}`);
// Con el argumento `min`
const {
randomInt,
} = require('node:crypto');
const n = randomInt(1, 7);
console.log(`El dado rodó: ${n}`);
crypto.randomUUID([options])
Añadido en: v15.6.0, v14.17.0
options
<Objeto>disableEntropyCache
<booleano> Por defecto, para mejorar el rendimiento, Node.js genera y almacena en caché suficientes datos aleatorios para generar hasta 128 UUID aleatorios. Para generar un UUID sin usar la caché, establecedisableEntropyCache
entrue
. Predeterminado:false
.
Devuelve: <string>
Genera un UUID aleatorio RFC 4122 versión 4. El UUID se genera utilizando un generador de números pseudoaleatorios criptográfico.
crypto.scrypt(password, salt, keylen[, options], callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una callback no válida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.0.0 | Los argumentos password y salt también pueden ser instancias de ArrayBuffer. |
v12.8.0, v10.17.0 | El valor maxmem ahora puede ser cualquier entero seguro. |
v10.9.0 | Se han añadido los nombres de las opciones cost , blockSize y parallelization . |
v10.5.0 | Añadido en: v10.5.0 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Objeto>cost
<number> Parámetro de coste de CPU/memoria. Debe ser una potencia de dos mayor que uno. Predeterminado:16384
.blockSize
<number> Parámetro de tamaño de bloque. Predeterminado:8
.parallelization
<number> Parámetro de paralelización. Predeterminado:1
.N
<number> Alias decost
. Sólo se puede especificar uno de los dos.r
<number> Alias deblockSize
. Sólo se puede especificar uno de los dos.p
<number> Alias deparallelization
. Sólo se puede especificar uno de los dos.maxmem
<number> Límite superior de memoria. Es un error cuando (aproximadamente)128 * N * r \> maxmem
. Predeterminado:32 * 1024 * 1024
.
callback
<Función>
Proporciona una implementación scrypt asíncrona. Scrypt es una función de derivación de claves basada en contraseñas que está diseñada para ser costosa desde el punto de vista computacional y de la memoria con el fin de que los ataques de fuerza bruta no sean gratificantes.
El salt
debe ser lo más único posible. Se recomienda que un salt sea aleatorio y tenga al menos 16 bytes de longitud. Consulta NIST SP 800-132 para obtener más detalles.
Al pasar cadenas para password
o salt
, considera las advertencias al usar cadenas como entradas a las API criptográficas.
La función callback
se llama con dos argumentos: err
y derivedKey
. err
es un objeto de excepción cuando falla la derivación de la clave, de lo contrario err
es null
. derivedKey
se pasa a la callback como un Buffer
.
Se lanza una excepción cuando cualquiera de los argumentos de entrada especifica valores o tipos no válidos.
const {
scrypt,
} = await import('node:crypto');
// Usando los valores predeterminados de fábrica.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
// Usando un parámetro N personalizado. Debe ser una potencia de dos.
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 los valores predeterminados de fábrica.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
// Usando un parámetro N personalizado. Debe ser una potencia de dos.
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])
[Historial]
Versión | Cambios |
---|---|
v12.8.0, v10.17.0 | El valor de maxmem ahora puede ser cualquier entero seguro. |
v10.9.0 | Se han añadido los nombres de las opciones cost , blockSize y parallelization . |
v10.5.0 | Añadido en: v10.5.0 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Object>cost
<number> Parámetro de coste de CPU/memoria. Debe ser una potencia de dos mayor que uno. Predeterminado:16384
.blockSize
<number> Parámetro de tamaño de bloque. Predeterminado:8
.parallelization
<number> Parámetro de paralelización. Predeterminado:1
.N
<number> Alias paracost
. Sólo se puede especificar uno de los dos.r
<number> Alias parablockSize
. Sólo se puede especificar uno de los dos.p
<number> Alias paraparallelization
. Sólo se puede especificar uno de los dos.maxmem
<number> Límite superior de memoria. Es un error cuando (aproximadamente)128 * N * r \> maxmem
. Predeterminado:32 * 1024 * 1024
.
Devuelve: <Buffer>
Proporciona una implementación síncrona de scrypt. Scrypt es una función de derivación de claves basada en contraseñas que está diseñada para ser costosa computacionalmente y en cuanto a memoria con el fin de hacer que los ataques de fuerza bruta no sean gratificantes.
El salt
debe ser lo más único posible. Se recomienda que un salt sea aleatorio y tenga al menos 16 bytes de longitud. Consulte NIST SP 800-132 para obtener más detalles.
Cuando se pasan cadenas para password
o salt
, por favor considere precauciones al usar cadenas como entradas para APIs criptográficas.
Se lanza una excepción cuando la derivación de claves falla, de lo contrario la clave derivada se devuelve como un Buffer
.
Se lanza una excepción cuando cualquiera de los argumentos de entrada especifica valores o tipos no válidos.
const {
scryptSync,
} = await import('node:crypto');
// Using the factory defaults.
const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex')); // '3745e48...08d59ae'
// Using a custom N parameter. Must be a power of two.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex')); // '3745e48...aa39b34'
const {
scryptSync,
} = require('node:crypto');
// Using the factory defaults.
const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex')); // '3745e48...08d59ae'
// Using a custom N parameter. Must be a power of two.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex')); // '3745e48...aa39b34'
crypto.secureHeapUsed()
Agregada en: v15.6.0
- Devuelve: <Objeto>
total
<number> El tamaño total del heap seguro asignado, tal como se especifica mediante el indicador de línea de comandos--secure-heap=n
.min
<number> La asignación mínima del heap seguro, tal como se especifica mediante el indicador de línea de comandos--secure-heap-min
.used
<number> El número total de bytes actualmente asignados desde el heap seguro.utilization
<number> La relación calculada deused
atotal
bytes asignados.
crypto.setEngine(engine[, flags])
[Historial]
Versión | Cambios |
---|---|
v22.4.0, v20.16.0 | El soporte del motor personalizado en OpenSSL 3 está obsoleto. |
v0.11.11 | Agregada en: v0.11.11 |
engine
<string>flags
<crypto.constants> Predeterminado:crypto.constants.ENGINE_METHOD_ALL
Cargue y establezca el engine
para algunas o todas las funciones de OpenSSL (seleccionadas por flags). El soporte para motores personalizados en OpenSSL está obsoleto desde OpenSSL 3.
engine
podría ser un id o una ruta a la biblioteca compartida del motor.
El argumento opcional flags
usa ENGINE_METHOD_ALL
de forma predeterminada. Los flags
son un campo de bits que toma uno o una mezcla de los siguientes flags (definidos en 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)
Agregado en: v10.0.0
bool
<boolean>true
para habilitar el modo FIPS.
Habilita el proveedor de cifrado compatible con FIPS en una compilación de Node.js habilitada para FIPS. Lanza un error si el modo FIPS no está disponible.
crypto.sign(algorithm, data, key[, callback])
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una función de retrollamada no válida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.12.0 | Se agregó el argumento opcional de retrollamada. |
v13.2.0, v12.16.0 | Esta función ahora soporta firmas DSA y ECDSA IEEE-P1363. |
v12.0.0 | Agregado en: v12.0.0 |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>callback
<Function>Devuelve: <Buffer> si la función
callback
no se proporciona.
Calcula y devuelve la firma para data
utilizando la clave privada y el algoritmo dados. Si algorithm
es null
o undefined
, entonces el algoritmo depende del tipo de clave (especialmente Ed25519 y Ed448).
Si key
no es un KeyObject
, esta función se comporta como si key
se hubiera pasado a crypto.createPrivateKey()
. Si es un objeto, se pueden pasar las siguientes propiedades adicionales:
dsaEncoding
<string> Para DSA y ECDSA, esta opción especifica el formato de la firma generada. Puede ser uno de los siguientes:'der'
(predeterminado): Estructura de firma ASN.1 con codificación DER que codifica(r, s)
.'ieee-p1363'
: Formato de firmar || s
como se propone en IEEE-P1363.
padding
<integer> Valor de relleno opcional para RSA, uno de los siguientes:crypto.constants.RSA_PKCS1_PADDING
(predeterminado)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
utilizará MGF1 con la misma función hash utilizada para firmar el mensaje como se especifica en la sección 3.1 de RFC 4055.
saltLength
<integer> Longitud de la sal para cuando el relleno esRSA_PKCS1_PSS_PADDING
. El valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
establece la longitud de la sal al tamaño del resumen,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(predeterminado) la establece al valor máximo permitido.
Si se proporciona la función callback
, esta función utiliza el grupo de hilos de libuv.
crypto.subtle
Agregado en: v17.4.0
- Tipo: <SubtleCrypto>
Un alias conveniente para crypto.webcrypto.subtle
.
crypto.timingSafeEqual(a, b)
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | Los argumentos a y b también pueden ser ArrayBuffer. |
v6.6.0 | Agregado en: v6.6.0 |
a
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>b
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>- Devuelve: <boolean>
Esta función compara los bytes subyacentes que representan las instancias de ArrayBuffer
, TypedArray
o DataView
dadas utilizando un algoritmo de tiempo constante.
Esta función no filtra información de tiempo que permitiría a un atacante adivinar uno de los valores. Esto es adecuado para comparar resúmenes HMAC o valores secretos como cookies de autenticación o URL de capacidad.
a
y b
deben ser ambos Buffer
s, TypedArray
s o DataView
s, y deben tener la misma longitud de bytes. Se genera un error si a
y b
tienen diferentes longitudes de bytes.
Si al menos uno de a
y b
es un TypedArray
con más de un byte por entrada, como Uint16Array
, el resultado se calculará utilizando el orden de bytes de la plataforma.
Cuando ambas entradas son Float32Array
s o Float64Array
s, esta función podría devolver resultados inesperados debido a la codificación IEEE 754 de números de coma flotante. En particular, ni x === y
ni Object.is(x, y)
implica que las representaciones de bytes de dos números de coma flotante x
e y
sean iguales.
El uso de crypto.timingSafeEqual
no garantiza que el código circundante sea seguro en el tiempo. Se debe tener cuidado para garantizar que el código circundante no introduzca vulnerabilidades de tiempo.
crypto.verify(algorithm, data, key, signature[, callback])
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar un callback inválido al argumento callback ahora arroja ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.12.0 | Se agregó el argumento callback opcional. |
v15.0.0 | Los argumentos data, key y signature también pueden ser ArrayBuffer. |
v13.2.0, v12.16.0 | Esta función ahora soporta firmas DSA y ECDSA IEEE-P1363. |
v12.0.0 | Agregado en: 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>Devuelve: <boolean>
true
ofalse
dependiendo de la validez de la firma para los datos y la clave pública si no se proporciona la funcióncallback
.
Verifica la firma dada para data
utilizando la clave y el algoritmo dados. Si algorithm
es null
o undefined
, entonces el algoritmo depende del tipo de clave (especialmente Ed25519 y Ed448).
Si key
no es un KeyObject
, esta función se comporta como si key
se hubiera pasado a crypto.createPublicKey()
. Si es un objeto, se pueden pasar las siguientes propiedades adicionales:
dsaEncoding
<string> Para DSA y ECDSA, esta opción especifica el formato de la firma. Puede ser uno de los siguientes:'der'
(por defecto): Estructura de firma ASN.1 codificada en DER que codifica(r, s)
.'ieee-p1363'
: Formato de firmar || s
como se propone en IEEE-P1363.
padding
<integer> Valor de relleno opcional para RSA, uno de los siguientes:crypto.constants.RSA_PKCS1_PADDING
(por defecto)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
utilizará MGF1 con la misma función hash utilizada para firmar el mensaje como se especifica en la sección 3.1 de RFC 4055.
saltLength
<integer> Longitud de la sal para cuando el relleno esRSA_PKCS1_PSS_PADDING
. El valor especialcrypto.constants.RSA_PSS_SALTLEN_DIGEST
establece la longitud de la sal al tamaño del resumen,crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(por defecto) lo establece al valor máximo permisible.
El argumento signature
es la firma previamente calculada para los data
.
Dado que las claves públicas pueden derivarse de las claves privadas, se puede pasar una clave privada o una clave pública para key
.
Si se proporciona la función callback
, esta función utiliza el threadpool de libuv.
crypto.webcrypto
Agregado en: v15.0.0
Tipo: <Crypto> Una implementación del estándar Web Crypto API.
Consulte la documentación de Web Crypto API para obtener más detalles.
Notas
Uso de cadenas como entradas para las API criptográficas
Por razones históricas, muchas API criptográficas proporcionadas por Node.js aceptan cadenas como entradas donde el algoritmo criptográfico subyacente funciona con secuencias de bytes. Estas instancias incluyen textos planos, textos cifrados, claves simétricas, vectores de inicialización, contraseñas, sales, etiquetas de autenticación y datos autenticados adicionales.
Al pasar cadenas a las API criptográficas, tenga en cuenta los siguientes factores.
- No todas las secuencias de bytes son cadenas UTF-8 válidas. Por lo tanto, cuando una secuencia de bytes de longitud
n
se deriva de una cadena, su entropía es generalmente menor que la entropía de una secuencian
de bytes aleatoria o pseudoaleatoria. Por ejemplo, ninguna cadena UTF-8 dará como resultado la secuencia de bytesc0 af
. Las claves secretas deben ser casi exclusivamente secuencias de bytes aleatorias o pseudoaleatorias. - De manera similar, al convertir secuencias de bytes aleatorias o pseudoaleatorias en cadenas UTF-8, las subsecuencias que no representan puntos de código válidos pueden ser reemplazadas por el carácter de reemplazo Unicode (
U+FFFD
). La representación de bytes de la cadena Unicode resultante puede, por lo tanto, no ser igual a la secuencia de bytes de la que se creó la cadena. Las salidas de los cifrados, las funciones hash, los algoritmos de firma y las funciones de derivación de claves son secuencias de bytes pseudoaleatorias y no deben usarse como cadenas Unicode. - Cuando las cadenas se obtienen de la entrada del usuario, algunos caracteres Unicode se pueden representar de múltiples formas equivalentes que dan como resultado diferentes secuencias de bytes. Por ejemplo, al pasar una contraseña de usuario a una función de derivación de claves, como PBKDF2 o scrypt, el resultado de la función de derivación de claves depende de si la cadena usa caracteres compuestos o descompuestos. Node.js no normaliza las representaciones de caracteres. Los desarrolladores deben considerar usar
String.prototype.normalize()
en las entradas del usuario antes de pasarlas a las API criptográficas.
API de streams heredada (anterior a Node.js 0.10)
El módulo Crypto se añadió a Node.js antes de que existiera el concepto de una API de Stream unificada, y antes de que existieran los objetos Buffer
para manejar datos binarios. Como tal, muchas clases crypto
tienen métodos que no se encuentran normalmente en otras clases de Node.js que implementan la API de streams (p.ej. update()
, final()
o digest()
). Además, muchos métodos aceptaban y devolvían cadenas codificadas en 'latin1'
por defecto en lugar de Buffer
s. Este valor predeterminado se cambió después de Node.js v0.8 para utilizar objetos Buffer
de forma predeterminada.
Soporte para algoritmos débiles o comprometidos
El módulo node:crypto
todavía soporta algunos algoritmos que ya están comprometidos y no se recomienda su uso. La API también permite el uso de cifrados y hashes con un tamaño de clave pequeño que son demasiado débiles para un uso seguro.
Los usuarios deben asumir toda la responsabilidad de seleccionar el algoritmo criptográfico y el tamaño de la clave de acuerdo con sus requisitos de seguridad.
Basado en las recomendaciones de NIST SP 800-131A:
- MD5 y SHA-1 ya no son aceptables cuando se requiere resistencia a la colisión, como en las firmas digitales.
- Se recomienda que la clave utilizada con los algoritmos RSA, DSA y DH tenga al menos 2048 bits y la de la curva de ECDSA y ECDH al menos 224 bits, para ser segura para su uso durante varios años.
- Los grupos DH de
modp1
,modp2
ymodp5
tienen un tamaño de clave menor a 2048 bits y no se recomiendan.
Consulta la referencia para otras recomendaciones y detalles.
Algunos algoritmos que tienen debilidades conocidas y son de poca relevancia en la práctica sólo están disponibles a través del proveedor heredado, que no está habilitado por defecto.
Modo CCM
CCM es uno de los algoritmos AEAD soportados. Las aplicaciones que utilizan este modo deben adherirse a ciertas restricciones al usar la API de cifrado:
- La longitud de la etiqueta de autenticación debe especificarse durante la creación del cifrado estableciendo la opción
authTagLength
y debe ser una de 4, 6, 8, 10, 12, 14 o 16 bytes. - La longitud del vector de inicialización (nonce)
N
debe estar entre 7 y 13 bytes (7 ≤ N ≤ 13
). - La longitud del texto plano está limitada a
2 ** (8 * (15 - N))
bytes. - Al descifrar, la etiqueta de autenticación debe establecerse a través de
setAuthTag()
antes de llamar aupdate()
. De lo contrario, el descifrado fallará yfinal()
lanzará un error en cumplimiento de la sección 2.6 de RFC 3610. - El uso de métodos de flujo como
write(data)
,end(data)
opipe()
en modo CCM podría fallar ya que CCM no puede manejar más de un trozo de datos por instancia. - Al pasar datos autenticados adicionales (AAD), la longitud del mensaje real en bytes debe pasarse a
setAAD()
a través de la opciónplaintextLength
. Muchas bibliotecas criptográficas incluyen la etiqueta de autenticación en el texto cifrado, lo que significa que producen textos cifrados de la longitudplaintextLength + authTagLength
. Node.js no incluye la etiqueta de autenticación, por lo que la longitud del texto cifrado es siempreplaintextLength
. Esto no es necesario si no se utiliza AAD. - Como CCM procesa todo el mensaje a la vez,
update()
debe llamarse exactamente una vez. - Aunque llamar a
update()
es suficiente para cifrar/descifrar el mensaje, las aplicaciones deben llamar afinal()
para calcular o verificar la etiqueta de autenticación.
import { Buffer } from 'node:buffer';
const {
createCipheriv,
createDecipheriv,
randomBytes,
} = await import('node:crypto');
const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);
const aad = Buffer.from('0123456789', 'hex');
const cipher = createCipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();
// Now transmit { ciphertext, nonce, tag }.
const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
try {
decipher.final();
} catch (err) {
throw new Error('Authentication failed!', { cause: err });
}
console.log(receivedPlaintext);
const { Buffer } = require('node:buffer');
const {
createCipheriv,
createDecipheriv,
randomBytes,
} = require('node:crypto');
const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);
const aad = Buffer.from('0123456789', 'hex');
const cipher = createCipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();
// Now transmit { ciphertext, nonce, tag }.
const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
try {
decipher.final();
} catch (err) {
throw new Error('Authentication failed!', { cause: err });
}
console.log(receivedPlaintext);
Modo FIPS
Cuando se utiliza OpenSSL 3, Node.js soporta FIPS 140-2 cuando se usa con un proveedor OpenSSL 3 apropiado, como el proveedor FIPS de OpenSSL 3, que se puede instalar siguiendo las instrucciones del archivo README de FIPS de OpenSSL.
Para el soporte de FIPS en Node.js necesitará:
- Un proveedor FIPS de OpenSSL 3 correctamente instalado.
- Un archivo de configuración del módulo FIPS de OpenSSL 3.
- Un archivo de configuración de OpenSSL 3 que haga referencia al archivo de configuración del módulo FIPS.
Node.js deberá configurarse con un archivo de configuración de OpenSSL que apunte al proveedor FIPS. Un archivo de configuración de ejemplo se ve así:
nodejs_conf = nodejs_init
.include /<ruta absoluta>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
[provider_sect]
default = default_sect
# El nombre de la sección fips debe coincidir con el nombre de la sección dentro del {#the-fips-section-name-should-match-the-section-name-inside-the}
# fipsmodule.cnf incluido.
fips = fips_sect
[default_sect]
activate = 1
donde fipsmodule.cnf
es el archivo de configuración del módulo FIPS generado a partir del paso de instalación del proveedor FIPS:
openssl fipsinstall
Establezca la variable de entorno OPENSSL_CONF
para que apunte a su archivo de configuración y OPENSSL_MODULES
a la ubicación de la biblioteca dinámica del proveedor FIPS. Por ejemplo:
export OPENSSL_CONF=/<ruta al archivo de configuración>/nodejs.cnf
export OPENSSL_MODULES=/<ruta a la libreria openssl>/ossl-modules
El modo FIPS se puede habilitar en Node.js ya sea:
- Iniciando Node.js con los flags de línea de comandos
--enable-fips
o--force-fips
. - Llamando programáticamente a
crypto.setFips(true)
.
Opcionalmente, el modo FIPS se puede habilitar en Node.js a través del archivo de configuración de OpenSSL. Por ejemplo:
nodejs_conf = nodejs_init
.include /<ruta absoluta>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
alg_section = algorithm_sect
[provider_sect]
default = default_sect
# El nombre de la sección fips debe coincidir con el nombre de la sección dentro del {#included-fipsmodulecnf}
# fipsmodule.cnf incluido.
fips = fips_sect
[default_sect]
activate = 1
[algorithm_sect]
default_properties = fips=yes
Constantes criptográficas
Las siguientes constantes exportadas por crypto.constants
se aplican a varios usos de los módulos node:crypto
, node:tls
y node:https
y generalmente son específicas de OpenSSL.
Opciones de OpenSSL
Consulte la lista de banderas SSL OP para obtener detalles.
Constante | Descripción |
---|---|
SSL_OP_ALL | Aplica múltiples soluciones para errores dentro de OpenSSL. Consulte https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html para más detalles. |
SSL_OP_ALLOW_NO_DHE_KEX | Indica a OpenSSL que permita un modo de intercambio de claves no basado en [EC]DHE para TLS v1.3 |
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION | Permite la renegociación insegura heredada entre OpenSSL y clientes o servidores sin parches. Consulte https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html . |
SSL_OP_CIPHER_SERVER_PREFERENCE | Intenta usar las preferencias del servidor en lugar de las del cliente al seleccionar un cifrado. El comportamiento depende de la versión del protocolo. Consulte https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html . |
SSL_OP_CISCO_ANYCONNECT | Indica a OpenSSL que use el identificador de versión de Cisco de DTLS_BAD_VER. |
SSL_OP_COOKIE_EXCHANGE | Indica a OpenSSL que active el intercambio de cookies. |
SSL_OP_CRYPTOPRO_TLSEXT_BUG | Indica a OpenSSL que agregue la extensión server-hello de una versión temprana del borrador de cryptopro. |
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS | Indica a OpenSSL que deshabilite una solución para una vulnerabilidad de SSL 3.0/TLS 1.0 agregada en OpenSSL 0.9.6d. |
SSL_OP_LEGACY_SERVER_CONNECT | Permite la conexión inicial a servidores que no admiten RI. |
SSL_OP_NO_COMPRESSION | Indica a OpenSSL que deshabilite el soporte para la compresión SSL/TLS. |
SSL_OP_NO_ENCRYPT_THEN_MAC | Indica a OpenSSL que deshabilite encrypt-then-MAC. |
SSL_OP_NO_QUERY_MTU | |
SSL_OP_NO_RENEGOTIATION | Indica a OpenSSL que deshabilite la renegociación. |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION | Indica a OpenSSL que siempre inicie una nueva sesión al realizar la renegociación. |
SSL_OP_NO_SSLv2 | Indica a OpenSSL que desactive SSL v2 |
SSL_OP_NO_SSLv3 | Indica a OpenSSL que desactive SSL v3 |
SSL_OP_NO_TICKET | Indica a OpenSSL que deshabilite el uso de tickets RFC4507bis. |
SSL_OP_NO_TLSv1 | Indica a OpenSSL que desactive TLS v1 |
SSL_OP_NO_TLSv1_1 | Indica a OpenSSL que desactive TLS v1.1 |
SSL_OP_NO_TLSv1_2 | Indica a OpenSSL que desactive TLS v1.2 |
SSL_OP_NO_TLSv1_3 | Indica a OpenSSL que desactive TLS v1.3 |
SSL_OP_PRIORITIZE_CHACHA | Indica al servidor OpenSSL que priorice ChaCha20-Poly1305 cuando el cliente lo haga. Esta opción no tiene efecto si SSL_OP_CIPHER_SERVER_PREFERENCE no está habilitada. |
SSL_OP_TLS_ROLLBACK_BUG | Indica a OpenSSL que deshabilite la detección de ataques de reversión de versión. |
Constantes del motor OpenSSL
Constante | Descripción |
---|---|
ENGINE_METHOD_RSA | Limitar el uso del motor a RSA |
ENGINE_METHOD_DSA | Limitar el uso del motor a DSA |
ENGINE_METHOD_DH | Limitar el uso del motor a DH |
ENGINE_METHOD_RAND | Limitar el uso del motor a RAND |
ENGINE_METHOD_EC | Limitar el uso del motor a EC |
ENGINE_METHOD_CIPHERS | Limitar el uso del motor a CIPHERS |
ENGINE_METHOD_DIGESTS | Limitar el uso del motor a DIGESTS |
ENGINE_METHOD_PKEY_METHS | Limitar el uso del motor a PKEY_METHS |
ENGINE_METHOD_PKEY_ASN1_METHS | Limitar el uso del motor a PKEY_ASN1_METHS |
ENGINE_METHOD_ALL | |
ENGINE_METHOD_NONE |
Otras constantes de OpenSSL
Constante | Descripción |
---|---|
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 | Establece la longitud de la sal para RSA_PKCS1_PSS_PADDING al tamaño del resumen al firmar o verificar. |
RSA_PSS_SALTLEN_MAX_SIGN | Establece la longitud de la sal para RSA_PKCS1_PSS_PADDING al valor máximo permitido al firmar datos. |
RSA_PSS_SALTLEN_AUTO | Hace que la longitud de la sal para RSA_PKCS1_PSS_PADDING se determine automáticamente al verificar una firma. |
POINT_CONVERSION_COMPRESSED | |
POINT_CONVERSION_UNCOMPRESSED | |
POINT_CONVERSION_HYBRID |
Constantes de crypto de Node.js
Constante | Descripción |
---|---|
defaultCoreCipherList | Especifica la lista de cifrado predeterminada incorporada utilizada por Node.js. |
defaultCipherList | Especifica la lista de cifrado predeterminada activa utilizada por el proceso actual de Node.js. |