彩虹表
1.定義:
彩虹表(Rainbow Table)是一種破解哈希算法的技術,是一款跨平台密碼攻擊手段,主要可以破解MD5、HASH等多種密碼。它的性能非常讓人震驚,在一台普通PC上輔以NVidia CUDA技術,對於NTLM算法可以達到最高每秒103,820,000,000次明文嘗試(超過一千億次),對於廣泛使用的MD5也接近一千億次。更神奇的是,彩虹表技術並非針對某種哈希算法的漏洞進行攻擊,而是類似暴力破解,對於任何哈希算法都有效。
2.原理:
首先定義哈希加密函數H,Q=H(P)表示將明文密碼P加密成哈希串Q;然后定義規約函數R,p=R(Q)表示將哈希串Q轉換成明文p,注意p不是真正的密碼P。將一個可能的密碼p0交替帶入H和Q兩個函數進行運算,先后得到q1,p1,q2,p2,...,q(n-1),p(n-1),qn,pn。其中p是明文,q是哈希串,它們組成的鏈稱為哈希鏈,n是哈希鏈的長度,一般大於2000。將哈希鏈的首尾元素p0和pn做為一個數對存入表中,中間的其它元素全部刪除。由多個數對組成的表稱為彩虹表。
示例圖:
3.密碼攻擊:
密碼攻擊就是找到哈希串Q對應的明文密碼P,利用彩虹表進行密碼攻擊的過程如下:c1=R(Q),將c1與彩虹表中每一個pn進行比對,如果相等,則P=p(n-1),由於彩虹表中只保存了p0和pn,因此需要重新計算該哈希鏈得到p(n-1);如果沒找到相等的pn,計算c2=R(H(c1)),將c2與彩虹表中所有pn進行比對,如果相等,則P=p(n-2),重新計算該哈希鏈得到p(n-2);如果沒找到相等的pn,繼續計算c3...以此類推。
彩虹表的關鍵是構造R函數,優秀的R函數要保證計算結果均勻分布,即避免出現相同的明文密碼。然而想構造優秀的R函數是件非常困難的事,不同的哈希鏈中可能會出現大量的重復數據,嚴重影響了密碼攻擊的效率。改良后的彩虹表在哈希鏈的計算過程中引入不同的R函數,有效減少不同哈希鏈中的重復節點,進一步提高了攻擊效率。如果將不同的R函數用不同的顏色表示,眾多的哈希鏈就會像彩虹一樣,從里到外呈現出顏色變化,這就是彩虹表名稱的由來。
4.防御彩虹表攻擊:
雖然彩虹表有着如此驚人的破解效率,但網站的安全人員仍然有辦法防御彩虹表。最有效的方法就是“加鹽”,即在密碼的特定位置插入特定的字符串,這個特定字符串就是“鹽”,加鹽后的密碼經過哈希加密得到的哈希串與加鹽前的哈希串完全不同,黑客用彩虹表得到的密碼根本就不是真正的密碼。即使黑客知道了“鹽”的內容、加鹽的位置,還需要對H函數和R函數進行修改,彩虹表也需要重新生成,因此加鹽能大大增加利用彩虹表攻擊的難度。