8

我的数据库存储 bcrypt 密码,这意味着盐应该存储在密码字段中。我不想在不需要的时候创建一个单独的字段来单独存储盐。但是,当我想将用户发送给我的密码与存储在数据库中的密码进行比较时,我需要使用相同的盐对传入的密码进行哈希处理。问题:存储的哈希的哪一部分是盐?我想我可以使用简单的 substr() 返回盐。

// password stored in database.
$user->password_hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 13));


// password from form being compared to form password

$form_password_hash = password_hash($data['form-password'], PASSWORD_BCRYPT, array('cost' => 13));

if($user->getPasswordHash() == $form_password_hash)
{
    $user->setPassword($data['new-password']);
    return new Response("Your password has been changed");
}
4

2 回答 2

11

$Salt 是散列中第三个字符之后的前 22 个字符:

$2y$13$<this is the salt, 22 chars><this is the password hash>

但是您不应该手动提取盐来验证密码 - 使用password_verify 函数。它将用户输入的密码作为第一个参数,将完整的哈希作为第二个参数,并正确处理盐。

于 2013-06-27T04:36:13.960 回答
10

您需要使用该password_verify功能。此函数将解析散列密码字符串以找到盐并执行计算。

if (password_verify($data['form-password'], $user->getPasswordHash())) {
    echo 'Password is correct';
}
于 2013-06-26T22:44:44.423 回答