php password-hash php-password-hash

php - ¿Por qué password_verify devuelve falso?



password-hash php-password-hash (1)

¿Por qué password_verify devuelve falso?

Esta pregunta pretende ser canónica y se ha creado simplemente en función de la cantidad de preguntas que se han formulado sobre este tema.


Hay una variedad de razones por las que password_verify podría estar devolviendo false, puede ir desde la configuración de su tabla hasta la comparación real de la contraseña, a continuación se detallan las causas comunes por las que falla.

Configuración de la columna

  • La longitud de la columna de contraseña en su tabla es demasiado corta:

    • Si está utilizando PASSWORD_DEFAULT , se recomienda almacenar el resultado en una columna de la base de datos que pueda expandirse más allá de 60 caracteres (255 caracteres sería una buena opción).
    • Si está utilizando PASSWORD_BCRYPT , se recomienda almacenar el resultado en una columna de la base de datos que tenga 60 caracteres, ya que PASSWORD_BCRYPT siempre generará una cadena de 60 caracteres o FALSE en caso de error.

Desinfección de contraseña

Otra causa común es cuando los desarrolladores intentan "limpiar" la contraseña del usuario para evitar que sea maliciosa, como resultado, esto hace que la entrada sea diferente a lo que se almacena en la tabla. Ni siquiera es necesario escapar de la entrada, en su lugar debe usar declaraciones preparadas. Ni siquiera debería trim las contraseñas, ya que eso podría cambiar la que se proporcionó originalmente.

Verificación de contraseña

Cuando use password_verify , debe comparar la contraseña de texto sin formato con el hash de la base de datos / archivo / algún otro método de almacenamiento, no comparar hashes (la implicación aquí es que debe haber almacenado la contraseña hash del usuario cuando se registre ):

<?php $hashed = password_hash(''test'', PASSWORD_DEFAULT); $password = ''test''; if (password_verify($password, $hashed)) { echo ''success''; } else { echo ''fail''; } ?>

Asegúrese de que en realidad está pasando un hash a password_verify y no a otra cosa descargándolo.

Repl

Contraseñas codificadas

En el caso de que esté utilizando un hash codificado y tenga problemas, asegúrese de usar comillas simples en lugar de comillas dobles cuando almacene el valor en la variable, ya que el $ se interpretará cuando use comillas dobles:

<?php // Undefined variable: QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu :1 $incorrect = "$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu"; $correct = ''$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu''; ?>

Repl - Comentario fuera respectivamente.

Solución de problemas

var_dump() la contraseña con hash en el registro justo antes de insertarla en su base de datos, y var_dump() nuevamente después de recuperarla de su base de datos cuando está a punto de password_verify() con password_verify() . Asegúrese de que ambos hashes son idénticos. Si lo son, y las contraseñas de texto sin formato también son idénticas, no hay razón para que password_verify falle. Solo falla si el hash se modifica de alguna manera en su viaje de ida y vuelta a través de la base de datos, o si las contraseñas de texto sin formato no son idénticas.

Asegúrese de que está pasando un algoritmo correcto a password_hash tiene el segundo parámetro.

Apéndice

Según la documentación:

Precaución Se recomienda encarecidamente que no genere su propia sal para esta función. Creará una sal segura automáticamente para usted si no especifica una.

Como se indicó anteriormente, proporcionar la opción salt en PHP 7.0 generará una advertencia de desaprobación. El soporte para proporcionar un Salt manualmente puede eliminarse en una futura versión de PHP.