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)


person hellomello    schedule 14.07.2012    source источник


Ответы (2)


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

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

person Michael Hampton    schedule 14.07.2012

Итак, чтобы быть явным и основываться на ответе @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
person tim peterson    schedule 16.07.2012