了解哈希表和彩虹表

时间:2016-01-31 18:56:39

标签: hash cryptography hashtable rainbowtable

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

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

如果我对所读的内容一无所知,这个问题完全让我有疑问。所以这就是我到目前为止所提出的。

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

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

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

2 个答案:

答案 0 :(得分: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 ......又名P1和H20

这是一个链

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

指定y = x
在你的桌子上寻找你 如果找到,请获取相应链的密码,并重建一旦形成链并查找密码的所有密码/哈希元组...
如果没有找到,则指定y = h(R(y))并重新开始,直到您获得匹配或达到链长

所以...就你的初步问题而言......

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

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

答案 1 :(得分:0)

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

因此,如果没有彩虹表(131072000),无论你得到什么结果,你都会乘以10,如果你使用链长为20的彩虹表,你就可以得到破解的密码数。

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