ОБНОВЛЕНИЕ Итак, это неловкое глупое признание, но проблема заключалась в том, что хэш, который я сохранил в базе данных, был хэшем «пароля», включая цитаты , не было проблем с запросами, которые я написал, проблема была между стулом и клавиатура.
Так что это часто задаваемый вопрос, и я просматривал 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 );
Вероятно, это не имеет никакого эффекта, но стоит использовать стандарты для различных реализаций 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
.