Volver a herramientas

Generador y Verificador Bcrypt

¿Qué es Bcrypt?

Bcrypt es un algoritmo de hashing de contraseñas diseñado por Niels Provos y David Mazières en 1999, basado en el cifrado Blowfish. Fue creado específicamente para reemplazar algoritmos rápidos como MD5 y SHA-1 en el almacenamiento de contraseñas, introduciendo el concepto de key stretching o adaptabilidad: la capacidad de aumentar la dificultad computacional a medida que el hardware mejora.

A diferencia de un hash criptográfico tradicional (SHA-256, SHA-3), bcrypt no está optimizado para velocidad. Todo lo contrario: está diseñado para ser lento y costoso computacionalmente. Esto hace que los ataques de fuerza bruta con GPU y ASIC sean económicamente inviables, ya que por cada intento de contraseña el atacante debe ejecutar miles de iteraciones de Blowfish.

Bcrypt es el algoritmo de hashing de contraseñas más utilizado del mundo. Está integrado por defecto en frameworks como Laravel, Django, Ruby on Rails, Node.js (bcrypt), Spring Security, y la mayoría de gestores de bases de datos modernos. Linux también lo soporta en /etc/shadow mediante $2b$.

Comparativa: Bcrypt vs SHA-256 vs MD5 vs Argon2

No todos los algoritmos de hash son adecuados para proteger contraseñas. Esta tabla muestra por qué bcrypt y Argon2 son superiores a SHA-256 y MD5:

Característica Bcrypt SHA-256 MD5 Argon2id
Propósito Hashing de contraseñas Hash general / datos Obsoleto / checksums Hashing de contraseñas
Salt incorporado
Adaptativo (costo variable)
Velocidad relativa Lento (~10/s) Muy rápido (~5B/s) Muy rápido (~20B/s) Configurable
Resistente a GPU Alta Muy baja Muy baja Muy alta
Límite de entrada 72 bytes Ilimitado Ilimitado Ilimitado
Longitud del hash 60 caracteres 64 caracteres 32 caracteres Variable
Estándar en frameworks Sí (Laravel, Django, Rails, Node.js) No recomendado para passwords Obsoleto Emergente (OWASP recomienda)

¿Cómo funciona Bcrypt internamente?

Bcrypt combina tres elementos clave que lo hacen seguro para contraseñas:

  1. Salt aleatorio: Cada vez que generas un hash, bcrypt crea un salt único de 16 bytes (128 bits) mediante un generador de números aleatorios criptográficamente seguro. Este salt se almacena dentro del propio hash, lo que significa que dos contraseñas idénticas producirán hashes completamente diferentes. Esto elimina los ataques de rainbow tables.
  2. Key expansion: Bcrypt convierte la contraseña y el salt en una clave de 184 bits usando el algoritmo de expansión de claves de Blowfish (EKS Blowfish), que realiza 64 iteraciones iniciales del cifrado Blowfish para mezclar los bits de forma segura.
  3. Factor de costo iterativo: El proceso se repite 2^rounds veces. Con 10 rondas, son 1,024 iteraciones completas de Blowfish. Cada iteración realimenta el resultado en la siguiente, creando una dependencia secuencial que no puede paralelizarse eficientemente en GPU o ASIC.

💡 Dato clave: La naturaleza secuencial de bcrypt es lo que lo hace resistente a hardware especializado. Mientras que MD5 puede calcularse en ASICs a 20,000 millones de hashes/segundo, un ASIC para bcrypt a 12 rondas apenas alcanza ~100,000 hashes/segundo. La diferencia es de 5 órdenes de magnitud.

Casos de uso de Bcrypt

  • Almacenamiento de contraseñas en bases de datos: El uso más común. Al registrar un usuario, guardas el hash bcrypt. Al iniciar sesión, comparas la contraseña ingresada contra el hash. Nunca almacenas la contraseña original.
  • Autenticación en sistemas Linux: Los hashes de contraseñas en /etc/shadow pueden usar $2b$ (bcrypt) en lugar del $6$ (SHA-512) predeterminado, ofreciendo mejor protección contra ataques offline.
  • Tokens de API seguros: Los tokens de larga duración pueden almacenarse como hash bcrypt en lugar de texto plano, de modo que si la base de datos se filtra, los tokens no pueden reutilizarse.
  • Protección de secrets en aplicaciones: Claves de cifrado, frases semilla de wallets, y otros secrets sensibles pueden protegerse con bcrypt con rondas altas (14+) para máxima seguridad.

Mejores prácticas para usar Bcrypt en producción

  1. Usa 10-12 rondas como mínimo. Para proyectos nuevos, apunta a 12 rondas. Mide el tiempo de respuesta en tu servidor — si supera los 500ms, reduce a 11 o 10.
  2. No trunques contraseñas largas silenciosamente. Bcrypt tiene un límite de 72 bytes. Si un usuario ingresa una contraseña de 100 caracteres, solo se hashean los primeros 72. Advierte al usuario o usa un pre-hash SHA-256 (con riesgo de colisión).
  3. Usa $2b$ en lugar de $2a$. La versión $2b$ corrige un bug de $2a$ relacionado con el tratamiento de caracteres no-ASCII y es el estándar actual en la mayoría de implementaciones modernas.
  4. Combina bcrypt con un pepper. Añade un secret estático del lado del servidor (pepper) a la contraseña antes de hashearla. Esto protege incluso si la base de datos es filtrada pero el servidor no está comprometido.
  5. Planifica la migración a Argon2id. Aunque bcrypt sigue siendo seguro en 2026, Argon2id es el ganador del PHC (Password Hashing Competition) y ofrece mejor resistencia a ASIC. Considera migrar en proyectos nuevos.