PHP和MySQL:使用bcrypt哈希,并与数据库校验密码(PHP & MYSQL: using

2019-06-26 07:14发布

我使用的是安德鲁·摩尔先生的方法( 如何使用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

}

我不知道我在做什么错了,我应该得到正确的。 我也在我的tablefield到text甚至varchar(256)

Answer 1:

使用安德鲁·穆尔的课 ,你需要调用类的verify()方法来验证用户的密码哈希相匹配。 您传递给它的两个参数是明文密码的用户输入,而且你存储在数据库中的哈希值。

看来你穿过的第二哈希密码,以verify()来代替,这就是为什么它不工作。 传入明文密码作为第一个参数。



Answer 2:

因此,只要是明确的,在@迈克尔的答案建设(因为我一直在寻找在安德鲁Mooore的解决方案太):

而不是这样的:

$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


文章来源: PHP & MYSQL: using bcrypt hash and verifying password with database