令人困惑的PHP BCrypt实现

时间:2011-11-20 23:54:40

标签: php algorithm security mcrypt

我正在尝试使用哈希算法来将我的密码保存在数据库中(连同盐)。我在SO上发现了这个:How do you use bcrypt for hashing passwords in PHP?。最佳答案有一个似乎有用的库。我对verify方法感到有些困惑。

要运行脚本,库的作者提供:

$bcrypt = new Bcrypt(15);

$hash = $bcrypt->hash('password');
$isGood = $bcrypt->verify('password', $hash);

hash方法接受输入字符串并使用mcrypt + salt对其进行哈希处理。结果返回$ hash。然后verify方法采用与hash方法+ $ hash相同的输入。 verify然后调用mcrypt + $ hash的值(而不是一些随机盐) - 并且不知何故结果是相同的$ hash ???

简化为:

hash = password + salt
verify = password + hash
verify = hash <-- huh???

我错过了什么?

同时

我计划修改代码,使hash方法接受$ salt参数。我将getSalt作为公共方法。这样,我可以得到一个盐,将它存储在数据库中,将哈希存储在数据库中,并使用用户的输入+盐来查看它是否存储在我存储在数据库中的内容中。 这个想法有什么问题吗?

2 个答案:

答案 0 :(得分:4)

我对实际的bcrypt并不熟悉,但以下几行必须是:

创建“哈希”时,$bcrypt->hash('password')返回一个字符串,其中包含哈希值初始盐。

当您随后说$bcrypt->verify('password', $mystring)时,函数首先从输入字符串中读取salt部分,然后使用该salt再次创建散列,最后将该计算的散列与输入字符串的散列部分进行比较。

在任何盐化哈希方案中,您将始终存储盐以及哈希值。

答案 1 :(得分:2)

这种情况下的哈希还包含salt。它连接到字符串的开头,通常类似于$2a$12$SALT...。将哈希传递给verify只是为了再次使用该salt值,其余的哈希值被忽略。这也意味着您不需要修改与盐一起使用的功能,这已经是算法的一部分。