[基礎技能] 安全技術——哈希算法密碼破解之彩虹表(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

相關文章
相關標籤/搜索