[基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习

一、基础知识

刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是很是缓慢的,因此有人想出一种办法,直接创建出一个数据文件,里面事先记录了采用和目标采用一样算法计算后生成的Hash散列数值,在须要破解的时候直接调用这样的文件进行比对,破解效率就能够大幅度地,甚至成百近千近万倍地提升,这样事先构造的Hash散列数据文件在安全界被称之为Table。html

其实简单理解就是使用一个大型数据字典来进行快速匹配暴力破解的方法,以空间来换取时间的方法。算法

 

具体的须要一些基础知识作支撑:安全

一、哈希算法

哈希(Hash)算法是单向散列算法,它把某个较大的集合P映射到另外一个较小的集合Q中,假如这个算法叫H,那么就有Q = H(P)。对于P中任何一个值p都有惟一肯定的q与之对应,可是一个q能够对应多个p。做为一个有用的Hash算法,H还应该知足:函数

H(p)速度比较快; 给出一个q,很难算出一个p知足q = H(p);即单向性。post

给出一个p1,很难算出一个不等于p1的p2使得 H(p1)=H(p2);强弱碰撞性。学习

正由于有这样的特性,Hash算法常常被用来保存密码————这样不会泄露密码明文,又能够校验输入的密码是否正确。经常使用的 Hash算法有MD五、SHA1等。spa

二、破解HASH

 破解Hash的任务就是,对于给出的一个q,反算出一个p来知足q = H(p)。即直接采用碰撞的方法来打破它的强弱碰撞性。一般咱们能想到的办法有两种:htm

一、暴力破解法,把P中的每个p都算一下H(p),直到结果等于q;blog

二、查表法,使用一个大型字典,把每一个p和对应的q都记录下来,按q作一下索引,直接查找匹配。索引

 两种办法理论上都是能够的,可是前一种须要大量时间,后一种须要大量存储。这种单纯的开销是很巨大的,因此目前咱们认为Hash是足够安全的,十几位以上的密码也是强度足够的。

 三、彩虹表 时空的平衡

 对于HASH的传统作法是把H(X)的全部输出穷举,查找H(X[y])==H(P),得出P==X[y]。而彩虹表则是使用散列链的方式进行

"散列链"是为了下降传统作法空间要求的技术,想法是定义一个衰减函数 R 把散列值变换成另外一字符串。经过交替运算H函数和R函数,造成交替的密码和散列值链条。


 二、详解

当面对要破解的哈希函数 H,首先定义一个约简函数(reduction function) R该函数的定义域和值域须要和哈希函数相反,经过该函数能够将哈希值约简为一个与原文相同格式的值("plain text" value)。须要强调的是,因为哈希函数H是不可逆的,因此对于密文进行R运算几乎不可能获得明文原文。例如,五位字母明文“zhihu”进行H运算后获得了“D2A82C9A”,而对“D2A82C9A”进行R运算后获得另外一个五位字母格式的值“vfkkd”。由于这个值落在H的定义域中,所以能够对它继续进行H运算。
就这样,将H运算、R运算、H运算……这个过程反复地重复下去,重复一个特定的次数 k 之后,就获得一条哈希链,例如k为2时获得:

要生成一个表,咱们选择一组随机的初始密码,每个密码计算一个固定长度K的链,并只存储每个链的第一个和最后一个密码。第一密码被称为始点,最后一个被称为末点。在上面例举的链中,“zhihu”就是始点,“crepa”就是末点,其余密码(或散列值)并不被保存

 

造表过程:

查表过程:

 

 

参考:

彩虹表破解开机密码、MD5算法等的原理

http://www.91ri.org/7593.html

相关文章
相关标签/搜索