彩虹表与带盐哈希
彩虹表(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链,但是我们只存储首尾节点。
然后,我们以大量的随机明文分别进行k次HR运算,得到大量的hash链。
存储这些hash链的首尾节点,就得到一张表。
怎样使用刚才生成的表?
我们拿到一个Hash值,进行至少一次R运算,最多k-1次H运算和k次R运算,得到的结果与刚才的hash链的尾节点对比,如果能匹配上,那么明文很有可能在这条hash链中。
R函数的选取非常关键,上述的缺点在于容易产生碰撞。
彩虹表针对上述的缺陷,进行了改进,哈希链中不采用统一的R函数,而是采用k个不同的R函数(R1,R2,R3……Rk),这样生成的哈希链集被称为彩虹表。哈希链中不同位置的R函数就像彩虹中不同位置的颜色。
怎样使用彩虹表?
我们拿到一个Hash值,首先进行Rk运算,得到一个值,与尾节点比较。
不匹配,进行Rk-1运算,H运算,Rk运算,得到一个值,与尾节点比较。
还是不匹配,……
直到找到一个运算值与尾节点匹配
如果找到,我们认为明文存在于这条哈希链中。
5 彩虹表中时间和空间的平衡
对于相同个数的明文,当k越大时,破解的期望时间就越长,但是彩虹表所占用的空间就越小;
相反,k越小时,彩虹表本身就越大,相应的破解时间越短。
RainbowCrack中rtgen工具默认K值是2100
极端情况下,假设k=1,简化函数R(x)=x,彩虹表就变成了通常的错误理解,即将明文、密文对应关系全部保存的表。
6 彩虹表的防御
彩虹表的生成和破解均使用H函数,如果采用带盐的H函数,已有的彩虹表将无法使用。
7 总结
彩虹表,可以看做是一种“字典”,但是是一种由哈希链存储的“字典”,只存储了首尾两个节点。给出一个hash值,不能仅仅去查,还需要计算。
10 彩虹表的比喻
把明文哈希后得到的密文,比作一把锁,如果暴力破解,就相当于制作各种不同齿形的钥匙,然后一把把去试。能不能短时间解开,看运气!!!
彩虹表,怎么做的?按照某种规律对钥匙分组,在每组钥匙中分别取一把钥匙作为代表去开锁,当发现某把钥匙差一点就能开锁的时候,就对该钥匙进行简单的打磨,直到能开锁为止。