Inicio › Herramientas para desarrolladores › Generador y verificador de hash Bcrypt

Generador y verificador de hash Bcrypt

Crea un hash bcrypt con sal para una contraseña con el factor de coste que elijas, o pega un hash existente para comprobar si una contraseña coincide con él. El hash se calcula en tu dispositivo y la contraseña nunca sale de la página.

Última actualización:

Cargando el motor bcrypt…

Tiempo estimado: midiendo…
Prefijo
Publicidad
Publicidad

Cómo usar Generador y verificador de hash Bcrypt

  1. Pestaña Generar: escribe la contraseña y elige un factor de coste. Lo habitual para inicios de sesión web es de 10 a 12.
  2. Elige el prefijo: $2b$ es el estándar actual, $2a$ sirve para bibliotecas más antiguas y $2y$ es el que escribe password_hash() de PHP.
  3. Pulsa Generar hash y copia el resultado de 60 caracteres en tu base de datos o configuración.
  4. Pestaña Verificar: pega un hash bcrypt y escribe una contraseña, luego pulsa Verificar contraseña para ver si coinciden.
  5. Revisa el desglose debajo del hash para ver su versión, coste y sal.

¿Por qué usar bcrypt en lugar de MD5 o SHA-256 para contraseñas?

Las funciones hash de uso general como MD5 y SHA-256 están diseñadas para ser rápidas. Eso es perfecto para sumas de verificación, pero terrible para contraseñas: una sola GPU moderna puede probar miles de millones de intentos MD5 o SHA-256 por segundo, así que una tabla filtrada de hashes sin sal cae ante ataques de diccionario en cuestión de horas. Además, las contraseñas idénticas producen hashes idénticos, lo que revela las contraseñas reutilizadas y hace eficaces las rainbow tables precalculadas.

bcrypt, diseñado por Niels Provos y David Mazières en 1999, resuelve ambos problemas:

  • Con sal: cada hash contiene su propia sal aleatoria de 16 bytes, así que la misma contraseña nunca da dos veces el mismo hash y las tablas precalculadas no sirven.
  • Lento a propósito: el factor de coste fija el número de rondas de expansión de clave en 2coste. Subir el coste en uno duplica el trabajo, así que puedes seguir el ritmo de un hardware más rápido simplemente aumentándolo.
  • Suficientemente exigente en memoria para incomodar a las GPU: el estado de Blowfish (4 KB de S-boxes) se reescribe constantemente, lo que hace que bcrypt sea mucho menos eficiente en GPU que un simple SHA-256.

Anatomía de un hash bcrypt

Una cadena bcrypt siempre tiene 60 caracteres. Por ejemplo, la contraseña password con coste 10 y la sal de abajo da $2b$10$N9qo8uLOickgx2ZMRZoMye8fOsiTWZqYtkxvXkKm8BMzjT7t/vIdq (pégalo en la pestaña Verificar para probarlo):

ParteEjemploSignificado
Versión$2b$Identificador del algoritmo ($2a$, $2b$ o $2y$)
Coste10$log2 del número de rondas: 210 = 1,024
SalN9qo8uLOickgx2ZMRZoMye22 caracteres = sal aleatoria de 128 bits
Suma de verificación8fOsiTWZqYtkxvXkKm8BMzjT7t/vIdq31 caracteres = resultado de 184 bits

bcrypt usa su propio alfabeto Base64, ./A-Za-z0-9, que difiere del Base64 estándar. Como la sal y el coste se guardan en el hash, para comprobar un inicio de sesión solo se necesitan el hash guardado y la contraseña que escribió el usuario.

Factor de coste y trabajo

CosteRondasTrabajo relativoUso típico
4–716–1281/64 – 1/8 del coste 10Solo pruebas unitarias
101,0241×Predeterminado en muchas bibliotecas (Node bcrypt, Spring Security, PHP)
124,0964×Una elección habitual para nuevas aplicaciones web
1416,38416×Cuentas de alto valor en las que se aceptan inicios de sesión más lentos

Haz pruebas de rendimiento en tu propio hardware de producción y elige el coste más alto que mantenga el inicio de sesión cómodamente rápido. Cuando los usuarios inicien sesión, puedes volver a calcular el hash de su contraseña con un coste mayor y guardar el nuevo hash.

Uso de bcrypt en código

  • PHP: password_hash($pw, PASSWORD_BCRYPT, ['cost' => 12]) y password_verify($pw, $hash).
  • Node.js: await bcrypt.hash(pw, 12) y await bcrypt.compare(pw, hash) (paquetes bcrypt o bcryptjs).
  • Python: bcrypt.hashpw(pw.encode(), bcrypt.gensalt(12)) y bcrypt.checkpw(pw.encode(), hash).
  • htpasswd: htpasswd -nbB -C 10 user password escribe una entrada bcrypt $2y$ para la autenticación básica de Apache.

Preguntas frecuentes

¿Por qué la misma contraseña da un hash diferente cada vez?

bcrypt añade una sal aleatoria de 128 bits a cada hash y la guarda dentro del resultado (los 22 caracteres después del coste). Por eso dos usuarios con la misma contraseña obtienen hashes diferentes, y las rainbow tables precalculadas no sirven. Para comprobar una contraseña, se vuelve a calcular su hash con la sal tomada del hash guardado, que es lo que hace la pestaña Verificar.

¿Qué factor de coste debo usar?

Elige el coste más alto que tu servidor pueda permitirse manteniendo un inicio de sesión por debajo de unos 100 a 300 milisegundos. El coste 10 es el predeterminado en muchas bibliotecas; 12 es una elección habitual en hardware moderno. Cada paso hacia arriba duplica el tiempo, tanto para ti como para un atacante. Las estimaciones de la herramienta se miden en este navegador, y los servidores suelen ser más rápidos.

¿Cuál es la diferencia entre $2a$, $2b$ y $2y$?

Son el mismo algoritmo con distintas etiquetas de versión. $2b$ lo introdujo OpenBSD en 2014 para corregir un error de longitud en su propio código, y $2y$ identifica los hashes de la versión corregida de crypt_blowfish de PHP. Para contraseñas de hasta 72 bytes, los tres producen la misma suma de verificación, así que la mayoría de las bibliotecas aceptan cualquiera de ellos.

¿Por qué bcrypt está limitado a 72 bytes?

bcrypt introduce la contraseña en la expansión de clave de Blowfish, que usa como máximo 72 bytes (incluido un byte cero final). Todo lo que venga después se ignora, así que dos contraseñas largas que comparten sus primeros 72 bytes producen el mismo hash. Ten en cuenta que los caracteres fuera del latín básico ocupan de 2 a 4 bytes en UTF-8.

¿Es seguro introducir aquí una contraseña real?

El hash se calcula por completo en tu navegador con JavaScript; no se sube ni se guarda nada. Aun así, para secretos de producción es buena práctica generar los hashes en el servidor o en el equipo donde se van a usar.

¿Se puede descifrar un hash bcrypt?

No. bcrypt es una función unidireccional. La única forma de recuperar una contraseña es probar candidatas y calcular el hash de cada una con la sal y el coste guardados, algo que bcrypt hace lento a propósito.

¿Debo usar bcrypt o Argon2?

Ambos son buenas opciones. OWASP recomienda actualmente Argon2id en primer lugar, luego scrypt, con bcrypt (coste 10 o más) como opción sólida para sistemas existentes. bcrypt es compatible casi en todas partes, incluidos PHP, Node.js, Python, Ruby, Java y Go.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Codificadores, hashes y criptografía →