Criptografía en Node.js: cifrado y hash con crypto

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Criptografía en Node.js: el módulo integrado crypto



En el desarrollo web moderno, la seguridad de los datos es un aspecto crítico. Node.js proporciona un módulo integrado potente y flexible llamado crypto, que implementa una amplia gama de funciones criptográficas. Este módulo no requiere la instalación de paquetes adicionales y permite resolver tareas de hash, cifrado simétrico y asimétrico, creación de firmas digitales y HMAC (Código de Autenticación de Mensajes basado en Hash).



En este artículo, analizaremos en detalle las principales capacidades de crypto y proporcionaremos ejemplos prácticos de código.



Principales capacidades del módulo crypto



  • Hash — transformación de datos de longitud arbitraria en una cadena de longitud fija (SHA-256, SHA-512, MD5).
  • Cifrado simétrico — cifrado y descifrado con una sola clave secreta (AES-256-CBC, AES-192-GCM).
  • Cifrado asimétrico — cifrado con un par de claves (pública/privada) basado en RSA o ECDH.
  • HMAC — hash con clave secreta para verificar la integridad y autenticidad del mensaje.
  • Firmas digitales — creación y verificación de firmas para confirmar la autoría.


Cómo importar el módulo



El módulo crypto está integrado en Node.js, por lo que su importación se realiza de forma estándar:



const crypto = require('crypto');


Ejemplo 1: Hash de datos (SHA-256)



El hash es una función unidireccional que se utiliza a menudo para almacenar contraseñas y verificar la integridad de archivos.



const data = 'PythonLib — portal educativo';

// Creamos un hash SHA-256const hash = crypto.createHash('sha256');hash.update(data);const hexHash = hash.digest('hex');

console.log('Datos originales:', data);console.log('Hash SHA-256:', hexHash);// Salida: Hash SHA-256: b5a1... (64 caracteres)


Importante: Para almacenar contraseñas, no use un hash simple, sino una función con "sal" — por ejemplo, crypto.scryptSync() o pbkdf2Sync().



Ejemplo 2: Hash de contraseña con sal (scrypt)



const password = 'MiContraseñaSegura123';

// Generación de sal aleatoriaconst salt = crypto.randomBytes(16).toString('hex');

// Creación de hash con sal (scrypt)const hash = crypto.scryptSync(password, salt, 64).toString('hex');

console.log('Sal:', salt);console.log('Hash de la contraseña:', hash);

// Para verificar, usamos la misma sal y comparamos los hashesconst isMatch = crypto.scryptSync(password, salt, 64).toString('hex') === hash;console.log('La contraseña coincide:', isMatch); // true


Ejemplo 3: Cifrado simétrico AES-256-CBC



El cifrado simétrico usa una sola clave para cifrar y descifrar. El algoritmo AES-256-CBC también requiere un vector de inicialización (IV).



// Función de cifradofunction encrypt(text, key) {    const iv = crypto.randomBytes(16); // Generación de IV    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);    let encrypted = cipher.update(text, 'utf8', 'hex');    encrypted += cipher.final('hex');    return { iv: iv.toString('hex'), encrypted };}

// Función de descifradofunction decrypt(encrypted, key, ivHex) { const iv = Buffer.from(ivHex, 'hex'); const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}

// Usoconst key = crypto.randomBytes(32); // Clave de 256 bitsconst secretMessage = 'Datos secretos para PythonLib';

const encryptedData = encrypt(secretMessage, key);console.log('Cifrado:', encryptedData.encrypted);console.log('IV:', encryptedData.iv);

const decryptedMessage = decrypt(encryptedDa

Recommendations