2011年PHP密码哈希

时间:2011-06-23 10:03:26

标签: security hash passwords salt

我花了几个小时在SO上发布了一些关于在PHP / MySQL中处理密码的最安全方式的帖子。大多数答案似乎已经过时了,人们所指向的链接也是如此。许多人推荐md5和sha-1。

我们都知道MD5和SHA-1不再值得使用,因为它们已被颠倒,而且因为有许多数据库已经建立了数百万的md5 / sha1字符串。现在,显然你用盐来解决这个问题,我打算这样做。

然而,我最近开始玩漩涡,这似乎更安全,更新。我是否正确地认为漩涡+盐是对密码的充分保护?

我实际上正在考虑这样的事情:

<?php
    $static_salt = 'some_static_salt_string_hard_coded';
    $password = 'some_password_here';
    $salt = 'unique_salt_generated_here';

    $encoded = hash('whirlpool', $static_salt.$password.$salt);
?>
你怎么看?矫枉过正还是明智的?

3 个答案:

答案 0 :(得分:3)

对于大多数应用来说,这可能已经足够了。

但是,如果您的数据库泄露,则盐(几乎)无用 - 如果您的配置文件也泄漏,则包括静态数据库。它们是对彩虹表的良好保护,但是现在使用一堆GPU来强制执行给定的散列更容易。

恕我直言,目前the best solution is to use bcrypt。它显然支持PHP 5.3+,here's an example如何使用它。

答案 1 :(得分:1)

这就足够了(但静态硬编码盐没有任何意义)。而且,为什么不使用SHA256?漩涡很少使用。

答案 2 :(得分:0)

在没有更广泛地考虑威胁模型和实现细节的情况下讨论特定算法的优点尤其毫无意义。

是的,惠而浦似乎在作为哈希的效果方面有一些优势,但正如尼古拉所说,这可能具有欺骗性,并且由于它的使用不太广泛。但是还有其他考虑因素 - 出于某些目的,为每个帐户存储128个字符的字符串可能是不必要的开销。对于每个人来说,这是一个软件支持的问题(有些人可能希望使用相同的帐户记录来控制对不同系统的访问)。

在一天结束时,您的哈希算法的复杂程度无关紧要:

  1. 给予自由选择,用户选择糟糕的,可猜测的密码
  2. 用户将对不同的服务使用相同的密码
  3. 如果它适合你 - 那很好 - 但没有通用的解决方案。