我在这里谈论真正的彩虹表,而不是哈希表,大多数答案似乎与this question中的彩虹表混淆。
我对彩虹表的理解方式如下,破解长度为N的密码:
foobar
)foobar
,MD2 哈希将是3af4bb69e03489fc4ceebe50151d3e1a
R(3af4bb69e03489fc4ceebe50151d3e1a)
可以将这个散列映射到abcdef
然后,当你想使用这个表来破解哈希 H 时,你可以在这个哈希上使用 reducer 函数并重复步骤 2-3,直到你在你的一个链中找到一个结束值。然后,您可以使用它来破解密码,方法是转到链的第一个值并对其进行缩减和散列,直到找到散列后返回 H 的密码。
现在,我不确定加盐在这里有什么帮助。假设攻击者为长度为 N=10 的所有密码的大部分子集生成了彩虹表。我们的一位用户选择了弱密码
DOG
,然后您用随机盐nFNdtnx
对其进行加盐。生成的散列将是 H(nFNdtnxDOG)
,所以在 MD2 61d9e806df43340f8a6595d5f1cfde17
的情况下。根据我的理解,攻击者可以只使用彩虹表来发现哈希字符串是nFNdtnxDOG
,并且因为盐通常与密码一起存储,所以从字符串中删除盐并获得密码DOG
.
对我来说,似乎盐在这里唯一能防止这种攻击的事情就是简单地增加密码的长度,从而使生成覆盖尽可能多字符的彩虹表变得更加困难。但这也可以通过简单地要求用户使用更长的密码来完成。
我在这里肯定缺少一些简单的东西,所以我希望有人能帮我解决这个问题。
连接采用了一些快速的散列方法。使用 MD2 也是如此。通常我们使用密码哈希或 PBKDF 加盐,这是一种基于密码的密钥派生函数。这个功能本身就需要很多时间。
通常盐由至少 64 个随机位组成。这意味着任何彩虹表都需要攻击者仅针对单个密码执行 $2^{64}$ 操作。这本身就已经很难了。然而,在如此大的数据集上构建哈希表至少同样棘手,查找也将成为一项艰巨的任务。
密码学总是依赖于大量的安全性。 AES 密钥至少包含 128 位,安全 RSA 密钥从 1024 位开始。您使用的较小值仅用于演示目的。