mysql — php password_verify () хеш и пароль не будут совпадать

Я храню свои пароли в своей базе данных, хэшированной с помощью password_hash (), и я пытаюсь проверить пароли при входе в систему с помощью password_verify (). Почему-то password_verify () продолжает возвращать false.

Я прочитал документацию по этой функции, и она сказала, чтобы убедиться, что хеш, используемый в функции, находится между одинарными кавычками », иначе он прочитает хеш, как будто это три переменные из-за $, поэтому я попытался написать $ valid как это ‘$ valid’. Но это не сработало.

Когда я повторяю $ valid, результат будет $ 2y $ 10 $ zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT

Когда я проверяю $ echo $, вывод равен 123, который является паролем, используемым для создания учетной записи.

Это часть моего login.php, и именно здесь я чувствую проблему.

$emailLogin = mysqli_real_escape_string($con, $_POST['emailLogin']);

$passLogin = mysqli_real_escape_string($con, $_POST['passLogin']);

$query = "SELECT `pass` FROM `user` WHERE `email`='$emailLogin'";

$result = mysqli_query($con, $query);

$row = mysqli_fetch_array($result);

$pass = $row['pass'];

$key = VUP($passLogin, $pass);

Это часть моего verify.php

function VUP($check, $valid){

if (password_verify($check, $valid)) {
$key = 1;

} else {
echo 'Invalid password.';
$key = 0;
die();
}
return $key;

}

Также является частью verify.php

function SHP($password){

$hash = password_hash('$password', PASSWORD_BCRYPT);

return $hash;

}

Любой совет будет очень полезным.

0

Решение

«Когда я повторяю $ valid, результат будет $ 2y $ 10 $ zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT»

$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT длина хэша всего 50, она недопустима / слишком коротка, и, как я уже сказал, MySQL молча завершится сбоем; сообщение об ошибке / проверка не помогли бы здесь.

Длина столбца пароля должна быть 60 (рекомендуется 255), поэтому изначально он не был сохранен правильно.

Вам нужно будет очистить столбец пароля или таблицу, увеличить длину столбца и начать заново.

Ссылка:

«Поэтому рекомендуется хранить результат в столбце базы данных, который может расширяться за пределы 60 символов (255 символов будет хорошим выбором)».


Вы также можете изменить свой запрос следующим образом:

$con = new mysqli("xxx", "xxx", "xxx", "xxx");
if ($con->connect_error) {
die('Connect Error (' . $con->connect_errno . ') '
. $con->connect_error);
}

$query = "SELECT `pass` FROM `user` WHERE `email`='$emailLogin'";
$result = $con->query($query);

// error checking on the query
if (!$result) {
echo "<p>There was an error in query: $query</p>";
echo $con->error;
}

$row_hash = $result->fetch_array();
if (password_verify($passLogin, $row_hash['pass'])) {
echo "Success!";
}

Редактировать:

Добавляя из комментария я оставил в ОП:

Ваша функция проверки должна иметь соединение с вашей базой данных, что, как я чувствую, происходит здесь (переменная область действия). Так что вам нужно либо использовать global $con; или передайте соединение (переменную) вашей функции (что лучше в большинстве случаев).

Я не знаю, выполняете ли вы «включение» для функции, и если да, то в этом и заключается другая проблема.

т.е .: function VUP($con, $check, $valid){ или же function VUP($check, $valid){ global $con; — Попробуйте оба. использование $result = mysqli_query($con, $query) or die(mysqli_error($con)); вместо того, который у вас есть сейчас.

3

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

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

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