mysql — php password_hash и password_verify просмотрены все еще не работает

ОБНОВИТЬ
Так что это невероятно глупое признание, но проблема заключалась в том, что хэш, который я хранил в базе данных, был хэшем «пароля». в том числе цитаты, не было никаких проблем с вопросами, которые я написал, проблема была между стулом и клавиатурой.

Так что это часто задаваемый вопрос, и я просмотрел весь стекопоток и гугл, пытаясь найти ответ, и я потерпел неудачу.

У меня есть таблица «агентов» с логинами и паролями, назначенными каждому агенту. Поле пароля — это varchar длиной 255.

Вот мой 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>";

Я в растерянности. Кажется, это работает только тогда, когда я предоставляю локально созданную копию password_hash, и если я затем использую эту локально созданную копию в базе данных MySQL, это не удается.

Есть идеи?

3

Решение

Вы проверили это agent_password хранит хеш, сгенерированный:

password_hash( $password, PASSWORD_DEFAULT );

Вероятно, не имеет никакого эффекта, но стоит следовать стандартам для различных реализаций bindParam, Если вы используете ? метод, то:

 $s->bind_param( 1, $username );

В вашем скрипте есть несколько странных реализаций PDO, попробуйте настроить:

 $s->execute();

//$hash = $s->get_result();
//$hash = $hash->fetch_array( MYSQLI_ASSOC );
$hash = $s->fetchColumn();

Изменить последующие вызовы $hash['agent_password'] чтобы просто $hash вместо.

Проверьте следующее:

// $password = $_POST["password"];
$password = "password";

Затем также попробуйте сохранить этот хэш и получить его снова из mysql до последнего шага проверки.

Я глубоко подозреваю, что то, что хранится в agent_password на самом деле пароль не хэшируется password_hash,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]