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 quePASSWORD_BCRYPT
siempre generará una cadena de 60 caracteres o FALSE en caso de error.
-
Si está utilizando
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.
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.