初识彩虹表

1. 散列链

1.1 背景

大部份资料来自维基百科:彩虹表

对于一个用户认证系统,一般不会明文储存用户的密码,而是储存其加密摘要,用户输入密码时,生成加密摘要与储存的密码摘要进行比对,相同则允许其访问请求。

假设黑客盗取了散列后的密码表,由于记录的是密码计算后获得的摘要,因此黑客无法直接使用这份密码表获取权限,为了获得正确的密码,有以下几种方法进行攻击:

  1. 暴力破解
  2. 字典攻击
  3. 使用预先计算好的散列链

其中,暴力破解在进行计算时的时间成本过高;字典攻击需要的空间成本过高;因此有了提前构筑计算好的散列链,牺牲一些时间换空间,目前这种做法在破解哈希中是常见的。

1.2 简介

大部份资料来自维基百科:彩虹表

假设有哈希方程\(H\),构建一个归约函数\(R\),其作用不是将Hash值重新映射到原本的输入,而是将Hash值映射成类似原文(如长度,使用的字符类型等)的文本。

使用wikipedia上的例子,它构建了假设密码集合P是6个字符长,Hash值有32bit长,长度K=4(应该是)的散列链如下:

\((aaaaaa)\overrightarrow{H}(281DAF40)\overrightarrow{R}(sgfnyd)\overrightarrow{H}(920ECF10)\overrightarrow{R}(kiebgt)\)

对于生成的散列链,只记录其初始密码(起点)和末尾密码(终点),即在生成查找表时只记录起点和终点。

对于查找,不再赘述,直接截图了。

rainbow_table

在查找的途中,可能会出现误报(false alarm)的情况如下图:

rainbow_table

这是因为对生成的散列链,若有节点发生了碰撞,这就意味着若表中的任意两条链中的某一节点发生碰撞,就会导致其链上的大部分节点都将相同。这是由于设计的归约函数R没有抗碰撞性导致的,而为了能正确的覆盖掉可能的明文,所以R不会具有抗碰撞性。

为了解决简单的哈希链中的碰撞问题,彩虹表选用一系列相关的归约函数R1,…,Rk来代替原先的归约函数R。这样,如果两条哈希链发生碰撞并且重合,那么它们的碰撞必定发生在相同的位置,从而它们的终点也将相同。这样可以通过后处理来排序哈希链,从而找出并移除所有终点相同,因而可能是重复的链,并生成新的链来将整个表补充完整。这样得到的表中的链可能有碰撞的部分,但它们不会发生链的重合,从而大幅降低了碰撞的次数。

2.彩虹表

2.1 使用工具

生成彩虹表使用到的工具是RaninbowCrack,这个工具提供了rtgen,rtsort,rcrack等程序,可完成对彩虹表的生成、排序和查找等操作。

2.2 具体使用

官方文档里给出了详细的用法以及各个参数的详细说明,这里就不再赘述了,附上官方说明:Rainbow Table Generation and Sort(彩虹表的生成与排序)

2.3 例子说明

运行环境为Windows10系统,尝试使用RainbowCrack工具执行对如下字符串的散列的破解:

  1. 有字符串"cryptography",使用md5计算获得的HEX散列为"e0d00b9f337d357c6faa2f8ceae4a60d"
  2. 使用rtgen生成彩虹表,使用语句如下:
//使用md5算法,在小写字母集合里,构筑1~12位的密码集合生成彩虹表,单链长度为3800,生成的链数量为33554432条
rtgen md5 loweralpha 1 12 0 3800 33554432 0 

//运行效果如下
rainbow table md5_loweralpha#1-12_0_3800x33554432_0.rt parameters
hash algorithm:         md5
hash length:            16
charset name:           loweralpha
charset data:           abcdefghijklmnopqrstuvwxyz
charset data in hex:    61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
charset length:         26
plaintext length range: 1 - 12
reduce offset:          0x00000000
plaintext total:        99246114928149462

sequential starting point begin from 0 (0x0000000000000000)
generating...
196608 of 33554432 rainbow chains generated (0 m 33.1 s)
393216 of 33554432 rainbow chains generated (0 m 32.1 s)
589824 of 33554432 rainbow chains generated (0 m 31.8 s)
786432 of 33554432 rainbow chains generated (0 m 31.1 s)
......//中间的省略了
33423360 of 33554432 rainbow chains generated (0 m 37.7 s)
33554432 of 33554432 rainbow chains generated (0 m 23.2 s)

生成的彩虹表大小有512MB,花了我差不多85min左右才生成成功。运行的时候CPU直接跑满了。
rainbow_table

  1. 对生成的彩虹表进行排序:
//该命令会对当前目录下的所有彩虹表进行排序
rtsort .

//运行效果如下
.\md5_loweralpha#1-12_0_3800x33554432_0.rt:
7087034368 bytes memory available
loading data...
sorting data...
writing sorted data...
  1. 接下来尝试查找表
rcrack . -h e0d00b9f337d357c6faa2f8ceae4a60d

//运行结果如下:
1 rainbow tables found
memory available: 5781658009 bytes
memory for rainbow chain traverse: 60800 bytes per hash, 60800 bytes for 1 hashes
memory for rainbow table buffer: 2 x 536870928 bytes
disk: .\md5_loweralpha#1-12_0_3800x33554432_0.rt: 536870912 bytes read
disk: finished reading all files

statistics
----------------------------------------------------------------
plaintext found:                             0 of 1
total time:                                  0.45 s
time of chain traverse:                      0.42 s
time of alarm check:                         0.00 s
time of disk read:                           0.19 s
hash & reduce calculation of chain traverse: 7216200
hash & reduce calculation of alarm check:    0
number of alarm:                             0
performance of chain traverse:               17.06 million/s
performance of alarm check:                  0.00 million/s

result
----------------------------------------------------------------
e0d00b9f337d357c6faa2f8ceae4a60d  <not found>  hex:<not found>

对于生成的这个表,没有查找到"critography"对应的散列值,尝试对"hello"的散列值"5d41402abc4b2a76b9719d911017c592"进行查询,成功找到对应明文。

rcrack . -h 5d41402abc4b2a76b9719d911017c592

1 rainbow tables found
memory available: 5857804288 bytes
memory for rainbow chain traverse: 60800 bytes per hash, 60800 bytes for 1 hashes
memory for rainbow table buffer: 2 x 536870928 bytes
disk: .\md5_loweralpha#1-12_0_3800x33554432_0.rt: 536870912 bytes read
disk: finished reading all files
plaintext of 5d41402abc4b2a76b9719d911017c592 is hello

statistics
----------------------------------------------------------------
plaintext found:                             1 of 1
total time:                                  0.41 s
time of chain traverse:                      0.38 s
time of alarm check:                         0.00 s
time of disk read:                           0.17 s
hash & reduce calculation of chain traverse: 7216200
hash & reduce calculation of alarm check:    1
number of alarm:                             1
performance of chain traverse:               19.19 million/s
performance of alarm check:                  0.00 million/s

result
----------------------------------------------------------------
5d41402abc4b2a76b9719d911017c592  hello  hex:68656c6c6f

对于查表失败的结果,可以尝试改变table_index参数的值,使用不同的归约函数产生新的彩虹表,这样就有可能覆盖到之前查表失败的hash值对应的明文。

posted on 2023-12-04 13:41  H4RUH1RO  阅读(65)  评论(0编辑  收藏  举报