php password_hash и password_verify выглядели по-прежнему не работают

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

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

У меня есть таблица «агентов» с логинами и паролем, назначенными каждому агенту. Поле пароля – 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, она терпит неудачу.

Есть идеи?

Сохранить хэш

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

 password_hash( $password, PASSWORD_DEFAULT ); 

Проверить стандарты PDO

Вероятно, это не имеет никакого эффекта, но стоит использовать стандарты для различных реализаций 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 .