Wikipedia page for rainbow tables说:
“这种使用多个缩减函数的速度大约是查找速度的两倍。”
假设链中的“平均”位置,我们采用哈希并通过9迭代链运行...
原始表通过4次减少和4次哈希运行它并查找链的末尾,然后查找另外5次哈希5次减少...共9次哈希9次减少
彩虹表通过Rk-1,Rk-2,Rk-3和Rk-4计算运行它以找到链的末端,然后另外5个哈希值5减少以获得明文:总共15个哈希值15减少...
我在这里缺少什么?通过我的数学,彩虹查找的唯一时间甚至与普通表的速度相同,就是当哈希刚好恰好位于链的最末端时...实际上,RT应该逐渐减慢,越往开始哈希谎言...
使用彩虹表开头的散列5k链比使用普通散列表慢大约2500倍......
我错过了什么或维基百科犯了错误? (paper referenced on that page(第13页)也是错的,所以我倾向于前者)
答案 0 :(得分:2)
彩虹表的目的不一定要更快,而是减少空间。 彩虹表的交易速度大小。
例如,为所有可能的10位数密码存储哈希值在磁盘空间方面会非常昂贵。此外,您还需要考虑因为字典空间太大,需要进行大量分页(操作非常慢)。
彩虹表的CPU密集程度更高,但它们要小得多,需要更少的磁盘空间,并且同时允许更多内存中潜在的字典空间。请记住,在现实世界中,由于较少的分页(磁盘读取速度极慢),在大字典空间中具有更高的潜在性能。
以下是一个更好的说明示例: http://kestas.kuliukas.com/RainbowTables/
当然这都是学术性的。彩虹表对设计良好的安全系统没有任何价值。 1)使用加密安全算法(不“滚动你自己的”) 2)使用密钥派生函数(具有数千次迭代)来减慢攻击者的哈希吞吐量。 3)使用大的(32到64位)随机盐。彩虹表不能再预先计算,也不能将该计算用于任何其他系统(除非它们碰巧共享相同的盐)。 4)如果可能的话,每个记录使用不同的盐,从而使彩虹表完全无效。
答案 1 :(得分:0)
所有答案都在原始论文中。首先,您必须看到必须将单个彩虹表与t经典表进行比较,t是链中元素的数量。实际上,彩虹表中的每一列都像一个经典表格(例如,如果你必须在彩虹表的一列中使用相同的元素,你将有一个合并,如果你在经典表格中有两个相同的元素,你也有一个合并)。 然后你会看到,如果你必须遍历所有的表(t表中包含长度为t的链),那么在经典表中搜索你需要t ^ 2个操作。如果您在单个彩虹表中搜索,则需要1 + 2 + 3 + ... + t次操作,等于t ^ 2/2。所以在最糟糕的情况下,如果你找不到密码,你的速度会快两倍。现在,如果密码在经过一半表或列之后平均显示,那么它将快4倍。如果你想要很高的成功概率(例如99%),那么平均而言,密码会在10%的表后出现,使得彩虹表的速度提高20倍。