Bcrypt en JavaScript (Node.js): guía completa
1. ¿Qué es y para qué sirve?
Bcrypt es una función hash criptográfica adaptativa, diseñada específicamente para almacenar contraseñas de forma segura. A diferencia de las funciones hash tradicionales (MD5, SHA-1, SHA-256), que están optimizadas para la velocidad, Bcrypt es intencionalmente lento y consume muchos recursos. Esto hace que los ataques de fuerza bruta y las tablas rainbow sean prácticamente inviables. La librería bcrypt para Node.js ofrece una interfaz simple y confiable para hashear y verificar contraseñas.
¿Por qué usar Bcrypt? Cuando un usuario se registra en un sitio web, su contraseña nunca debe almacenarse en texto plano. Si la base de datos se ve comprometida, un atacante obtendría acceso a todas las contraseñas. Bcrypt resuelve este problema: tú hasheas la contraseña con una "sal" (salt) única y guardas solo el hash. Cuando el usuario inicia sesión, vuelves a hashear la contraseña ingresada y la comparas con el hash almacenado. Bcrypt genera e incorpora automáticamente la sal en el resultado, por lo que no necesitas almacenarla por separado.
La característica clave de Bcrypt es la capacidad de ajustar el "factor de costo" (cost factor). Cuanto mayor sea el valor de cost, más tiempo se requiere para calcular el hash. A medida que aumenta la potencia de cómputo, simplemente puedes incrementar el cost, y los hashes antiguos seguirán siendo válidos (durante la verificación se usa el cost guardado en el hash). Esto hace que Bcrypt sea resistente al progreso futuro en aceleración de hardware.
2. Instalación
Para instalar la librería Bcrypt en un proyecto Node.js, ejecuta el siguiente comando en la terminal (en la carpeta raíz del proyecto):
npm install bcrypt
Después de la instalación, puedes importar la librería en tu código:
const bcrypt = require('bcrypt');
Si usas módulos ES (type: "module" en package.json), la importación se verá así:
import bcrypt from 'bcrypt';
3. Inicio rápido — ejemplo mínimo funcional
En este ejemplo, hasheamos una contraseña y luego la verificamos. Esta es la base de cualquier sistema de autenticación.
const bcrypt = require('bcrypt');
const plainPassword = 'miSuperContraseñaSecreta123!';
const saltRounds = 10;
// Hashear la contraseña
bcrypt.hash(plainPassword, saltRounds, function(err, hash) {
if (err) {
console.error('Error al hashear:', err);
return;
}
console.log('Hash de la contraseña:', hash);
// Verificar la contraseña
bcrypt.compare(plainPassword, hash, function(err, result) {
if (err) {
console.error('Error al comparar:', err);
return;
}
console.log('La contraseña coincide:', result); // true
});
});
Este código hace dos cosas: crea un hash de la contraseña y luego verifica si la contraseña original coincide con ese hash. Observa que saltRounds determina la complejidad del cálculo (el valor recomendado es 10–12).
4. Métodos principales / funciones / clases
4.1. bcrypt.hash(data, saltOrRounds, callback)
Firma: bcrypt.hash(data: string | Buffer, saltOrRounds: number | string, callback: (err: Error | null, encrypted: string) => void): void
Qué hace: Hashea de forma asíncrona una cadena o un Buffer. saltOrRounds puede ser un número (cantidad de rondas) o una sal ya generada (cadena). Devuelve el hash a través del callback.
Ejemplo:
bcrypt.hash('password123', 12, (err, hash) => {
if (err) throw err;
console.log(hash); // $2b$12$...
});
4.2. bcrypt.hashSync(data, saltOrRounds)
Firma: bcrypt.hashSync(data: string | Buffer, saltOrRounds: number | string): string
Qué hace: Versión síncrona de También en la biblioteca
Recommendations