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

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

$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使散列密码更加复杂,从而使它不太可能存在于预先计算的彩虹表中。我之前误解的是,我假设所有哈希表都存在一个彩虹表。


当前回答

又是一个很好的问题,有很多非常周到的答案——+1到SO!

我没有看到明确提到的一点是,通过向每个密码添加随机盐,实际上可以保证碰巧选择相同密码的两个用户将产生不同的哈希值。

为什么这很重要?

想象一下美国西北部一家大型软件公司的密码数据库。假设它包含30,000个条目,其中500个的密码为蓝屏。进一步假设,黑客设法获得了该密码,比如从用户发给it部门的电子邮件中读取该密码。如果密码是未加盐的,黑客可以在数据库中找到散列值,然后简单地对其进行模式匹配,以获得其他499个帐户的访问权。

加密密码可以确保500个帐户中的每个帐户都有唯一的(salt+密码),为每个帐户生成不同的散列,从而将漏洞减少到单个帐户。让我们希望(尽管可能性不大),任何天真到在电子邮件消息中编写明文密码的用户都无法访问下一个操作系统的未记录的API。

其他回答

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

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

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

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

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

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

希望有帮助!

又是一个很好的问题,有很多非常周到的答案——+1到SO!

我没有看到明确提到的一点是,通过向每个密码添加随机盐,实际上可以保证碰巧选择相同密码的两个用户将产生不同的哈希值。

为什么这很重要?

想象一下美国西北部一家大型软件公司的密码数据库。假设它包含30,000个条目,其中500个的密码为蓝屏。进一步假设,黑客设法获得了该密码,比如从用户发给it部门的电子邮件中读取该密码。如果密码是未加盐的,黑客可以在数据库中找到散列值,然后简单地对其进行模式匹配,以获得其他499个帐户的访问权。

加密密码可以确保500个帐户中的每个帐户都有唯一的(salt+密码),为每个帐户生成不同的散列,从而将漏洞减少到单个帐户。让我们希望(尽管可能性不大),任何天真到在电子邮件消息中编写明文密码的用户都无法访问下一个操作系统的未记录的API。

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

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

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

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

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

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