Bcrypt / Blowfish和Salts与现有的auth系统

时间:2012-07-18 18:45:41

标签: php authentication blowfish bcrypt crypt

我正在尝试过渡到Blowfish以获得身份验证系统。忍受我,我不是密码学家,我对Blowfish的理解还不够。

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

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

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

现在如果我理解了所有内容,我应该这样做:

$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 $'的值。

  • 我做得对吗?

1 个答案:

答案 0 :(得分:0)

你的例子几乎是正确的。

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

$2a$07$LCzy1mE0b9lS8Uyx9HEeUgHm8zH1iDDZ5...

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

不需要盐后的'$'。

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