我正在创建一个游戏社区网站,计划很快发布。目前,我正在处理密码和登录方面的问题。以前我只使用过MD5,但是我已经了解到了密码安全性,并听说现在盐加密是最好的方法。
这是我的计划: 每个用户都有12个随机字符(#/¤&等)组成的独特盐,存储在用户表中。在注册时,将盐(使用SHA-256)与密码一起进行哈希处理,并在登录时重新进行哈希处理。
你觉得这个方案怎么样?我能做出什么改进吗?我应该选择SHA-512和更长的盐,还是这已经足够了?
我正在创建一个游戏社区网站,计划很快发布。目前,我正在处理密码和登录方面的问题。以前我只使用过MD5,但是我已经了解到了密码安全性,并听说现在盐加密是最好的方法。
这是我的计划: 每个用户都有12个随机字符(#/¤&等)组成的独特盐,存储在用户表中。在注册时,将盐(使用SHA-256)与密码一起进行哈希处理,并在登录时重新进行哈希处理。
你觉得这个方案怎么样?我能做出什么改进吗?我应该选择SHA-512和更长的盐,还是这已经足够了?
你的建议是使用12个字节作为盐的长度应该足够安全。这将需要进行字典攻击才能准备出296个哈希密码的数据库。虽然有一天破解者可能会轻易完成这个操作,但我们还有很长的路要走。
NIST推荐使用SHA256作为密码的哈希算法,至少目前来说它具有足够的哈希强度。
如果你想探索更强大的密码安全方法,可以了解密钥加强技术,比如PBKDF2或Bcrypt的自适应哈希。但是这些方法在SQL中没有直接的支持。你需要在应用程序代码中进行哈希,并将哈希摘要提交到数据库中。
对于一个游戏网站来说,这可能看起来像是过度保护,但这是一个好习惯。因为许多用户(不明智地)将相同的密码用于他们的游戏登录和银行登录!你不想因为间接导致重大损失的认证漏洞而负责。
更新:
不要使用哈希或HMAC。使用bcrypt
或scrypt
。请参见http://codahale.com/how-to-safely-store-a-password/
原文:
不要简单地使用哈希。使用HMAC。(如果有库可用,避免自行进行哈希或加密,因为库受益于专家的输入。)
参考资料:
我注意到有很多人对如何正确进行密码哈希存储感到困惑,尤其是在stackoverflow上。我看到了一些非常糟糕的建议。因此,我写了一个页面来澄清所有问题。使用简单哈希算法并不是全部。
更多信息和源代码:如何正确进行密码哈希存储
如果有人问起密码哈希存储的问题,请随时分享这个链接。这是我在stackoverflow上的第一篇文章,如果我做得不好请见谅。
如果你真的很关心,我建议使用旋涡哈希函数而不是SHA变种之一。旋涡已被证明是一种非常强大的哈希方法,没有碰撞或其他弱点的历史(至少我不知道)。
您可以通过使用PHP的hash函数来使用旋涡。(但请注意,hash()需要PHP 5.1.2或更高版本。)
你目前的方法已经足够了。