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]。而彩虹表則是使用散列鏈的方式進行。
2、詳解
就這樣,將H運算、R運算、H運算……這個過程反復地重復下去,重復一個特定的次數 k 以后,就得到一條哈希鏈,例如k為2時得到:

要生成一個表,我們選擇一組隨機的初始密碼,每一個密碼計算一個固定長度K的鏈,並只存儲每一個鏈的第一個和最后一個密碼。第一密碼被稱為始點,最后一個被稱為末點。在上面例舉的鏈中,“zhihu”就是始點,“crepa”就是末點,其他密碼(或散列值)並不被保存。
造表過程:
查表過程:
參考:
彩虹表破解開機密碼、MD5算法等的原理