【问题标题】:Confusing PHP BCrypt implementation令人困惑的 PHP BCrypt 实现
【发布时间】:2012-01-02 14:20:54
【问题描述】:

我正在尝试找到一种散列算法,用于将我的密码保存在数据库中(以及盐)。我在 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 设为公共方法。这样,我可以得到一个盐,将其存储在数据库中,将哈希存储在数据库中,并使用用户的输入+盐来查看它是否与我存储在数据库中的内容进行了哈希处理。 这个想法有什么问题吗?

【问题讨论】:

    标签: php algorithm security mcrypt


    【解决方案1】:

    我不熟悉实际的bcrypt,但一定会发生以下情况:

    当您创建“哈希”时,$bcrypt-&gt;hash('password') 返回一个包含哈希值初始盐值的字符串。

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

    在任何盐化散列方案中,您总是必须存储盐和散列值。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多