Hash y Seguridad

Generador de password_hash() de PHP

Ejecuta password_hash() de PHP con el algoritmo y el coste que elijas.

Valora esta herramienta

Cómo usar Generador de password_hash() de PHP

  1. Escribe la contraseña que quieres hashear.
  2. Elige el algoritmo: PASSWORD_DEFAULT y PASSWORD_BCRYPT usan el factor de coste; las opciones Argon2 lo ignoran.
  3. Haz clic en Ejecutar password_hash() y copia el hash resultante.

Acerca de Generador de password_hash() de PHP

Esta es la propia función password_hash() de PHP, ejecutada en el servidor exactamente como se ejecutaría en tu código. Elige el algoritmo mediante las mismas constantes que usa PHP —PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I o PASSWORD_ARGON2ID—, define un coste, y obtienes de vuelta la cadena exacta que produce la función, además del desglose que reporta password_get_info(). Es la forma rápida de ver qué genera realmente una contraseña y una configuración concretas, sin necesidad de montar un script.

Dos cosas son ciertas en todos los hashes de aquí y vale la pena entenderlas. Primero, la salida se salta automáticamente, así que ejecutar la misma contraseña dos veces da dos hashes distintos; eso es correcto, no un fallo, y por eso nunca debes comparar hashes volviendo a hashear. Verificas una contraseña con password_verify($password, $hash), que lee la sal y el coste del hash almacenado y hace la comparación por ti. Segundo, el coste (bcrypt) y los parámetros de memoria y tiempo (Argon2) son deliberadamente lentos: determinan cuán costoso resulta cada intento para un atacante, así que un coste más alto es más seguro pero tarda más. Esta herramienta limita bcrypt a un coste de 12 y usa parámetros Argon2 fijos para que un endpoint público no pueda convertirse en un drenaje de CPU.

PASSWORD_DEFAULT es bcrypt en todas las versiones de PHP hasta la fecha, pero se define como «lo que PHP considera actualmente lo mejor», así que puede cambiar en una versión futura, precisamente por eso guardas el algoritmo dentro del hash y dejas que password_verify() se encargue. Para la mayoría de proyectos nuevos, Argon2id es la mejor práctica actual. Ten en cuenta que bcrypt ignora silenciosamente cualquier contenido más allá de los primeros 72 bytes de una contraseña, así que esta herramienta rechaza una más larga en lugar de hashear una versión truncada. ¿Necesitas comprobar un hash en lugar de crear uno? Usa el verificador de bcrypt y Argon2, o compara algoritmos con el generador de Argon2. Las contraseñas se hashean y se descartan; nunca se registran ni se almacenan.

Preguntas frecuentes

¿Qué algoritmo debería elegir?

Para proyectos nuevos, PASSWORD_ARGON2ID es la mejor práctica actual siempre que tu compilación de PHP lo admita. PASSWORD_DEFAULT también es una elección segura y portátil: hoy es bcrypt y PHP lo actualiza con el tiempo. El PASSWORD_BCRYPT normal está bien y está disponible universalmente.

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

Porque password_hash() genera una sal aleatoria nueva en cada llamada y la guarda dentro de la salida. Eso es exactamente lo que quieres: evita que dos contraseñas idénticas produzcan hashes idénticos. Nunca compares contraseñas volviendo a hashear; usa password_verify() en su lugar.

¿Qué hace el factor de coste?

Para bcrypt (y PASSWORD_DEFAULT) determina cuántas rondas de trabajo requiere cada hash: cada +1 aproximadamente duplica el tiempo. Un valor más alto resiste mejor la fuerza bruta pero tarda más en calcularse. Las opciones Argon2 ignoran este coste y usan en su lugar parámetros fijos de memoria y tiempo.

¿Cómo compruebo una contraseña frente a uno de estos hashes más adelante?

Llama a password_verify($password, $hash). Lee el algoritmo, la sal y el coste del hash almacenado y devuelve true o false. No necesitas conocer ni guardar el algoritmo por separado: forma parte de la propia cadena del hash.

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

La contraseña se envía al servidor, se hashea y se descarta de inmediato; nada se registra ni se almacena, y la respuesta lleva una cabecera no-store. Aun así, para una contraseña que uses realmente en producción, generar el hash dentro de tu propio entorno siempre es la opción más prudente.