Hash 理解哈希表和彩虹表

Hash 理解哈希表和彩虹表,hash,cryptography,hashtable,rainbowtable,Hash,Cryptography,Hashtable,Rainbowtable,所以我试图更好地理解哈希表和彩虹表,在我的阅读中,我感觉我开始掌握它的窍门了。有一个关于检查你的知识的问题,是这样的: “如果您有一个存储sha-256密码的哈希表,并且您希望整个表存储在内存中,并且您有4GB的内存,您可以破解多少密码?如果您使用一个彩虹表,每个链中有20个密码,您可以破解多少密码?(假设密码为10个字符)” 这一次完全让我怀疑我是否知道我读过的东西。这就是我到目前为止想到的 如果每个ShA-256散列的大小总是256位,我们知道一个兆字节中有8388608位,这等于每个兆字节

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

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

这一次完全让我怀疑我是否知道我读过的东西。这就是我到目前为止想到的

如果每个ShA-256散列的大小总是256位,我们知道一个兆字节中有8388608位,这等于每个兆字节32768个ShA-256密码。4000兆,我们取32768乘以4000,得到存储在内存中的131072000个密码

但如何将其应用于彩虹表中的20个链密码?我认为彩虹表存储散列和散列的相反部分,这样虽然它占用了更多的空间,但可以更快地解析。是否有一个公式或东西来确定我丢失了多少空间,从而丢失了多少密码


任何帮助或知识都将不胜感激。我感谢你的时间和智慧

想象一下像这样的彩虹桌:

表是链的列表

链是密码和散列

但是等等。。。让我们调用这个密码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,他。。。又名P1和H20

这是一条链子

一个表由一个列表组成。。。已排序的链列表。。。按散列排序 如果要破解某些散列x,请执行以下操作:

分配y=x
在您的表格中查找y
如果找到,则获取相应链的密码,并重新生成构成链的所有密码/哈希元组,然后查找密码…
如果未找到,则指定y=h(R(y))并重新开始,直到找到匹配项或达到链长度

所以。。。关于你最初的问题

如果使用普通字典查找密码,则需要存储密码和哈希对…每个哈希对应一个密码。。。一对/元组将使您能够攻击一个密码


如果您使用rainbow表,您仍将在内存中的每个哈希中存储一个密码。。。但是时间-内存折衷将允许您攻击更多的哈希。。。在一个理想的世界里,这将是你的链条长度的倍增。。。在现实世界中,这取决于R()有多好。。。可能会发生冲突,这将导致一个密码/散列出现在多个链中,给rainbowtable带来冗余

使用RainbowTables,您只存储能够破解的散列的一小部分。hahse以链的形式组织,只需要存储链的第一个和最后一个元素。因此,如果链长度为20,则每个链将存储2个哈希,并且能够破解20个哈希。因此,您的增益为10倍

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


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

我不知道链是什么,但是第一次计算是错误的,因为您没有考虑密码的存储。Gah。我甚至没想到。密码的大小本身不是一个变量,因此不可能精确计算吗?是的,但您的任务有提示“假设密码为10个字符”,我假设,这也扩展到了第一个问题。嗯。我原以为这只适用于彩虹桌部分,但我想这两个部分都适用。我将开始尝试找出10个字符有多大。但是,一旦我知道了这一点,我就开始猜测,直到我得到一个有效的大小,数学是什么来减少大小以适应散列和密码?不要忘记,当前的计算只涉及原始数据,当您在散列表中存储数据时,您需要存储这些数据,而不需要附加结构,例如散列/索引。这在很大程度上取决于您的实现和所使用的语言(Java比C有更多的开销)。