【问题标题】:Best practices: safest method to store passwords in a table? [closed]最佳实践:将密码存储在表中的最安全方法? [关闭]
【发布时间】:2010-12-08 05:38:29
【问题描述】:

我正在使用 PHP。我曾经使用原生 mysql 函数 password() 来存储密码。有人告诉我 password() 不再安全了。在 PHP 中存储密码的最佳方法是什么?是MD5吗?

【问题讨论】:

    标签: php security password-encryption


    【解决方案1】:

    2016 年更新答案:

    PHC(密码哈希竞赛)的获胜者是Argon2。截至 2016 年,使用 Argon2 散列密码是最佳实践。

    PHC 从 2013 年到 2015 年作为一项公开竞赛进行——与 NIST 的 AES 和 SHA-3 竞赛的过程相同,也是开发加密标准的最有效方式。我们收到了 24 名候选人,其中包括许多优秀的设计,并选出了一位获胜者 Argon2,这是一种由卢森堡大学的 Alex Biryukov、Daniel Dinu 和 Dmitry Khovratovich 设计的算法。

    我们建议您使用 Argon2 而不是旧算法。

    reference implementation is available on GitHub

    2012 年更新答案:

    我在下面给出的原始答案曾经被认为是最佳实践。然而,哈希计算技术的进步使这些方案变得脆弱。展望未来,唯一安全的密码散列方案是迭代散列,例如 bcryptPBKDF2。如需完整讨论,请参阅Jeff Atwood's analysis

    2009 年原始答案:

    我建议首先在您的密码前添加一个 salt 值,然后是 hashing 生成的字符串,该字符串具有相当强的散列函数,例如 SHA256。这可以防止明显(纯文本密码)和不太明显(使用Rainbow tables 进行攻击)。

    请记住,如果您以这种方式存储密码,您将无法找回用户丢失的密码。他们只能重置密码。这是因为您将使用one way hash。但是这种限制通常值得为更安全的密码存储系统进行权衡。即使您的数据库遭到破坏,您的用户密码仍然非常困难,并且可能不切实际地被潜在的攻击者恢复。

    【讨论】:

    • 这是处理密码的两种方法之一。另一个是;别。使用 OpenId/Facebook Connect/Live Auth/其他东西;换一种说法;让其他人存储密码。
    • bcrypt 比这个设置好吗?
    • 是的,使用 bcrypt 而不是这样做。 bcrypt 正在为您做上述所有好事,还有更多。
    • @hatorade, @tialaramex:我在写这个答案时并不熟悉 bcrypt。从那以后,我了解了迭代散列的好处。我会相应地更新答案。
    【解决方案2】:
    【解决方案3】:

    盐和哈希。

    我们通常使用随机 guid 作为盐,然后使用 SHA512 进行散列。

    【讨论】:

      【解决方案4】:

      如果您可以避免存储用户密码,那是您的最佳选择,imo。使用 OpenId(如 Stackoverflow)对用户进行身份验证。或实时身份验证 (http://dev.live.com/liveid/)。如果您真的非常需要自己验证用户身份;照亚萨在回答中所说的去做。 :)

      【讨论】:

        【解决方案5】:

        为了与另一个答案争论,VBulletin 在散列密码方面做得很糟糕。他们的 salt 只有 3 个字符长,只是略微提高了应用程序的安全性。

        查看http://www.openwall.com/phpass/。他们在使用长哈希、每个密码唯一的长哈希以及通过 md5 运行密码数千次方面做得非常出色。它是目前最好的 php 哈希系统之一。

        【讨论】:

        • MD5? :( 数千次?双 :(
        • 你在看哪种算法?除非他们突然改变它,否则它最后使用了 2048 次 md5 通道,每次都使用 salt。
        【解决方案6】:

        你需要给密码加盐。

        vBulletin 在存储密码方面做得很好。 md5(md5(密码) + salt);

        【讨论】:

        • 我不确定双 md5ing 的意义是什么……这只是通过 obsecurity 实现的一种安全形式,不是吗? “哦,他们永远猜不到我 md5 做了两次!”
        • 彩虹攻击真的很难破解。现在是 32 个字符加上三个盐。
        猜你喜欢
        • 2013-01-18
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 2010-10-15
        • 2010-11-25
        • 2013-10-09
        • 1970-01-01
        相关资源
        最近更新 更多