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