我正在尝试匹配并验证用户通过$ _POST输入的密码和数据库中的哈希密码。问题是,当我对输入密码进行散列时,BCRYPT每次都会产生一个新的散列,这意味着没有两个散列将是相同的,这将使我无法匹配。我怎么可能匹配BCRYPT哈希密码?谢谢你的帮助!
LOGIN:
$password = password_hash(htmlentities($_POST['password']), PASSWORD_BCRYPT, array(
'cost'=>14));
$stmt = $mcon->prepare("SELECT `password` FROM members WHERE password=:password");
$stmt->bindParam(":password", $password);
$stmt->execute();
//get_result
$data_array = $stmt->fetch(PDO::FETCH_ASSOC);
//echo passwords
echo 'Password from form: ' . $password . '<br />';
echo 'Password from DB: ' . $data_array['password'] . '<br />';
//verify password
if (password_verify($password , $data_array)) {
echo 'success';
exit();
}else{
echo 'Try again m9';
exit();
}
//if $_POST password and $hashedpassword match then start session
$stmt->close();
$mcon->close();
答案 0 :(得分:1)
这不是答案,但它对您仍然有用。不要过滤密码(WHERE
子句),而是过滤用户名:
$stmt = $mcon->prepare("SELECT password FROM members WHERE username=:username");
$stmt->bindParam(":username", $username);
$stmt->execute();
此外,不要在数据库上存储密码,甚至不要在加密数据库中存储密码。只存储了哈希值和salt值。通过随机化来更改每个密码的盐。
如果你真的需要实现安全性,你至少应该阅读类似this的东西,但事实是你阅读和学习的次数越多越好,你真正需要知道多少就没有限制了。有一个安全的网站,如果这样的事情确实存在。
也许一个框架会更好,比如Laravel或Symfony。他们有插件来处理这些细节,你不可能希望写出任何接近这些安全标准的东西。
只是为了向您展示您的代码在Top 10 PHP attacks on OWASP上的不安全性。
答案 1 :(得分:1)
代码中的另一个错误:funtcion password_verify
需要哈希字符串作为第二个参数。不要将它与php-hash-datastructure混淆。所以你需要这样称呼它:
$password_input = $_POST['password'];
password_verify($password_input , $data_array['password']);
请参阅http://php.net/manual/de/function.password-verify.php
当然,PID的答案也是正确的,您需要使用用户名而不是密码来查找用户。