最佳实践:在表中存储密码的最安全方法?

时间:2009-10-20 05:18:28

标签: php security password-encryption

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

6 个答案:

答案 0 :(得分:24)

2016年更新答案:

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

2012年更新答案:

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

2009年原始答案:

我建议首先在您的密码前加salt值,然后hashing生成的字符串,其中包含SHA256等相当强的散列函数。这可以抵御明显的(纯文本密码)而不是那么明显(使用Rainbow tables进行攻击)。

请注意,如果您以这种方式存储密码,则能够检索用户丢失的密码。他们只能重置密码。这是因为您将使用one way hash。但是这种限制通常值得权衡更安全的密码存储系统。即使您的数据库遭到入侵,您的用户密码仍然非常困难,而且攻击者可能无法恢复。

答案 1 :(得分:4)

答案 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进行哈希。