现有身份验证系统的Bycript/Browfish和Salts


Bycript/Blowfish and Salts with existing auth system

我正在尝试转换到Blowfish进行身份验证系统。请耐心等待,我不是密码学家,我对Blowfish的理解还不完全到位。

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

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

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

现在,如果我正确地理解了一切,使用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$"的值。

  • 我做得对吗

您的示例几乎是正确的。

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

$2a$07$LCzy1mE0b9lS8Uyx9HEeUgHm8zH1iDDZ5...

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

不需要盐后面的"$"。

关于如何生成bcrypt哈希的更多信息,你可以在这里找到,如果你正在寻找一个建立良好的库,我可以推荐phpass。