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: cifrado y hash con el módulo crypto



La seguridad de los datos es uno de los aspectos clave del desarrollo web moderno. En Node.js, el módulo incorporado crypto proporciona potentes herramientas para la protección criptográfica: desde el hash de contraseñas hasta el cifrado asimétrico. En este artículo, analizaremos en detalle las funciones principales del módulo crypto, aprenderemos a cifrar y descifrar datos, así como a almacenar contraseñas de forma segura mediante hash.



1. Importación del módulo crypto

El módulo crypto está incorporado, por lo que no requiere la instalación de paquetes adicionales. Se importa de la forma estándar:

const crypto = require('crypto');


2. Hash de datos

El hash es el proceso de transformar datos de longitud arbitraria en una cadena de longitud fija. A diferencia del cifrado, una función hash es irreversible. Los algoritmos más populares son: SHA-256, SHA-512.



Ejemplo: hash de una cadena con SHA-256

const data = 'PythonLib — ваш путеводитель в мир IT';const hash = crypto.createHash('sha256').update(data).digest('hex');console.log('SHA-256 хеш:', hash);


Ejemplo: hash con sal (bcrypt)

Para el almacenamiento seguro de contraseñas, se recomienda utilizar el algoritmo bcrypt o scrypt. Node.js tiene soporte incorporado para scrypt:

const password = 'mySuperPassword123';const salt = crypto.randomBytes(16).toString('hex');

crypto.scrypt(password, salt, 64, (err, derivedKey) => { if (err) throw err; console.log('Хеш пароля:', derivedKey.toString('hex'));});


3. Cifrado simétrico (AES)

El cifrado simétrico utiliza la misma clave para cifrar y descifrar datos. El algoritmo más común es AES (Advanced Encryption Standard).



Cifrado de datos con AES-256-CBC

const algorithm = 'aes-256-cbc';const key = crypto.randomBytes(32); // 256-битный ключconst iv = crypto.randomBytes(16);  // вектор инициализации

function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { iv: iv.toString('hex'), encryptedData: encrypted };}

const originalText = 'Секретные данные для PythonLib';const encrypted = encrypt(originalText);console.log('Зашифрованные данные:', encrypted);


Descifrado de datos

function decrypt(encryptedObj) {  const decipher = crypto.createDecipheriv(    algorithm,    key,    Buffer.from(encryptedObj.iv, 'hex')  );  let decrypted = decipher.update(encryptedObj.encryptedData, 'hex', 'utf8');  decrypted += decipher.final('utf8');  return decrypted;}

const decryptedText = decrypt(encrypted);console.log('Расшифрованный текст:', decryptedText);


4. Cifrado asimétrico (RSA)

El cifrado asimétrico utiliza un par de claves: pública (public) y privada (private). La clave pública se usa para cifrar datos y la privada para descifrarlos. Esta es la base de HTTPS y las firmas digitales.



Generación de un par de claves RSA

const { generateKeyPairSync } = require('crypto');

const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' }});

console.log('Открытый ключ:', publicKey);console.log('Закрытый ключ:', privateKey);


Cifrado y descifrado con RSA

const secretMessage = 'Привет, PythonLib!';

// Шифрование открытым ключомconst encryptedData = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(secretMessage));console.log('Зашиф

Recommendations