0

我正在尝试过渡到 Blowfish 以获取身份验证系统。请耐心等待,我不是密码学家,我对 Blowfish 的理解还不完全。

当前设置使用 sha1 和 salts。为每个用户生成盐并存储在数据库中。归结为:

$salt = $this->getSalt($username);
$hash = sha1($password . $salt);
if ($hash == $hashInDB)
{
     // user is authenticated, set session id etc ...
}

getSalt()方法为指定用户获取存储在数据库中的盐。

现在,如果我正确理解了所有内容,那么使用 crypt 我应该这样做:

$salt = '$2a$07$' . $this->getSalt($username) . '$';
$hash = crypt($password, $salt);

if ($hash == crypt($password, $saltInDB))
{
     // The user is authenticated, set session id etc..
}

澄清一下,对于第二个示例,$saltInDB变量是一个类似于“$2a$07$arandomsaltcreatedatregistration$”的值。

  • 我做对了吗?
4

1 回答 1

0

你的例子几乎是正确的。

当您使用该函数创建散列时crypt(),您将看到使用的参数(算法、成本和盐)是生成散列的一部分(散列的开头):

$2a$07$LCzy1mE0b9lS8Uyx9HEeUgHm8zH1iDDZ5...

这意味着,您可以替换$saltInDB$hashInDB, crypt() 函数将自动从 中提取所需的参数$hashInDB。这也回答了您关于存储盐的问题,只需将哈希值存储在数据库中,盐就包含在其中。是的,您应该为每个密码生成一个新的盐。

不需要加盐后的“$”。

有关如何生成 bcrypt-hash 的更多信息,您可以在此处找到,如果您正在寻找一个完善的库,我可以推荐phpass

于 2012-07-18T21:31:23.810 回答