2016-11-21 110 views
1

我正在使用password_hash加密用于插入数据库的密码。这是工作,但是当我用password_verify来验证它总是返回false,即使加密值相同(检查数据库的值)password_verify未返回true

这里是我的代码:

if ($_POST['submit']) { 
    $dbh = new PDO("mysql:dbname=pass;host=localhost", "root", ""); 

    $select = $dbh->query("SELECT username, password FROM passwords WHERE username = " . $dbh->quote($_POST['username'])); 

    $fetch = $select->fetch(PDO::FETCH_ASSOC); 

    if (password_verify($fetch['password'], password_hash($_POST['password'], PASSWORD_BCRYPT))) { 
     echo 'Welcome! ' . $fetch['username'] . " your password is " . $fetch['password']; 
    } else { 
     echo "no"; 
    } 
} 

加密密码数据库是

$ 2Y $ 10 $ dMXgvPo5j9.8gaSqgtxTSevlFCsJwdSn8vdLbqFirUQcFvzfk0or2

我错过什么?我在PHP中使用了不同的哈希函数(hash()),所以我对为什么这种方式不起作用感到困惑。插入的密码通过数据库加密password_hash($password, PASSWORD_BCRYPT)

任何帮助,将不胜感激。

+0

的语法是'password_verify($非散列,$散列);' - 见[文档](HTTP ://php.net/manual/en/function.password-verify.php) - 所以对于你的特定代码,它会是'password_verify($ _ POST ['password'],$ fetch ['password']); ' – Qirel

+0

$ _POST ['pa ssword']是非哈希的。 – user2101411

+0

该手册说的字符串密码,int算法的password_hash()所以你想说什么? – user2101411

回答

1

验证时,您不需要重新密码。

password_verify($_POST['password'], $fetch['password']); 

此外,你有他们在错误的顺序。

+0

谢谢,没有看到。 – user2101411

+0

标记为已答复,一切都很好。 :) –

+0

必须等待9分钟,但我会标记它时间到了 – user2101411

1

password_verify()的语法,从文档

布尔password_verify(字符串$的密码,串$哈希)

这意味着,只有2个参数,而你是在错误的顺序。除此之外,$password字符串是非哈希变量。

只需将其改变为

password_verify($_POST['password'], $fetch['password']); 

参考

+0

谢谢,我让他们错了,对不起。 – user2101411

+0

@ user2101411已经在评论中提到了你,但我想我也会发布一个答案;-) *干杯* – Qirel

+0

对不起,我没有看到它在错误的顺序,我的错误,但感谢指出它出:) – user2101411