我不太明白盐对密码的作用。据我所知,它的主要用途是阻止彩虹桌的攻击。然而,我所看到的实现这一点的方法似乎并没有真正使问题变得更难。

我看过很多教程,建议盐可以这样使用:

$hash =  md5($salt.$password)

原因是哈希现在映射的不是原来的密码,而是密码和盐的组合。但是输入$salt=foo和$password=bar和$hash=3858f62230ac3c915f300c664312c63f。现在有一张彩虹表的人可以反向哈希,得到输入“foobar”。然后他们可以尝试所有的密码组合(f, fo, foo,…)Oobar, obar, bar, ar)获取密码可能还需要几毫秒的时间,但仅此而已。

我看到的另一种用法是在我的linux系统上。在/etc/shadow中,散列密码实际上与salt一起存储。例如,salt为“foo”,password为“bar”将哈希为$1$foo$te5SBM.7C25fFDu6bIRbX1。如果黑客以某种方式获得了这个文件,我不知道盐有什么用途,因为te5SBM的反向哈希。已知7C25fFDu6bIRbX包含“foo”。

感谢大家对这件事的解释。

编辑:谢谢你的帮助。总结一下我的理解,salt使散列密码更加复杂,从而使它不太可能存在于预先计算的彩虹表中。我之前误解的是,我假设所有哈希表都存在一个彩虹表。


当前回答

我假设您正在使用PHP——md5()函数和$前面的变量——那么,您可以尝试查看本文的影子密码HOWTO特别是第11段。

另外,如果您害怕使用消息摘要算法,则可以尝试真正的密码算法,例如mcrypt模块提供的算法,或者更强大的消息摘要算法,例如提供mhash模块的算法(sha1、sha256等)。

我认为更强的消息摘要算法是必须的。已知MD5和SHA1存在冲突问题。

其他回答

盐会导致彩虹表攻击失败的原因是,对于n位盐,彩虹表必须比没有盐的表大2^n倍。

你使用“foo”作为盐的例子可以使彩虹表变大1600万倍。

以卡尔的128位盐为例,这使表变大了2^128倍,这很大了,换句话说,要多久才会有人有这么大的便携式存储器?

盐的一个目的是打败预先计算的哈希表。如果某人有一个包含数百万预计算哈希值的列表,他们将无法查找$1$foo$te5SBM。7C25fFDu6bIRbX1在表中尽管他们知道哈希和盐。他们还是要用蛮力。

另一个目的,正如Carl S提到的,是使暴力强制哈希列表更加昂贵。(给它们不同的盐)

即使盐是公开的,这两个目标仍然可以实现。

使用盐的想法是让暴力破解密码比普通的基于字符的密码更难猜中。彩虹表通常是用一个特殊的字符集构建的,并不总是包括所有可能的组合(尽管它们可以)。

所以一个好的salt值应该是一个随机的128位或更长的整数。这就是彩虹表攻击失败的原因。通过为每个存储的密码使用不同的salt值,还可以确保为一个特定的salt值构建的rainbow表(如果您是一个具有单一salt值的流行系统,可能会出现这种情况)不会让您一次访问所有密码。

据我所知,盐是为了使字典攻击更加困难。

众所周知,许多人会使用常见的单词作为密码,而不是看似随机的字符串。

因此,黑客可以利用这一点,而不是仅仅使用蛮力。他不会找像aaa, aab, aac这样的密码……而是使用单词和常用的密码(比如指环王的名字!,))

所以如果我的密码是Legolas,黑客可以尝试一下,并通过“几次”尝试来猜测它。但是,如果我们对密码加盐,它就变成了fooLegolas,哈希值就会不同,所以字典攻击就会不成功。

希望有帮助!

我假设您正在使用PHP——md5()函数和$前面的变量——那么,您可以尝试查看本文的影子密码HOWTO特别是第11段。

另外,如果您害怕使用消息摘要算法,则可以尝试真正的密码算法,例如mcrypt模块提供的算法,或者更强大的消息摘要算法,例如提供mhash模块的算法(sha1、sha256等)。

我认为更强的消息摘要算法是必须的。已知MD5和SHA1存在冲突问题。