【发布时间】:2010-12-08 05:38:29
【问题描述】:
我正在使用 PHP。我曾经使用原生 mysql 函数 password() 来存储密码。有人告诉我 password() 不再安全了。在 PHP 中存储密码的最佳方法是什么?是MD5吗?
【问题讨论】:
标签: php security password-encryption
我正在使用 PHP。我曾经使用原生 mysql 函数 password() 来存储密码。有人告诉我 password() 不再安全了。在 PHP 中存储密码的最佳方法是什么?是MD5吗?
【问题讨论】:
标签: php security password-encryption
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。
我在下面给出的原始答案曾经被认为是最佳实践。然而,哈希计算技术的进步使这些方案变得脆弱。展望未来,唯一安全的密码散列方案是迭代散列,例如 bcrypt 和 PBKDF2。如需完整讨论,请参阅Jeff Atwood's analysis。
我建议首先在您的密码前添加一个 salt 值,然后是 hashing 生成的字符串,该字符串具有相当强的散列函数,例如 SHA256。这可以防止明显(纯文本密码)和不太明显(使用Rainbow tables 进行攻击)。
请记住,如果您以这种方式存储密码,您将无法找回用户丢失的密码。他们只能重置密码。这是因为您将使用one way hash。但是这种限制通常值得为更安全的密码存储系统进行权衡。即使您的数据库遭到破坏,您的用户密码仍然非常困难,并且可能不切实际地被潜在的攻击者恢复。
【讨论】:
【讨论】:
盐和哈希。
我们通常使用随机 guid 作为盐,然后使用 SHA512 进行散列。
【讨论】:
如果您可以避免存储用户密码,那是您的最佳选择,imo。使用 OpenId(如 Stackoverflow)对用户进行身份验证。或实时身份验证 (http://dev.live.com/liveid/)。如果您真的非常需要自己验证用户身份;照亚萨在回答中所说的去做。 :)
【讨论】:
为了与另一个答案争论,VBulletin 在散列密码方面做得很糟糕。他们的 salt 只有 3 个字符长,只是略微提高了应用程序的安全性。
查看http://www.openwall.com/phpass/。他们在使用长哈希、每个密码唯一的长哈希以及通过 md5 运行密码数千次方面做得非常出色。它是目前最好的 php 哈希系统之一。
【讨论】:
你需要给密码加盐。
vBulletin 在存储密码方面做得很好。 md5(md5(密码) + salt);
【讨论】: