UPDATE Так что это ошеломляюще глупый прием, но проблема в том, что хэш-я хранится в базе данных был хэш «пароль» включая цитаты, не было проблем с запросами, которые я написал, проблема была между стулом и клавиатурой.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, она терпит неудачу.
Любые идеи?
И чтобы уточнить, password_verify возвращает true, когда я поставляю локально созданную копию password_hash, но не тогда, когда я поставлю хэш, вытащенный из таблицы MySQL. –
Итак, тест с '$ testpw' работает правильно? Тогда я могу только думать о сохранении хэша в базе данных, что-то не так. Что происходит, когда вы сначала сохраняете '$ testpw', а затем выбираете эту запись из базы данных? – redelschaap
Определить «сбой» – ircmaxell