我的密码盐应该多长?SHA-256足够安全吗?

13

我正在创建一个游戏社区网站,计划很快发布。目前,我正在处理密码和登录方面的问题。以前我只使用过MD5,但是我已经了解到了密码安全性,并听说现在盐加密是最好的方法。

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

你觉得这个方案怎么样?我能做出什么改进吗?我应该选择SHA-512和更长的盐,还是这已经足够了?

6个回答

17

你的建议是使用12个字节作为盐的长度应该足够安全。这将需要进行字典攻击才能准备出296个哈希密码的数据库。虽然有一天破解者可能会轻易完成这个操作,但我们还有很长的路要走。

NIST推荐使用SHA256作为密码的哈希算法,至少目前来说它具有足够的哈希强度。

如果你想探索更强大的密码安全方法,可以了解密钥加强技术,比如PBKDF2Bcrypt的自适应哈希。但是这些方法在SQL中没有直接的支持。你需要在应用程序代码中进行哈希,并将哈希摘要提交到数据库中。

对于一个游戏网站来说,这可能看起来像是过度保护,但这是一个好习惯。因为许多用户(不明智地)将相同的密码用于他们的游戏登录和银行登录!你不想因为间接导致重大损失的认证漏洞而负责。


1
非常好的建议。(尽管OP似乎在使用12个字符而不是12个字节的盐,这样熵就少了很多)。 - Pete
是的,说得好。只使用可打印字符,他每个字符将使用少于8位。 - Bill Karwin
1
这是错误的建议。SHA256不适合用于密码哈希;它太快了。你应该使用bcrypt、scrypt或PBKDF2。 - D.W.
2
@D.W. 你说得对,bcrypt或PBKDF2是更强大的解决方案。这就是为什么我在我的答案中提到它们的原因。 - Bill Karwin

6

3

对于你的使用情况来说,这可能已经足够了。

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

  1. 增加盐的大小

  2. 盐不应该被限制在一个小字符集合中

  3. 迭代哈希算法,比如说1000次(密钥强化)

可以参考phpass


2
我没有给你点踩,但我认为哈希一个哈希并没有任何实际好处。我读过hash chaining可以帮助防止密码在密钥通过不安全的通道发送时被盗,但当通信是在服务器和其数据库之间进行时,我有点怀疑它是否有用。而且我真的不知道,但我有一种直觉,连续哈希会引入噪声到哈希中,这将使其他人更容易复制和利用。盐可能是最好的选择。 - Andrew
4
我在提到密钥强化,例如Bill提到的PBKDF2。多次迭代被认为是最佳实践,因为它阻止了对已知哈希值的暴力攻击——攻击者已经可以访问数据库并想要获取密码(许多人在各个网站重复使用密码)。使用常见哈希函数进行这样的操作没有已知的数学弱点。 - Pete
4
盐值可以防止预先计算的字典攻击,并阻碍彩虹表攻击。多次迭代可以防止暴力破解,但是盐值仅靠自身并不能足够防止暴力破解。请注意保持原意,不要添加解释或其他信息。 - Pete
2
“我担心这会通过增加碰撞来降低安全性。” 如果您能展示支持这一观点的数学证明,那么您的直觉将在加密社区中获得即时赞誉 :-) - Pete
1
如果您想了解有关密钥延伸的内容,请访问http://www.schneier.com/paper-low-entropy.html。 - Bill Karwin
显示剩余7条评论

1

我注意到有很多人对如何正确进行密码哈希存储感到困惑,尤其是在stackoverflow上。我看到了一些非常糟糕的建议。因此,我写了一个页面来澄清所有问题。使用简单哈希算法并不是全部。

更多信息和源代码:如何正确进行密码哈希存储

如果有人问起密码哈希存储的问题,请随时分享这个链接。这是我在stackoverflow上的第一篇文章,如果我做得不好请见谅。


1
我很感激你努力详细地写出这篇文章。然而,这些建议并没有完全考虑到安全文献中的最新理解。关于盐值加密的材料是好的,但是有关哈希算法选择的材料不够好。你推荐使用SHA256,但对于密码哈希来说这不是一个好的选择。大家应该使用scrypt、bcrypt或PBKDF2。 - D.W.

-1

如果你真的很关心,我建议使用旋涡哈希函数而不是SHA变种之一。旋涡已被证明是一种非常强大的哈希方法,没有碰撞或其他弱点的历史(至少我不知道)。

您可以通过使用PHP的hash函数来使用旋涡。(但请注意,hash()需要PHP 5.1.2或更高版本。)


1
所有将可变长度字符串作为输入并输出固定长度哈希值的哈希函数都存在碰撞。这是数学上的必然性。SHA1和MD5(以及其他一些算法)的弱点在于可以通过两种方式更改单个字符串以产生碰撞。这种弱点不适用于密码哈希(尽管理论上,用户可能会构造出两个密码,其结果相同)。 - Andrew
1
当然,所有的哈希算法都有冲突的可能。我的意思是,就我所知,它本身的哈希方法没有任何弱点,使得这些冲突的出现频率高于数学上预计的冲突概率。 - Dan D.

-2

你目前的方法已经足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接