我正在创建一个游戏社区网站,我的目标是尽快向公众发布。目前,我正在研究密码和登录。我之前只使用过MD5,但我读过有关密码安全的内容,并听说目前正在进行腌制。
这是我的计划:每个用户都有自己独特的12个随机字符(#/¤&等),存储在users表中。在注册时对盐进行哈希(使用SHA-256)和密码,并在登录时重新进行哈希处理。
这听起来怎么样?我可以改进什么吗?我应该选择SHA-512和更长的盐,还是这个呢?
答案 0 :(得分:17)
您对12字节的建议应该是适合盐的长度。这将需要字典攻击来准备2个 96 散列密码数据库。总有一天,对于一个破解者而言,这可能是一个微不足道的操作,但我们还有一段距离。
NIST建议SHA256具有足够的密码散列强度,至少目前是这样。
如果您想探索更强大的密码安全方法,请查看PBKDF2等密钥加强技术或Bcrypt自适应散列。但是这些在SQL中没有直接的支持。您必须在应用程序代码中进行散列,然后将散列摘要发布到您的数据库中。
对于游戏网站来说,这似乎是安全性过度,但这是一个很好的做法。因为许多用户(不建议)使用与他们的银行登录相同的密码进行游戏登录!您不希望对导致重大损失的认证漏洞负责。
答案 1 :(得分:4)
更新:
请勿使用散列或HMAC。使用bcrypt
或scrypt
。见http://codahale.com/how-to-safely-store-a-password/
<强>原始强>
不要简单地哈希。使用HMAC。 (并且如果有可用的库,则避免进行自己的散列或加密,因为库可以从专家输入中受益。)
<强>参考文献:强>
答案 2 :(得分:3)
答案 3 :(得分:1)
我注意到很多关于如何正确进行密码哈希的困惑,特别是在stackoverflow上。而且我看到了一些非常糟糕的建议。所以我写了一个应该清除所有内容的页面。除了使用简单的哈希之外,还有更多内容。
更多信息和源代码:How to do password hashing properly
如果有人对密码散列有疑问,请随时分享此链接。这是我在stackoverflow上的第一篇文章,如果我做得不对,那就很抱歉
答案 4 :(得分:-1)
如果您真的担心,我会考虑使用漩涡散列函数而不是SHA变体之一。惠而浦已被证明是一种非常强大的哈希方法,并且没有碰撞或任何其他弱点的历史(我至少知道)。
您可以使用PHP的hash功能来使用漩涡。 (但请注意,hash()需要PHP 5.1.2或更高版本。)
答案 5 :(得分:-2)
您目前的做法已经足够了。