2009-07-13 79 views
1

说一个用户注册您的网站,您散列他们选择的密码,然后使用该散列作为盐,并用该盐重新密码。使用哈希作为盐的散列?

例子:

String hash1 = MD5(password); 
String endHash = MD5(hash1 + password); 

然后存储endHash在数据库中。如果我的数据库被压缩,这个有效的恶意彩虹表会发作吗?或者我错过了会让它容易被打破的东西?

+0

这应该是第一条规则处理安全协议:不要试图变得聪明,你只会打破它。 使用随机盐。不是用户名。不是任何东西的散列。只是随机数据。 – Nefrubyr 2009-07-13 16:20:35

回答

7

这是关键加强(http://en.wikipedia.org/wiki/Key_strengthening),这是一种很好的技术,但它不能替代实际的盐。它不会保护您免受用这个双重哈希函数编写的彩虹表。

+0

感谢您的信息,将在那里添加盐。 – 2009-07-13 16:19:52

0

没有区别:您存储的数据仍仅基于密码,因此没有额外的保护。

+2

这里有一些额外的保护,因为会议彩虹桌会失败,而自定义的会花费两倍的时间来产生。但是,当然,你没有保护盐的方式是正确的。 – 2009-07-13 16:08:52

5

腌制的目的是防止使用巨大的预先计算的表格。使用此方法,可以计算任何密码的散列,而无需访问数据库。您应该存储一个随机值并将密码和该值一起散列。

0

另外,您应该避免使用MD5来支持当前较强的散列算法,如SHA1,SHA-256,SHA-512。

+0

是的,我打算用MD5作为例子,因为它是最广为人知的。 – 2009-07-13 16:19:07

1

哈希密码的弱点是攻击者对哈希函数的了解。如果他们知道你的哈希函数,但不知道你的盐,那么盐就会保护你的密码。如果他们知道散列函数和你的盐,你的数据就有风险。

由于这适用于你的问题 - 使用动态盐通常会使你很难弄清楚你的盐。这增加了安全性,但如果有人知道你的算法,将无济于事。

以这种方式增加您的复杂性确实会让您的系统更难以破解。但是,如果有足够的资源,没有什么是不可破解的。

+1

盐可以完全公开而不会影响您选择的密码方案的安全性。盐的主要工作是防止使用预先生成的彩虹表,而不是防止为每个密码生成新的自定义彩虹表。 – RoadWarrior 2009-07-13 16:17:51

1

相反散列两次,你应该使用的用户名作为盐的功能:

String hash = MD5(username + password) 

你也应该考虑使用不同的功能MD5被认为是破MD5