如何检查数据库中散列的密码?使用标准PHP5 password_hash()


How to check password that is hashed in the database? using standard PHP5 password_hash()

我使用PHP5中的password_hash()标准方法,我知道它为每次运行生成不同的哈希值。

请参阅:正确使用password_hash

问题是,如果我将散列密码存储到我的数据库(MySQL)中,如何检查用户在登录页面中输入的密码是否正确?

在我的signup.php中,我有这样的东西:

include 'PasswordHash.php' // contains various standard methods
$submitted_password = password_hash($_POST['password'], PASSWORD_BCRYPT);

$add = mysqli_query($connection, "INSERT INTO `users` VALUES(NULL,'$submitted_username','$submitted_email','$submitted_password')");

在我的login.php中,我有:

$submitted_password = $_POST['password'];
$hashed_password = password_hash($_POST['password'],PASSWORD_BCRYPT);

if (password_verify($submitted_password, $hashed_password)) {
echo "<script type='text/javascript'>alert('$pass');</script>";
} else {
echo "<script type='text/javascript'>alert('$fail');</script>";
}

这显然会呼应PASS,因为login.php会对密码进行一次散列并进行比较,但是如果我尝试

echo $hashed_password;

,它与我在数据库中的完全不同,显然是因为它会生成不同的salt并使用它进行哈希。

最后一个问题:那么,当用户提交的密码每次都会被散列成不同的值时,我如何检查用户是否输入了正确的密码?

我不知道你是否能理解这个问题。。我只是不知道如何更好地描述这一点。

提前谢谢。

当用户提交的密码每次都会被散列成不同的值时,我如何检查用户是否输入了正确的密码?

假设您以正确的方式执行此操作,并向password_hash()提供所有必需的参数,包括相同的salt,则不会有什么不同。参见文档http://php.net/manual/pl/function.password-hash.php如何做到这一点。当不提供salt时,将创建随机salt,这将导致不同的散列。