1

所以我试图更好地理解哈希表和彩虹表,在我的阅读中,我觉得我开始掌握它的窍门。有一个检查你的知识问题是这样的:

“如果您有一个存储 sha-256 密码的哈希表,并且您希望将整个表存储在内存中,并且您有 4GB 的内存,您可以破解多少个密码?如果您使用每个链中有 20 个密码的 Rainbow 表,你能破解多少个密码?(假设密码是 10 个字符)"

这完全让我怀疑我是否对我所读的内容有所了解。所以这就是我到目前为止想出的。

如果每个 ShA-256 哈希的大小始终为 256 位,并且我们知道单个兆字节中有 8388608 位,则等于每兆 32768 个 SHA-256 密码。4000 兆,所以我们将 32768 乘以 4000,得出存储在内存中的 131072000 个密码。

但是如何将它应用于彩虹表中的 20 个链密码?我认为彩虹表存储了哈希值和它们的反面,这样虽然它占用了更多空间,但它可以更快地解决。是否有公式或其他东西可以确定我丢失了多少空间,从而丢失了多少密码?

非常感谢任何帮助或知识。我感谢您的时间和智慧。:)

4

2 回答 2

1

想象一个这样的彩虹表:

表是链的列表

链是密码和哈希

但是等等……让我们把这个密码称为 P1 和链中的哈希我们称为 He

假设我们有一些散列函数 h(x) 和一些归约函数 R(x),它们会将 h(x) 的输出分配给我们的键空间中任意但均匀分布的密码

如果您的链长为 20,则简单地说:

取 P1 ... 计算 H1=h(P1) 计算
P2 为 R(h1) ... 计算 H2 为 h(P2)
计算 Pn 为 R(hn-1) ... 计算 Hn 为 h(Pn)
直到之后20 步我们拥有 P20 和 H20 ......这也是他

现在我们存储 P1 和 He ... aka P1 和 H20

这是一条链子

一个表由一个列表组成......一个排序的链列表......按哈希排序如果你有一些哈希 x 要被破解,请执行以下操作:

分配 y = x如果找到,则
在您的表中查找 y
,获取相应链的密码,并重建曾经形成链的所有密码/哈希元组并查找您的密码...
如果未找到,分配 y = h( R(y)) 并重新开始,直到您找到匹配项或达到链长

所以...就您最初的问题而言...

如果您使用普通字典来查找密码,则需要存储成对的密码和散列 ...每个散列一个密码 ...一对/元组将使您能够攻击一个密码

如果您使用彩虹表,您仍将在内存中为每个哈希存储一个密码……但是时间内存权衡将允许您攻击更多哈希……在理想的世界中,这将是您的乘数链长……在现实世界中,这取决于 R() 有多好……可能会发生冲突,这将导致一个密码/哈希出现在多个链中,从而为您的彩虹表引入冗余

于 2016-02-01T20:56:11.303 回答
0

使用彩虹表,您只存储您能够破解的散列的一小部分。哈希被组织成链,只有链的第一个和最后一个元素需要存储。因此,链长为 20 时,每条链将存储 2 个哈希值,并且能够破解 20 个哈希值。因此,您获得了 10 倍的收益。

所以无论你在没有彩虹表(131072000)的情况下得到什么结果,你乘以 10 并得到如果你使用链长为 20 的彩虹表你可以破解的密码数量。

实际上,链是由哈希和密码交替组成的。因此,您可以选择将链的开头和结尾存储为密码而不是哈希。由于密码空间肯定小于散列空间,因此您可以将每个链 a 的开头和结尾存储为密码的压缩形式,并获得一些内存以存储更多链。

于 2016-09-05T13:30:49.293 回答