彩虹桌:减少的用途是什么?

信息安全 密码 哈希 密码破解
2021-09-06 13:30:50

这是对此答案的跟进

答案非常好,它让我思考和做一些研究。我在这个网站上找到了另一个很好的解释。

在某些时候,作者说:

如果明文集是 [0123456789]{6}(我们想要一个包含所有长度为 6 的数字密码的彩虹表),并且散列函数是 MD5(),那么明文的散列可能是 MD5("493823") - > “222f00dc4b7f9131c89cff641d1a8c50”。在这种情况下,归约函数 R() 可能就像从哈希中获取前六个数字一样简单;R(“222f00dc4b7f9131c89cff641d1a8c50”)->“222004”。我们现在已经从前一个明文的哈希中生成了另一个明文,这就是归约函数的目的。

但是,我似乎没有掌握减少的用途,因为它看起来很随意。将哈希减少到它的第一个数字如何帮助检索明文。减少的选择(即选择散列的前几个数字)真的是任意的吗?我可以不使用六个数字,而是使用六个数字吗?

3个回答

这是一种在存储和计算需求之间进行折衷的方法。

它是哈希表的实现:您无需在表中存储所有可能的唯一值(这将导致存储索引和搜索结果的实际问题),您只需减少查找有效哈希所需的计算次数。

基本上,当您构建彩虹表时,您会为您尝试的每个条目的结果创建一个哈希(这里称为缩减函数,因为它减少了键空间的大小)。然后,您将原始值存储在标有 reduce 函数结果的存储桶中。

当您使用彩虹表时,您执行以下操作:获取要反转的哈希值,将其通过 reduce 函数并查看具有该标签的存储桶内的内容:然后尝试对其中的每个元素进行哈希处理桶并查看它是否与您的原始值匹配。

至于如何选择合适的 reduce 函数,您将需要一个可以让您将看到的所有数据重新组合成可管理块的功能:您不希望只有几个大桶或太多小桶。这就是必须找到平衡的地方。除此之外,您如何选择 reduce 函数并不重要:您应该尝试使用易于计算的东西,它将您的数据分成统计上相等的存储桶,并且对于您的环境很容易处理,所以,如果您宁愿选择最后 6 个数字而不是第一个 6,这最终无关紧要。

归约函数通过在哈希本身内存储更多的明文候选来提供帮助。这篇文章给出了一个非常简单的归约示例:取散列“222f00dc4b7f9131c89cff641d1a8c50”的前六个数字。减少的结果是另一个可能的六位密码(222004),它是散列的。然后,从该哈希中提取另一个候选明文密码,依此类推,创建一个长链。彩虹表只存储那条长链的末端。它不需要存储所有散列,因为它可以在每个散列返回到链上时将其拉出归约函数。

当你给它一个你想要破解的哈希值时,它首先会查看它存储的第一组哈希值(这是这个长链的最终结果)。如果碰巧有哈希值,它会返回明文并退出。否则,它会在链中上升一步,并根据您提供的哈希值检查该哈希值。等等。

起初我认为某种存储桶操作在起作用,这减少了查找散列所需的位置数量,但我不认为该链给出了任何关于根据原始散列从哪里开始的提示。它只是用内存密集型工作来降低存储需求。

正如文章所说,不能保证每个明文在这个方案中都会有一个对应的哈希值。彩虹表通过改变每一列的归约函数得到尽可能多的(这就是为什么它们被称为彩虹表,每一列被想象成具有不同的颜色......)

有一个很好的教程说明了彩虹表的工作原理:https ://www.youtube.com/watch?v=rv06bwwAQqM

缩减表是从哈希码映射到明文的表。一个例子是获取哈希码的前 6 位数字(例如,哈希码 abcd13450d3 中的 134503...)。

归约函数将尝试平均分配到明文,并尽量不导致许多哈希码映射到明文。这将导致视频中描述的碰撞。

当归约和散列函数交织在一起时,它允许形成一条长链,在散列码和明文的域之间重复映射。