任何人都知道它为何被称为彩虹表?记得我们已经知道有一种叫做“字典攻击”的攻击。为什么不是字典?
答案 0 :(得分:6)
彩虹是字典攻击的一种变体(准确地说是预先计算的字典攻击),但它比完整字典占用的空间更少(以在表中查找密钥所需的时间为代价)。这种空间记忆权衡的另一端是全搜索(暴力攻击=零预计算,很多时间)。
在彩虹表中,预先计算的密钥密文字典被链式压缩。链中的每一步都是使用不同的压缩功能完成的。桌上有很多链条,所以它看起来像彩虹。
在此图片中,不同的压缩函数K1,K2,K3具有类似彩虹的颜色: 存储在文件中的表只包含第一列和最后一列,因为可以重新计算中间列。
答案 1 :(得分:6)
因为它包含了整个“频谱”的可能性。
字典攻击是一种只是尝试可能性的强力技术。像这样(python伪代码)
mypassworddict = dict()
for password in mypassworddict:
trypassword(password)
但是,彩虹表的工作方式不同,因为它用于反转哈希。哈希的高级概述是它有多个容器:
bin1, bin2, bin3, bin4, bin5, ...
它对应于输出字符串的二进制部分 - 这就是字符串最终的长度。随着哈希的进行,它以不同的方式影响二进制位的不同部分。因此,第一个字节(或接受的任何输入字段)输入会影响(例如,简单地)二进制位3和4.下一个输入会影响2和6.依此类推。
彩虹表是对给定箱的所有可能性的计算,即该箱的所有可能的逆,对于每个箱......这就是为什么它最终如此之大。如果第一个bin值是0x1
,那么你需要有一个bin2
的所有值的查找列表,并且bin3的所有值都在向后通过哈希值,这最终会给你一个值。
为什么不称它为字典攻击?因为不是。
正如我已经看到您之前的问题,让我扩展您正在寻找的细节。加密安全散列理想情况下需要从小的输入大小到整个文件安全。要预先计算整个文件的哈希值将永远需要。因此,彩虹表是在一个很好理解的输出子集上设计的,例如所有字符a-z在10个字符的字段上的排列。
这就是为什么用于击败字典攻击的密码建议在这里工作的原因。您放入哈希输入的整个可能输入集的子集越多,彩虹表需要包含的搜索就越多。所需的数据大小最终变得非常大,搜索时间也是如此。所以,想一想:
[a-z]
个字符输入为5-8
,那彩虹表就不算太差了。[a-z][0-9]
,那么您还可以进行更多搜索。[A-Za-z0-9]
。最后,坚持[\w]
,即你能想到的任何可打印角色,再一次,你看着一张巨大的桌子。因此,使密码长而复杂使得彩虹表开始采用蓝光大小的数据光盘。然后,根据您之前的问题,您开始添加salting和hash派生的函数,并且您可以通过硬件(er)进行哈希破解的一般解决方案。
这里的目标是保持领先于可用的计算能力。
答案 2 :(得分:1)
我不知道这个名字的来源,但不同之处是:
答案 3 :(得分:1)
不幸的是,有些陈述不正确。与所发布的内容相反,彩虹表不包含给定键空间的所有可能性,也不包含我见过的生成使用的可能性。可以生成它们以覆盖99.9但是由于散列函数的随机性,没有任何保证可以覆盖每个明文。
每个链由链接或步骤组成,每个步骤由散列和缩小功能组成。如果您的链条长度为100个链接,那么您将使用该数量的哈希/减少函数,然后丢弃除开始和结束之外的所有内容。
要查找给定哈希的plain,您只需执行链的长度的减少/哈希x量。所以你运行一次步骤并检查端点,如果它是一个错过你会重复...直到你跨过链的整个长度。如果匹配,您可以从起点重新生成链,您可以找到平原。如果再生后它不正确那么这是一个误报警。这是由于减少散列函数引起的碰撞而发生的。由于该表包含许多链,因此您可以在每一步对所有链端点进行大量查找,这实际上是允许速度发生魔力的地方。这也会导致误报,因为您只需要重新生成具有匹配的链,通过跳过不必要的链来节省大量时间。
它们不包含词典....不过传统的表格中没有彩虹表的变体,但它们使用了字典。
就是这样。这个过程有很多方法可以优化,包括删除合并/重复链并创建完美的表格,并将它们存储在不同的包装中以节省空间和加载时间。