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