Genera el hash de una contraseña con bcrypt o Argon2, o compárala con un hash guardado
Este generador de hash de contraseñas crea hashes bcrypt (<code>$2b$</code>, coste de 4 a 15) y hashes Argon2id, Argon2i y Argon2d en el formato estándar de cadena PHC, con tus propios valores de memoria, iteraciones, paralelismo, salt y tamaño de salida. Cambia a <strong>Verificar</strong> para pegar un hash de tu base de datos, reconocer su algoritmo y parámetros por el prefijo y comprobar si una contraseña coincide. Cada hash usa un salt aleatorio nuevo y muestra cuánto tardó en tu dispositivo. El hashing se ejecuta en WebAssembly en tu navegador; la contraseña nunca se sube.
Cómo generar un hash bcrypt o Argon2
- 1Elige Hash y luego el algoritmo: Argon2id para sistemas nuevos, bcrypt para coincidir con uno existente.
- 2Ajusta el coste: un factor de coste de bcrypt o un preajuste de Argon2 como OWASP 19 MiB, t=2. Modifica a mano la memoria, las iteraciones y el paralelismo si necesitas igualar una configuración.
- 3Escribe la contraseña y pulsa Generar hash. Debajo aparecen el hash codificado, sus partes y el tiempo que tardó.
- 4Para comprobar un hash, elige Verificar, pega el hash guardado y la contraseña, y pulsa Verificar.
Por qué las contraseñas necesitan un hash lento
Un hash rápido como SHA-256 es la herramienta equivocada para contraseñas. Una sola tarjeta gráfica calcula miles de millones de hashes SHA-256 por segundo, así que una tabla filtrada de hashes SHA-256 de contraseñas puede adivinarse a ese ritmo. Las funciones de hash de contraseñas están diseñadas para ser lentas y, en el caso de Argon2, para necesitar mucha memoria, de modo que cada intento cueste tiempo y hardware reales. Un ajuste que tarda un cuarto de segundo en tu servidor le cuesta a un atacante ese mismo cuarto de segundo por cada intento y por cada usuario.
Cada hash lleva además su propio salt aleatorio, así que dos usuarios con la misma contraseña obtienen hashes distintos y las tablas precalculadas no sirven. El salt y todos los parámetros se guardan dentro de la cadena del hash, por eso una biblioteca puede verificar una contraseña solo con el hash.
Cómo leer un hash bcrypt
Un hash bcrypt como $2b$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW tiene cuatro partes: la versión 2b, el coste 12 (212 = 4096 rondas de expansión de clave), un salt de 22 caracteres y un hash de 31 caracteres, ambos en el alfabeto Base64 propio de bcrypt. Cada punto más de coste duplica el tiempo.
$2a$, $2b$ y $2y$ calculan el mismo resultado para contraseñas de hasta 72 bytes; las letras registran correcciones de errores de implementaciones antiguas. bcrypt solo lee los primeros 72 bytes de una contraseña e ignora el resto, algo sobre lo que avisa esta herramienta: una frase de contraseña larga, o una en un alfabeto no latino donde un carácter ocupa de dos a cuatro bytes, puede alcanzar ese límite antes de lo que esperas.
Argon2id, Argon2i y Argon2d
La cadena PHC registra todo lo necesario para verificar: $argon2id$v=19$m=19456,t=2,p=1$<salt>$<hash> significa versión 1.3, 19 456 KiB de memoria, 2 pasadas y 1 carril, seguidos del salt y el hash en Base64 sin relleno.
- Argon2id
- El híbrido de las dos variantes siguientes y la que RFC 9106 y OWASP recomiendan para guardar contraseñas. Úsala salvo que algo te obligue a otra.
- Argon2i
- Acceso a memoria independiente de la contraseña, lo que resiste ataques de canal lateral, pero es más débil frente al cracking con GPU cuando hay pocas pasadas.
- Argon2d
- El acceso a memoria depende de la contraseña: la más fuerte frente a GPU, pero expuesta a canales laterales. Adecuada para proof-of-work, no para servidores que comprueban inicios de sesión.
Ajustes recomendados
- Argon2id: OWASP recomienda 19 MiB de memoria con 2 iteraciones y paralelismo 1, o un equilibrio equivalente como 47 MiB con 1 iteración o 12 MiB con 3. RFC 9106 sugiere 64 MiB, 3 iteraciones y 4 carriles si la memoria lo permite.
- bcrypt: un coste de al menos 10; 12 es un valor por defecto habitual hoy. Elige el coste más alto que pueda permitirse tu endpoint de inicio de sesión: unos 250 ms por hash en el servidor es un objetivo razonable.
- Salt: 16 bytes aleatorios. Longitud del hash: 32 bytes es más que suficiente.
- El tiempo medido aquí es en tu dispositivo, en WebAssembly, que suele ser más lento que una biblioteca nativa en un servidor. Haz pruebas en tu hardware de producción antes de fijar un coste.
Cuándo usar esta herramienta
Úsala para crear un hash para un usuario semilla o un archivo de configuración, para comprobar que un hash de tu base de datos coincide de verdad con la contraseña que crees, o para averiguar con qué parámetros se creó un hash existente. Tu aplicación debe hashear las contraseñas con su propia biblioteca al registrarse el usuario; nunca debe enviar contraseñas en texto plano a un sitio web para hashearlas. Para crear una contraseña segura que hashear, usa el generador de contraseñas; para firmas con clave en lugar de almacenamiento de contraseñas, consulta el generador HMAC.
Preguntas frecuentes
- ¿Debo usar bcrypt o Argon2?
- Argon2id para sistemas nuevos: ganó la Password Hashing Competition y es memory-hard, lo que encarece mucho el cracking con GPU y ASIC. bcrypt sigue siendo aceptable y tiene un soporte muy amplio, así que mantenlo si tu stack ya lo usa.
- ¿Por qué el hash es distinto cada vez para la misma contraseña?
- Cada hash usa un salt aleatorio nuevo, así que el resultado cambia cada vez. Es intencionado. Para comprobar una contraseña, verifícala contra el hash guardado en lugar de comparar dos hashes recién generados.
- ¿Se puede descifrar un hash bcrypt o Argon2?
- No. Son funciones de un solo sentido. La única forma de encontrar la contraseña es probar candidatas y hashear cada una, algo que estos algoritmos hacen lento a propósito.
- ¿Qué es el límite de 72 bytes de bcrypt?
- bcrypt solo usa los primeros 72 bytes de la contraseña. Lo que venga después no afecta al hash, así que dos contraseñas largas que comparten sus primeros 72 bytes producen hashes que coinciden. Argon2 no tiene ese límite.
- ¿Qué factor de coste debo usar con bcrypt?
- Al menos 10, y 12 es un valor por defecto habitual. Cada incremento duplica el trabajo. Elige el valor más alto que mantenga el inicio de sesión razonablemente rápido en tu servidor.
- ¿Son compatibles los hashes bcrypt $2a$, $2b$ y $2y$?
- Sí, para contraseñas de hasta 72 bytes producen el mismo hash. La mayoría de las bibliotecas aceptan los tres prefijos, y esta herramienta los verifica todos.
- ¿Por qué verificar tarda lo mismo que generar el hash?
- Verificar significa volver a hashear la contraseña con el salt y los parámetros guardados en el hash y comparar los resultados, así que cuesta exactamente el mismo trabajo. Eso es lo que hace caro adivinar.
- ¿Se envía la contraseña a un servidor?
- No. bcrypt y Argon2 se ejecutan en WebAssembly dentro de tu navegador. Nada de lo que escribes sale de la página.