2

我正在使用 password_hash 函数来保护登录页面上的用户密码。但是,在注册页面上,我要求用户提示他的密码两次,但我无法比较两个哈希值,因为即使密码相同,它们也是不同的。

我应该将两个密码作为字符串进行比较,然后对密码进行哈希处理吗?或者最好的做法是什么?

4

2 回答 2

3

用于散列密码,password_hash必要时生成新盐(您可以传递自己的盐,但这不是必需的),而password_verify函数用于比较它们(此函数使用存储在散列旁边的盐以便进行适当的比较)。

创建密码时,用户以明文形式提供了两次密码,因此您只需检查$password1 == $password2.

如果您希望验证从数据库中获取的密码,您需要执行以下操作:

$password_hash = <some database query>
if (password_verify($password, $password_hash)) {
    login_success();
} else {
    login_failure();
}

您可以以相同的方式比较注册页面中的密码,但没有必要。

于 2016-02-21T03:33:56.800 回答
1

您不必散列密码。它们只是字符串,可以这样比较:

if ($_POST['password'] !== $_POST['password_verify']) {
    die('Passwords are not the same...');
}

您还可以散列真实密码,然后使用该password_verify函数确保它相同。我不知道您为什么要这样做,但可能有充分的理由:

$hash   = password_hash($_POST['password'], PASSWORD_DEFAULT);
$verify = $_POST['password_verify'];
if ( ! password_verify($verify, $hash)) {
    die('Passwords are not the same...');
}
于 2016-02-21T03:36:39.050 回答