如何将散列密码与用户输入进行比较?

时间:2015-05-30 22:18:44

标签: php pdo hash

我正在尝试匹配并验证用户通过$ _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();

2 个答案:

答案 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的答案也是正确的,您需要使用用户名而不是密码来查找用户。