我正在使用PHP。我曾经使用原生的mysql函数password()来存储密码。我被告知密码()不再安全了。在PHP中存储密码的最佳方法是什么?是MD5吗?
答案 0 :(得分:24)
PHC(密码哈希竞争)的获胜者是Argon2。使用Argon2哈希密码是截至2016年的最佳做法。
PHC从2013年开始到2015年作为公开竞争 - 与NIST的AES和SHA-3竞赛相同的过程,以及开发加密标准的最有效方式。我们收到了24位候选人,其中包括许多出色的设计,并选出了一位获奖者Argon2,一种由Alex Biryukov,Daniel Dinu和来自卢森堡大学的Dmitry Khovratovich设计的算法。
我们建议您使用Argon2而不是传统算法。
reference implementation is available on GitHub。
我在下面给出的原始答案曾被认为是最佳做法。然而,哈希计算技术的进步使这些方案变得脆弱。展望未来,唯一安全的密码哈希方案是迭代哈希,例如bcrypt和PBKDF2。有关完整讨论,请参阅Jeff Atwood's analysis。
我建议首先在您的密码前加salt值,然后hashing生成的字符串,其中包含SHA256等相当强的散列函数。这可以抵御明显的(纯文本密码)而不是那么明显(使用Rainbow tables进行攻击)。
请注意,如果您以这种方式存储密码,则不能够检索用户丢失的密码。他们只能重置密码。这是因为您将使用one way hash。但是这种限制通常值得权衡更安全的密码存储系统。即使您的数据库遭到入侵,您的用户密码仍然非常困难,而且攻击者可能无法恢复。
答案 1 :(得分:4)
bcrypt实际上更安全。请参阅:Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes
答案 2 :(得分:2)
你需要加密密码。
vBulletin在存储密码方面表现非常出色。 md5(md5(密码)+盐);
答案 3 :(得分:2)
与另一个答案争论,VBulletin做了一个哈希密码的可怕工作。它们的盐只有3个字符长,只是略微提高了应用程序的安全性。
结帐http://www.openwall.com/phpass/。他们可以很好地使用长哈希,每个密码都是唯一的,并且通过md5运行密码数千次。它是php最好的散列系统之一。
答案 4 :(得分:0)
如果您可以避免存储最佳选择的用户密码,imo。使用OpenId(如Stackoverflow)对用户进行身份验证。或实时身份验证(http://dev.live.com/liveid/)。如果你真的,真的需要自己验证用户;亚萨在答案中说道。 :)
答案 5 :(得分:0)
盐和哈希。
我们通常使用随机guid作为salt,然后使用SHA512进行哈希。