我的密码盐需要多长时间,SHA-256是否足够好?

时间:2010-07-07 03:29:11

标签: php md5 hash password-protection

我正在创建一个游戏社区网站,我的目标是尽快向公众发布。目前,我正在研究密码和登录。我之前只使用过MD5,但我读过有关密码安全的内容,并听说目前正在进行腌制。

这是我的计划:每个用户都有自己独特的12个随机字符(#/¤&等),存储在users表中。在注册时对盐进行哈希(使用SHA-256)和密码,并在登录时重新进行哈希处理。

这听起来怎么样?我可以改进什么吗?我应该选择SHA-512和更长的盐,还是这个呢?

6 个答案:

答案 0 :(得分:17)

您对12字节的建议应该是适合盐的长度。这将需要字典攻击来准备2个 96 散列密码数据库。总有一天,对于一个破解者而言,这可能是一个微不足道的操作,但我们还有一段距离。

NIST建议SHA256具有足够的密码散列强度,至少目前是这样。

如果您想探索更强大的密码安全方法,请查看PBKDF2等密钥加强技术或Bcrypt自适应散列。但是这些在SQL中没有直接的支持。您必须在应用程序代码中进行散列,然后将散列摘要发布到您的数据库中。

对于游戏网站来说,这似乎是安全性过度,但这是一个很好的做法。因为许多用户(不建议)使用与他们的银行登录相同的密码进行游戏登录!您不希望对导致重大损失的认证漏洞负责。

答案 1 :(得分:4)

更新:

请勿使用散列或HMAC。使用bcryptscrypt。见http://codahale.com/how-to-safely-store-a-password/

<强>原始

不要简单地哈希。使用HMAC。 (并且如果有可用的库,则避免进行自己的散列或加密,因为库可以从专家输入中受益。)

<强>参考文献:

  1. http://rdist.root.org/2009/10/29/stop-using-unsafe-keyed-hashes-use-hmac/
  2. http://us2.php.net/manual/en/function.hash-hmac.php

答案 2 :(得分:3)

这对你的用例来说已经足够了。

但是,可以通过以下方式改进:

  1. 增加盐的大小

  2. 盐不应限于一小部分字符

  3. 迭代哈希,说1000次(加强密钥)

  4. 查看phpass

答案 3 :(得分:1)

我注意到很多关于如何正确进行密码哈希的困惑,特别是在stackoverflow上。而且我看到了一些非常糟糕的建议。所以我写了一个应该清除所有内容的页面。除了使用简单的哈希之外,还有更多内容。

更多信息和源代码:How to do password hashing properly

如果有人对密码散列有疑问,请随时分享此链接。这是我在stackoverflow上的第一篇文章,如果我做得不对,那就很抱歉

答案 4 :(得分:-1)

如果您真的担心,我会考虑使用漩涡散列函数而不是SHA变体之一。惠而浦已被证明是一种非常强大的哈希方法,并且没有碰撞或任何其他弱点的历史(我至少知道)。

您可以使用PHP的hash功能来使用漩涡。 (但请注意,hash()需要PHP 5.1.2或更高版本。)

答案 5 :(得分:-2)

您目前的做法已经足够了。