【问题标题】:PHP: Does iterating a hash make it more secure?PHP:迭代哈希是否使其更安全?
【发布时间】:2012-01-03 19:18:33
【问题描述】:

我想知道当与 salt 一起使用时,散列哈希的过程是否有助于阻止对它的攻击(我认为是蛮力)。所以我的代码:

function hash_password($password, $salt, $site_key) {
    $hash = hash('sha512', $password . $salt . $site_key);
    for ($i=0; $i<1000; $i++) {
        $hash = hash($hash);
    }
    return $hash;
}

据我所知,我的代码是安全的,因为它通过使用盐来阻止彩虹表攻击,并通过迭代哈希来阻止暴力攻击。

这种迭代实际上会使蛮力攻击变得更加困难吗? 如果是这样,它会对性能产生多大影响? (哈希1000次需要多长时间,听说有人说你应该迭代哈希直到需要200ms)

这样做是否会模拟 bcrypt 等算法的行为?

【问题讨论】:

标签: php security hash


【解决方案1】:

是的,确实如此,原因很简单。哈希是为速度而非安全性而构建的(因为它通常用于计算大文件的校验和)。因此,具有强大 CPU 的计算机(或使用 GPU 的黑客)可能会以每秒 10 亿个哈希值来暴力破解您的代码。

如果您确保散列算法较慢(通过迭代一千次),同一台计算机每秒只能执行此算法 100 万次,而不是 100 次。所以如果攻击者用暴力破解密码需要 60 小时,现在需要 60,000 小时,也就是将近 7 年 :)


但是,您的代码没有正确实现它,您一遍又一遍地执行相同的操作,您应该在其中散列您在前一个散列中获得的散列,并添加一些安全字符(通常是迭代索引)。

while (i < 1000) { hash(somehash) } //wrong
while (i < 1000) { hash = hash(hash . i) } //correct.

PHP 已经为您内置了这个功能!将crypt()CRYPT_BLOWFISH(又名bcrypt)结合使用,您可以在函数中输入密码和盐,并在迭代和所有操作之后获得完成的哈希。欲了解更多信息,See this question.

【讨论】:

  • 如果你想阻止暴力攻击,最好使用 bcrypt 之类的东西:codahale.com/how-to-safely-store-a-password
  • kool 谢谢我知道我弄错了代码很累大声笑这就是我想知道的关于 7 年的事情 xD 用户登录时需要多长时间?
  • 散列速度慢 1000 倍,这意味着大约要长 1 毫秒(即 0.001 秒):)
  • 这会增加碰撞的风险吗?
  • 不,它没有。最终算法的输出是一个 SHA1 字符串,它将具有与任何其他 SHA1 字符串一样的可能结果的确切数量,所以不,不会增加冲突 :)
【解决方案2】:

您那里的代码只是一遍又一遍地重复同样的事情。如果您在第一次迭代后和最后一次迭代后查看$hash,您会发现它们是相同的。

这就是为什么我们只使用 bcrypt 之类的东西。如果你尝试自己实现它,你很可能会做错:)

【讨论】:

  • @Andy - 抱歉,我的意思并不是要挑选您的代码,只是要指出,当涉及到使用迭代散列进行散列强化时,已经有一个很好的解决方案(bcrypt )。尝试重新发明可能会给您留下更糟糕的解决方案(无论您是多么优秀的程序员)
猜你喜欢
  • 2012-11-14
  • 1970-01-01
  • 2013-04-24
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 2013-08-13
相关资源
最近更新 更多