实际生成彩虹表需要多长时间?

信息安全 密码学 哈希 蛮力
2021-08-13 05:14:51

我一直在阅读有关彩虹表的信息,因为我认为它们非常有趣,因为它们实际上是一个非常简单的概念。

无论如何,我想知道,有没有人参与实际生成一个?怎么可能做到?我只是不明白如何实际生成每个字符的每个组合。

如果我们排除特殊字符,则有这些字符数。

ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 1234567890

听起来好像有 26+26+10 = 62 个字符

这意味着长度为 8 的密码有 62^8 种组合。

等于 218340105584896

仅此一项听起来就需要很长时间才能生成。当我们将字符数增加到 12 并添加特殊字符时会怎样(假设还有另外 10 个字符,只需查看按 shift - number 获得的字符)?

我们会得到 72^12 = 19408409961765342806016

这是一个大到需要数年才能得到的数字。

4个回答

彩虹表“只是”预先计算的哈希值表的紧凑表示。在彩虹表的构建过程中,许多可能的输入被尝试和散列。在表构建过程中遇到的每个输入都将被该表成功攻击,而不会被其他攻击。哈希评估集中了大部分建表成本。

所以,基本上,构建一个可以反转N个密码的彩虹表的成本大致相当于通过哈希函数尝试这N个密码的成本——彩虹表的要点是你构建它一次然后就可以使用它破解几个密码。(准确地说,由于建表过程中的链冲突,成本实际上更接近1.7*N,但我们暂时忽略它。)

我曾经对 SHA-1 有过一些经验。使用 SHA-1 的简单密码散列需要处理单个“块”(SHA-1 与 MD5 一样,按 64 字节块处理数据),这需要大约 900 次 32 位逻辑或算术运算。Intel Core2 x86 处理器上的优化实现可以在大约 500 个时钟周期内完成。然而,密码攻击(无论是直接攻击还是彩虹表构建,都无所谓)是一项高度并行的工作,因此可以使用提供 128 位寄存器的 SSE2 指令,其中单个操作码可以执行四个32 位操作同时进行。SSE2 可用的操作种类较少(特别是它不提供轮换,只提供班次),因此操作数上升到 1200 左右;但是,在某些情况下,SSE2 单元会同时执行多个操作码。所以我们最终得到了 800 个时钟周期,用于并行的四个 SHA-1 实例。底线:我的 PC 是 Intel Core2 Q6600,有四个内核,运行频率为 2.4 GHz。每个核心都可以运行我的 SSE2 实现,每秒产生大约4800 万个散列密码。

我还有一块不太小的 Nvidia 显卡,GPU 可以通过CUDA运行任意代码。这是 9800 GTX+,有 128 个内核,运行频率为 1.84 GHz。每个核心每个周期可以执行一个 32 位操作(存在高延迟,但是由于高并行化,可以保持这种每周期一条指令的吞吐量)。内核不知道旋转,因此每个代码将使用每个散列密码 1200 个时钟周期。总性能为每秒1.6 亿个散列密码。

我的电脑和显卡是 2009 年初的,不是顶级的。现在人们可以花几百美元找到一个 GPU,它对密码的哈希处理速度大约是我的 9800 GTX+ 的三倍。所以让我们假设一个拥有普通 PC(成本低于 1000 美元)的攻击者每秒可以散列 50 亿个密码。

以这样的速度,所有 8 个字母数字字符(大小写字母和数字)的密码在大约5 天内完成。一台 1000 美元的电脑。如果你使用 MD5,事情会快 30%(MD5 使用的操作比 SHA-1 少一点)。但是,好的密码散列方案不使用简单的散列调用:它们使用迭代散列,例如 2000 次嵌套散列调用:这将攻击者的成本乘以相同的 2000 因子(因此它将“5 天”变成大约 28年,正如你所说的那样,字面意思是“年龄”)。

只使用一次迭代为非常简单的哈希生成彩虹表需要多长时间?需要一个小时!或者更少,如果你愿意的话。

虽然上面的答案是完全正确的,但他们没有提到一个重要的发展。Amazon EC2 和其他“云计算”服务器提供商。

今天,每个拥有信用卡的人都可以访问 aws.amazon.com 并以不到 100 美元的价格购买一些 EC2 现货实例。或者,如果您有良好的 CUDA 代码,可以租用 50 个亚马逊更昂贵的“集群 GPU”实例,配备两个 NVIDIA Tesla M2050 图形处理器。

(有点像航空公司,亚马逊也有差异化定价。如果您需要有保证可用性的特定 EC2 服务器,定价会更高。例如,您可以获得具有 8 个虚拟 CPU 核心的“Hi-CPU Large”实例,每小时 0.68 美元.如果你愿意在下班时间购买与供应过剩许可相同的实例,那么你可以获得40%-50%的返利。)

创建彩虹表可以与线性性能提升并行完成,即在 100 台计算机工作的情况下,它比单台计算机快 100 倍。

Amazon 不会按实例向您收费,而是按实例小时收费。因此,运行 1,000 台服务器一小时 的成本与一台服务器运行 1,000 小时的成本相同

彩虹表创建的并行性质与 Amazon EC2 等服务相结合,意味着不再存在“需要多长时间”的问题。有一个“你愿意花多少钱来快速获得它,而不是支付更少并在几天内获得它?”。成本和时间的差异主要来自亚马逊在“常规”EC2 实例与更便宜的“现货实例”之间的价格差异。

使用简单的 26^5 测试运行,我能够在 Ruby 中生成一个ascii十六进制表,每秒生成 228488 个 MD5 输出。在我 1.5 年前的 Core i7 上,所有 11881376 个条目花了 52 秒。如果我没有对我的程序进行任何改进,我希望它运行 26 周以生成您的 62^8 列表。

我可以通过运行八个独立的程序来改进我的程序,每个超线程一个,来划分问题空间。如果每个程序都将输出保存到自己的驱动器,它们就不会争夺 IO 带宽。与运行 4 到 6 周的愚蠢单线程程序相比,我预计会加速 4 到 6 倍。如果我用 C 重写,我可能会期待另一个 1.5 的加速因子。(也许更多?一方面它是一个简单的程序,另一方面,一个 13 字节长的 C 数组,在运行时修改,与创建和销毁Ruby 字符串对象。)

我希望一个下午的工作和几百美元的新装备可以让我在两周内完成 62^8 桌的商品硬件。

当然,没有人在密码上使用单次运行的 MD5。只需通过单向哈希比 MD5 贵得多来扩展我的最终结果。:)

请参阅我的比特币挖矿网络哈希率计算如何安全地散列密码?-拥有更现代 GPU 卡的坚定人可以在原始哈希方面实现IT 安全性。社区在 2011 年 7 月上旬以 11 Thash/s (11 * 10^12 hash/s) 的速度运行......