【发布时间】:2015-05-30 22:18:43
【问题描述】:
我正在尝试匹配并验证用户通过 $_POST 输入的密码和数据库中的散列密码。问题是,当我对输入密码进行哈希处理时,BCRYPT 每次都会产生一个新的哈希值,这意味着没有两个哈希值是相同的,这不会给我匹配。我怎么可能匹配 BCRYPT 散列密码?感谢您的帮助!
登录:
$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();
【问题讨论】:
-
@pid 问题是,每个人都使用自己的盐,但我个人认为这不是一个好主意,虽然它适用于密码验证,但这不是我想要的。无论如何感谢您的帮助!
-
你在使用 PHP 5.5 吗?那个版本有新的password_xxx功能吧? password_verify() 检查登录尝试和 password_hash() 对其进行编码?也许这可以帮助你? stackoverflow.com/a/17786721/1138321
-
您可能希望在 SQL 查询中删除
password周围的反引号。它们可能是您的问题的原因。 SQL 不会使用这些,除非您需要文字,在这种情况下,您将始终获得password字符串本身,而不是数据库值。