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); // trueEjemplo 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 También en la biblioteca
Configuración de aplicaciones Swift (iOS/macOS): mejores prácticas y herramientas
Geolocalización y mapas en TypeScript: bibliotecas, API y ejemplos de código
Cliente Elasticsearch para TypeScript: @elastic/elasticsearch
Respect/Validation PHP: guía completa con ejemplos prácticos
Generación de Swagger/OpenAPI en Kotlin: guía completa de herramientas