彩虹表与带盐Hash

彩虹表与带盐哈希

 

彩虹表(Rainbow Table

1 What

彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合。

 【注】只针对MD5算法?No,可以有各种算法,比如LM, NTLM, MD5, SHA1, MYSQLSHA1, HALFLMCHALL, NTLMCHALL, ORACLE-SYSTEM, MD5-HALF……

 

2 Do 

破解密码。

 【注】密码越复杂,彩虹表越大。多大,100G以上!!!

 

3 How

//输入“密文”,直接得出“明文”。NoNoNo

 

4 Where?彩虹表的前世今生

预计算的哈希链

 

明文->哈希函数(H->密文

 

你想破解哈希函数(H)?不可能

 

约简函数R(定义域、值域刚好与H函数相反,but不是反函数)

哈希值->约简函数R->一个与原文相同格式的值。

【注】哈哈,不要希望可以通过R函数将密文转为明文。哈希函数H不可逆。

 

(zhihu) H (D2A82C9A) R (vfkkd) H (0CAFC376) R (crepa)

不停地进行HR运算,重复k次后,得到一条hash链,但是我们只存储首尾节点。

然后,我们以大量的随机明文分别进行kHR运算,得到大量的hash链。

存储这些hash链的首尾节点,就得到一张表。

 

怎样使用刚才生成的表?

我们拿到一个Hash值,进行至少一次R运算,最多k-1H运算和kR运算,得到的结果与刚才的hash链的尾节点对比,如果能匹配上,那么明文很有可能在这条hash链中。

 

R函数的选取非常关键,上述的缺点在于容易产生碰撞。

 

彩虹表针对上述的缺陷,进行了改进,哈希链中不采用统一的R函数,而是采用k个不同的R函数(R1R2R3……Rk),这样生成的哈希链集被称为彩虹表。哈希链中不同位置的R函数就像彩虹中不同位置的颜色。

怎样使用彩虹表?

我们拿到一个Hash值,首先进行Rk运算,得到一个值,与尾节点比较。

不匹配,进行Rk-1运算,H运算,Rk运算,得到一个值,与尾节点比较。

还是不匹配,……

直到找到一个运算值与尾节点匹配

如果找到,我们认为明文存在于这条哈希链中。

 

彩虹表中时间和空间的平衡

对于相同个数的明文,当k越大时,破解的期望时间就越长,但是彩虹表所占用的空间就越小;

相反,k越小时,彩虹表本身就越大,相应的破解时间越短。

RainbowCrackrtgen工具默认K值是2100

 

极端情况下,假设k=1,简化函数R(x)=x,彩虹表就变成了通常的错误理解,即将明文、密文对应关系全部保存的表。

 

彩虹表的防御

彩虹表的生成和破解均使用H函数,如果采用带盐的H函数,已有的彩虹表将无法使用。

 

总结

彩虹表,可以看做是一种“字典”,但是是一种由哈希链存储的“字典”,只存储了首尾两个节点。给出一个hash值,不能仅仅去查,还需要计算。

 

10 彩虹表的比喻 

把明文哈希后得到的密文,比作一把锁,如果暴力破解,就相当于制作各种不同齿形的钥匙,然后一把把去试。能不能短时间解开,看运气!!!

彩虹表,怎么做的?按照某种规律对钥匙分组,在每组钥匙中分别取一把钥匙作为代表去开锁,当发现某把钥匙差一点就能开锁的时候,就对该钥匙进行简单的打磨,直到能开锁为止。

 

 

 

 

 

 

 

你可能感兴趣的:(彩虹表与带盐Hash)