El módulo crypto
de Node.js proporciona una gran cantiddad de funciones para trabajar con criptografía, desde la generación de hashes hasta el cifrado y descifrado de datos.
Funciones del módulo Crypto
Generar un Hash de una cadena
Para generar un hash de una cadena, puedes utilizar el módulo crypto
junto con el algoritmo de hash deseado, como SHA-256. Aquí tienes un ejemplo de cómo hacerlo:
import { createHash } from 'node:crypto';
const cadena = 'Mensaje a hash';
const hash = createHash('sha256');
hash.update(cadena);
const hashResultado = hash.digest('hex');
console.log('Hash SHA-256:', hashResultado);
Generar un Hash de una contraseña con Sal
Cuando se trata de almacenar contraseñas de forma segura, es importante utilizar técnicas como el hashing de contraseñas con sal (salt).
Bcrypt es una biblioteca popular que facilita este proceso. Veamos cómo generar y comparar hashes de contraseñas con Bcrypt:
import { hashSync, compareSync, genSaltSync } from 'bcrypt';
const password = 'contraseña123';
// Generar hash con sal
const saltRounds = 10;
const salt = genSaltSync(saltRounds);
const hash = hashSync(password, salt);
console.log('Hash de la contraseña:', hash);
// Comparar hash con contraseña ingresada
const contraseñaCorrecta = 'contraseña123';
const resultadoComparacion = compareSync(contraseñaCorrecta, hash);
console.log('Las contraseñas coinciden:', resultadoComparacion);
Generar un par de claves RSA
El algoritmo de cifrado RSA es ampliamente utilizado para la encriptación asimétrica. Podemos generar un par de claves RSA con el módulo crypto
de la siguiente manera:
import { generateKeyPairSync } from 'node:crypto';
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem'
}
});
console.log('Clave Pública RSA:', publicKey);
console.log('Clave Privada RSA:', privateKey);
Cifrar y descifrar datos utilizando RSA
Con las claves RSA generadas, podemos cifrar y descifrar datos de manera segura. Aquí tenéis un ejemplo de cómo hacerlo:
import { publicEncrypt, privateDecrypt } from 'node:crypto';
const mensaje = 'Mensaje a cifrar';
// Cifrar con clave pública
const mensajeCifrado = publicEncrypt(publicKey, Buffer.from(mensaje, 'utf8'));
console.log('Mensaje cifrado:', mensajeCifrado.toString('base64'));
// Descifrar con clave privada
const mensajeDescifrado = privateDecrypt(privateKey, mensajeCifrado);
console.log('Mensaje descifrado:', mensajeDescifrado.toString('utf8'));
Descarga el código
Todo el código de esta entrada está disponible para su descarga en Github