[基礎技能] 安全技術——哈希算法密碼破解之彩虹表(Rainbow Table)學習


1、基礎知識

剛剛學習過數字簽名的相關知識,以及數字簽名的偽造技術,而偽造數字簽名歸根結底就是密碼破解的一個過程,然而直接破解的速度是非常緩慢的,所以有人想出一種辦法,直接建立出一個數據文件,里面事先記錄了采用和目標采用同樣算法計算后生成的Hash散列數值,在需要破解的時候直接調用這樣的文件進行比對,破解效率就可以大幅度地,甚至成百近千近萬倍地提高,這樣事先構造的Hash散列數據文件在安全界被稱之為Table。

其實簡單理解就是使用一個大型數據字典來進行快速匹配暴力破解的方法,以空間來換取時間的方法。

 

具體的需要一些基礎知識做支撐:

1、哈希算法

哈希(Hash)算法是單向散列算法,它把某個較大的集合P映射到另一個較小的集合Q中,假如這個算法叫H,那么就有Q = H(P)。對於P中任何一個值p都有唯一確定的q與之對應,但是一個q可以對應多個p。作為一個有用的Hash算法,H還應該滿足:

H(p)速度比較快; 給出一個q,很難算出一個p滿足q = H(p);即單向性。

給出一個p1,很難算出一個不等於p1的p2使得 H(p1)=H(p2);強弱碰撞性。

正因為有這樣的特性,Hash算法經常被用來保存密碼————這樣不會泄露密碼明文,又可以校驗輸入的密碼是否正確。常用的 Hash算法有MD5、SHA1等。

2、破解HASH

 破解Hash的任務就是,對於給出的一個q,反算出一個p來滿足q = H(p)。即直接采用碰撞的方法來打破它的強弱碰撞性。通常我們能想到的辦法有兩種:

1、暴力破解法,把P中的每一個p都算一下H(p),直到結果等於q;

2、查表法,使用一個大型字典,把每個p和對應的q都記錄下來,按q做一下索引,直接查找匹配。

 兩種辦法理論上都是可以的,但是前一種需要大量時間,后一種需要大量存儲。這種單純的開銷是很巨大的,所以目前我們認為Hash是足夠安全的,十幾位以上的密碼也是強度足夠的。

 3、彩虹表 時空的平衡

 對於HASH的傳統做法是把H(X)的所有輸出窮舉,查找H(X[y])==H(P),得出P==X[y]。而彩虹表則是使用散列鏈的方式進行

"散列鏈"是為了降低傳統做法空間要求的技術,想法是定義一個衰減函數 R 把散列值變換成另一字符串。通過交替運算H函數和R函數,形成交替的密碼和散列值鏈條。


 2、詳解

當面對要破解的哈希函數 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM