php - usar - password_verify no funciona
php password_hash y password_verify miró por todas partes todavía no funciona (1)
Almacena el hash
¿Ha comprobado que agent_password
está almacenando un hash generado por:
password_hash( $password, PASSWORD_DEFAULT );
Verifique los estándares de PDO
Probablemente no tenga ningún efecto, pero vale la pena seguir los estándares para las diferentes implementaciones de bindParam
. Si estás usando el ?
método, entonces:
$s->bind_param( 1, $username );
Hay varias implementaciones extrañas de PDO en su script, intente ajustar:
$s->execute();
//$hash = $s->get_result();
//$hash = $hash->fetch_array( MYSQLI_ASSOC );
$hash = $s->fetchColumn();
Cambia las llamadas posteriores de $hash[''agent_password'']
a $hash
lugar.
Prueba de funcionamiento básico
Pruebe lo siguiente:
// $password = $_POST["password"];
$password = "password";
Luego, intente almacenar ese hash y recuperarlo nuevamente desde mysql, antes del paso de verificación final.
Finalmente
Sospecho profundamente que lo que está almacenado en agent_password
no es en realidad una contraseña hash con password_hash
.
ACTUALIZACIÓN Así que esta es una admisión vergonzosamente estúpida, pero el problema era que el hash que había almacenado en la base de datos era un hash de ''contraseña'' que incluía las comillas , no había ningún problema con las consultas que escribí, el problema era entre la silla y el teclado.
Así que esta es una pregunta frecuente, y he buscado en todo stackoverflow y google tratando de encontrar la respuesta, y no han tenido éxito.
Tengo una tabla de "agentes" con los inicios de sesión y la contraseña asignados a cada agente. El campo de contraseña es varchar con una longitud de 255.
Aquí está mi código php:
$conn = new mysqli( "localhost", "VABEN", "**********", "VABen" );
if( $conn->connect_error )
{
die( "Connection failed!" . $conn->connect_error );
}
$username = $_POST["username"];
$password = $_POST["password"];
$s = $conn->prepare( "SELECT `agent_password` FROM `VABen`.`agents` WHERE `agent_login`=?" );
$s->bind_param( "s", $username );
$s->execute();
$hash = $s->get_result();
$hash = $hash->fetch_array( MYSQLI_ASSOC );
$testpw = password_hash( ''password'', PASSWORD_DEFAULT );
echo "Comparing submitted password to locally created hash $testpw which has a length of " . strlen($testpw) . "<br>";
if( password_verify( $password, $testpw ) )
{
echo "Password ''$password'' matches with hash $testpw<br>";
}
else
{
echo "Password ''$password'' does not match with hash $testpw<br>";
}
echo "<br>";
echo "Supplied Password: ''$password''<br>";
echo "Queried Hash: " . $hash[''agent_password''] . " which has a length of " . strlen( $hash[''agent_password''] ) . "<br>";
echo "Result of password_verify: ";
if( password_verify( $password, $hash[''agent_password''] ) )
echo "true<br>";
else
echo "false<br>";
Estoy en una pérdida. Parece que solo funciona cuando proporciono una copia creada localmente de password_hash, y si luego uso esa copia creada localmente en la base de datos MySQL, falla.
¿Algunas ideas?