我在理解密码盐的用途时遇到一些困难。据我了解,主要用途是阻止彩虹表攻击。然而,我所见过的实现这一点的方法似乎并没有真正使问题变得更加困难。
我看过很多教程建议盐的使用方式如下:
$hash = md5($salt.$password)
原因是散列现在映射的不是原始密码,而是密码和盐的组合。但是说$salt=foo
and $password=bar
and $hash=3858f62230ac3c915f300c664312c63f
。现在,拥有彩虹表的人可以反转哈希并得出输入“foobar”。然后,他们可以尝试所有密码组合(f、fo、foo、... oobar、obar、bar、ar、ar)。获取密码可能还需要几毫秒,但除此之外就没什么了。
我见过的另一个用途是在我的 Linux 系统上。在 /etc/shadow 中实际存储的是哈希密码with盐。例如,“foo”的盐和“bar”的密码将散列为:$1$foo$te5SBM.7C25fFDu6bIRbX1
。如果黑客以某种方式能够获得这个文件,我不知道盐有什么作用,因为反向哈希te5SBM.7C25fFDu6bIRbX
已知包含“foo”。
感谢任何人都可以阐明这一点。
EDIT: 谢谢您的帮助。总结一下我的理解,盐使散列密码更加复杂,从而使其不太可能存在于预先计算的彩虹表中。我之前误解的是,我假设所有哈希都存在彩虹表。
公共盐会not在破解单个密码时使字典攻击变得更加困难。正如您所指出的,攻击者可以访问散列密码和盐,因此在运行字典攻击时,她可以在尝试破解密码时简单地使用已知的盐。
公共盐有两件事:使破解大量密码变得更加耗时,并且使使用彩虹表变得不可行。
要理解第一个,请想象一个包含数百个用户名和密码的密码文件。如果没有盐,我可以计算“md5(attempt[0])”,然后扫描文件以查看该哈希值是否出现在任何地方。如果存在盐,那么我必须计算“md5(salt[a] .attempt[0])”,与条目 A 进行比较,然后计算“md5(salt[b] .attempt[0])”,与条目 B 进行比较等等。现在我有n
多倍的工作要做,在哪里n
是文件中包含的用户名和密码的数量。
要了解第二个,您必须了解什么是彩虹表。彩虹表是常用密码的预先计算的哈希值的大型列表。再次想象一下没有盐的密码文件。我所要做的就是遍历文件的每一行,提取散列密码,然后在彩虹表中查找它。我从来不需要计算单个哈希值。如果查找比散列函数快得多(可能是这样),这将大大加快破解文件的速度。
但如果密码文件是加盐的,那么彩虹表必须包含预散列的“盐.密码”。如果盐足够随机,这种情况就不太可能发生。我的常用预哈希密码列表(彩虹表)中可能会包含“hello”、“foobar”和“qwerty”等内容,但不会包含“jX95psDZhello”或“LPgB0sdgxfoobar”或“dZVUABJtqwerty”已预先计算。这将使彩虹表变得非常大。
因此,盐将攻击者减少到每次尝试每行一次计算,当与足够长、足够随机的密码相结合时,(一般来说)是不可破解的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)