我正在使用 PHP。我曾经使用原生 mysql 函数 password() 来存储密码。有人告诉我 password() 不再安全了。在 PHP 中存储密码的最佳方法是什么?是MD5吗?
6 回答
更新的答案 2016:
PHC(密码哈希竞赛)的获胜者是Argon2。截至 2016 年,使用 Argon2 散列密码是最佳实践。
PHC 从 2013 年到 2015 年作为一项公开竞赛进行——与 NIST 的 AES 和 SHA-3 竞赛的过程相同,并且是开发加密标准的最有效方式。我们收到了 24 名候选人,其中包括许多优秀的设计,并选出了一位获胜者 Argon2,这是一种由卢森堡大学的 Alex Biryukov、Daniel Dinu 和 Dmitry Khovratovich 设计的算法。
我们建议您使用 Argon2 而不是传统算法。
更新的答案 2012:
我在下面给出的原始答案曾经被认为是最佳实践。然而,哈希计算技术的进步使这些方案变得脆弱。展望未来,唯一安全的密码散列方案是迭代散列,例如bcrypt和PBKDF2。有关完整的讨论,请参阅Jeff Atwood 的分析。
2009 年原始答案:
我建议首先在您的密码前添加一个盐值,然后使用SHA256等相当强大的散列函数对结果字符串进行散列。这可以防止明显(纯文本密码)和不那么明显(使用Rainbow 表的攻击)。
请记住,如果您以这种方式存储密码,您将无法找回用户丢失的密码。他们只能重置密码。这是因为您将使用单向 hash。但是这种限制通常值得为更安全的密码存储系统进行权衡。即使您的数据库遭到破坏,您的用户密码仍然非常困难,并且可能不切实际地被潜在的攻击者恢复。
bcrypt 实际上更安全。请参阅:彩虹表足够了:您需要了解的有关安全密码方案的知识
您需要对密码加盐。
vBulletin 在存储密码方面做得很好。md5(md5(密码)+盐);
为了与另一个答案争论,VBulletin 在散列密码方面做得很糟糕。他们的 salt 只有 3 个字符长,只是略微提高了应用程序的安全性。
查看http://www.openwall.com/phpass/。他们在使用长散列、每个密码唯一的长哈希以及通过 md5 运行密码数千次方面做得非常出色。它是目前最好的 php 散列系统之一。
如果您可以避免存储用户密码,那是您的最佳选择,imo。使用 OpenId(如 Stackoverflow)对用户进行身份验证。或实时身份验证 ( http://dev.live.com/liveid/ )。如果您真的,真的需要自己验证用户身份;照亚萨在回答中所说的去做。:)
盐和哈希。
我们通常使用随机 guid 作为盐,然后使用 SHA512 进行散列。