PHP & MYSQL: использование хэша bcrypt и проверка пароля с базой данных

Я использую метод Мистера Эндрю Мура (как вы используете bcrypt для хэширования паролей в PHP?) хеширования пароля пользователя. То, что я сделал, это у меня есть страница регистрации, и она использует

$bcrypt = new Bcrypt(12);
$pass = $_POST['password']; //register password field
$hash= $bcrypt->hash($pass);

// then inserts $hash into database with users registered email (I've checked my mysql database and it indeed has an hashed item

тогда у меня есть страница входа, состоящая из полей электронной почты и пароля. Я думаю, что адреса электронной почты уникальны в моей базе данных. Поэтому, имея это в виду, я сделал сценарий, где он сначала проверяет адрес электронной почты пользователей, а затем, если он существует, проверьте хэш-пароль с этим

$bcrypt = new Bcrypt(12);

$email = $_POST['email']; //from login email field
$pass_l = $_POST['password']; // from login password field
$hash_1= $bcrypt->hash($pass_1);

$chk_email= $dbh->prepare("SELECT password FROM table WHERE email = ?");
$chk_email -> execute(array($email));

while($row = $chk_email->fetch(PDO::FETCH_ASSOC)){
    $chk_pass = $row['password']; //inside a while loop to get the password
    $pass_isGood = $bcrypt->verify($hash_1, $chk_pass);
    var_dump($pass_isGood); // I'm getting false

}

Я не уверен, что я делаю неправильно, я должен сделать так. И я установил свое столовое поле на text или даже varchar(256)

2 ответов


используя класс Эндрю Мура, вам нужно позвонить в класс verify() метод проверки соответствия пароля пользователя хэшу. Два параметра, которые вы передаете ему, - это пароль открытого текста, введенный пользователем, и хэш, сохраненный в базе данных.

Кажется, вы передали второй хэш-пароль verify() вместо этого, поэтому он не работает. Передайте пароль открытого текста в качестве первого аргумента.


Так что просто быть явным и основываться на ответе @Michael (так как я просматривал Андрей моооре это решение тоже):

вместо этого:

$hash_1= $bcrypt->hash($pass_1);
$chk_pass = $row['password']; //inside a while loop to get the password
$pass_isGood = $bcrypt->verify($hash_1, $chk_pass);

вам нужно:

$pass_l = $_POST['password'];
$chk_pass = $row['password']; //inside a while loop to get the password
$pass_isGood = $bcrypt->verify($pass_l, $chk_pass);
//notice how 1st parameter of verify(is the text input and not its hashed form