天天看點

算法進階(23)-彩虹表(Rainbow Table)

一、彩虹表的定義

【百度百科】彩虹表是一個用于​​加密散列函數​​​逆運算的預先計算好的表, 為破解密碼的散列值(或稱哈希值、微縮圖、摘要、指紋、哈希密文)而準備。一般主流的彩虹表都在100G以上。 這樣的表常常用于恢複由有限集字元組成的固定長度的純文字密碼。這是空間/時間替換的典型實踐, 比每一次嘗試都計算哈希的暴力破解處理時間少而儲存空間多,但卻比簡單的對每條輸入散列翻查表的破解方式儲存空間少而處理時間多。使用加salt的KDF函數可以使這種攻擊難以實作。彩虹表是​​馬丁·赫爾曼​​早期提出的簡單算法的應用。

二、彩虹表的前身--預先計算的散列鍊

既然存儲所有的明文密碼對需要的空間太大,密碼學家們想出了一種以計算時間降低存儲空間的辦法:“預計算的哈希鍊集”(Precomputed hash chains)。下面是一條k=2哈希鍊:

算法進階(23)-彩虹表(Rainbow Table)

H函數就是要破解的哈希函數。

約簡函數(reduction function)R函數是建構這條鍊的時候定義的一個函數:它的值域和定義域與H函數相反。通過該函數可以将哈希值約簡為一個與原文相同格式的值。

這條鍊是這樣生成的:

  • 随機選擇一個明文aaaaaa
  • 對其求哈希得到281DAF40
  • R(281DAF40) 得到另外一個明文sgfnyd。
  • 繼續重複2,3步驟

    存儲的時候,不需要存儲所有的節點,隻需要存儲每條鍊的頭尾節點(這裡是aaaaaa和kiebgt)

以大量的随機明文作為起節點,通過上述步驟計算出哈希鍊并将終節點進行儲存,可得到一張哈希鍊集。

預計算的哈希鍊集的使用:破解一個hash值

  • 假設其剛好是920ECF10:首先對其進行一次R運算,得到kiebgt,然後發現剛好命中了哈希鍊集中的(aaaaaa,kiebgt)鍊條。可以确定其極大機率在這個鍊條中。于是從aaaaaa開始重複哈希鍊的計算過程,發現sgfnyd的哈希結果剛好是920ECF10,于是破解成功。
  • 密文不是“920ECF10”而是“281DAF40”:第一次R運算後的結果并未在末節點中找到,則再重複一次H運算+R運算,這時又得到了末節點中的值“kiebgt”。于是再從頭開始運算,可知aaaaaa剛好哈希值為281DAF40。
  • 如是重複了k(=2)次之後,仍然沒有在末節點中找到對應的值,則破解失敗。

預計算的哈希鍊集的意義

對于一個長度為k的預計算的哈希鍊集,每次破解計算次數不超過k,是以比暴力破解大大節約時間。

每條鍊隻儲存起節點和末節點,儲存空間隻需約1/k,因而大大節約了空間。

R函數的問題

要發揮預計算的哈希鍊集的左右,需要一個分布均勻的R函數。當出現碰撞時,就會出現下面這種情況

111 --H--> EDEDED --R--> 222 --H--> FEDEFE --R--> 333 --H--> FEFEDC --R--> 444

454 --H--> FEDECE --R--> 333 --H--> FEFEDC --R--> 444 -H--> FEGEDC --R--> 555

兩條鍊出現了重疊。這兩條哈希鍊能解密的明文數量就遠小于理論上的明文數2×k。由于集合隻儲存鍊條的首末節點,是以這樣的重複鍊條并不能被迅速地發現。

三、彩虹表的實作原理

彩虹表的出現,針對性的解決了R函數導緻的鍊重疊問題:

它在各步的運算中,并不使用統一的R函數,而是分别使用R1…Rk共k個不同的R函數(下劃線表示下标)。

算法進階(23)-彩虹表(Rainbow Table)

這樣一來,發生碰撞通常會是下面的情況:

111 --H--> EDEDED --R1--> 222 --H--> FEDEFE --R2--> 333 --H--> FEFEDC --R3--> 444

454 --H--> FEDECE --R1--> 333 --H--> FEFEDC --R2--> 474 -H--> FERFDC --R3--> 909

即使在極端情況下,兩個鍊條同一序列位置上發生碰撞,導緻後續鍊條完全一緻,這樣的鍊條也會因為末節點相同而檢測出來,可以丢棄其中一條而不浪費存儲空間。

彩虹表的關鍵是構造R函數,優秀的R函數要保證計算結果均勻分布,即避免出現相同的明文密碼。然而想構造優秀的R函數是件非常困難的事,不同的哈希鍊中可能會出現大量的重複資料,嚴重影響了密碼攻擊的效率。改良後的彩虹表在哈希鍊的計算過程中引入不同的R函數,有效減少不同哈希鍊中的重複節點,進一步提高了攻擊效率。如果将不同的R函數用不同的顔色表示,衆多的哈希鍊就會像彩虹一樣,從裡到外呈現出顔色變化,這就是彩虹表名稱的由來。

算法進階(23)-彩虹表(Rainbow Table)

四、彩虹表的擷取

可以自己程式設計生成彩虹表,也可以使用RainbowCrack或Cain等軟體來生成,有興趣的讀者可以自行百度。彩虹表的生成時間與字元集的大小、哈希鍊的長度成正比,如下圖中“7位密碼、全部字元集、哈希鍊長度為2萬”的彩虹表大小為32G,本地生成大約需要332天,而從網上下載下傳隻需要2個小時左右,主流的彩虹表的大小普遍在100G以上,想要自己生成是幾乎不可能的事,是以強烈建議黑客技術愛好者直接從網上下載下傳。

算法進階(23)-彩虹表(Rainbow Table)

彩虹表确實像它的名字一樣美好,至少黑客眼裡是這樣。上表是7位以内密碼在不同字元集下構造出的彩虹表的情況,彩虹表中哈希鍊的長度和個數随着字元集的增長而增長,彩虹表的大小和生成時間也随之成倍增加。7位數字組合在彩虹表面前簡直就是秒破,即使最複雜的7位密碼不到一個小時就能破解,如果采用普通的暴力攻擊,破解時間可能需要三周。

​​Ophcrack​​​彩虹表 官方下載下傳位址:​​http://ophcrack.sourceforge.net/​​

120G​​彩虹表​​​BT下載下傳:​​http://www.ha97.com/code/tables.rar​​

五、彩虹表的使用(來源于遠古貼)

彩虹表工具很多,常用到的彩虹表工具有Ophcrack、rcracki_mt、Cain、RainbowCrack等,主流的彩虹表有以下四種。

Cain: ​​http://www.onlinedown​​​​.net​​/soft/53494.htm

Free Rainbow Tables

官方網址:http://www.freerainbowtables.com/en/tables/

鏡像下載下傳:http://tbhost.eu/rt.php

提供了多種類型的彩虹表下載下傳,LM、NTLM、MD5、SHA1等。千萬别把人家法語字元的表也下了,對國人來說,幾乎沒什麼用,不過如果你有特殊需要,那就下吧……這裡提供的都是.rti格式的,有别于傳統的.ri格式,.rti比.rt的多了一個目錄.index檔案,據說遍列速度比.rt的更快(未曾對比過,無法确定是否屬實)。

比較新的,用的索引和壓縮,是以速度更快,體積更小,而且支援分布式破解。

支援HASH類型:LM,MD5,NTLM,SHA1,HALFLMCHALL

網上有已經生成好的表可供下載下傳,真是造福于民。

擴充名:rti

Ophcrack

官網網址:​​​http://ophcrack.sourceforge.net/tables.php​​​ 最常用的,界面友好,與衆不同,壓縮儲存,有自己獨特的彩虹表結構,還有Live CD。

支援的HASH類型:LM,NTLM

擴充名:亂七八糟的。

進階的表要花錢買,免費的表有(推薦隻下2和5,要求高的可以下載下傳3和5):

1.XP free(LM表:包含大小寫+數字)380MB(官網免費下載下傳)

2.XP free fast(和前一個一樣,但是速度更快)703MB(官網免費下載下傳)

3.XP special(LM表:大小寫+數字+所有符号包括空格)7.5G

4.Vista free (NTLM表:包含常用密碼)461MB(官網免費下載下傳)

5.Vista special(NTLM表:包含6位的全部可列印字元,7位的大小寫字母數字,8位的小寫和數字)8G

RainbowCrack

官網網址:​​​http://project-rainbowcrack.com/table.htm​​​ 通用的,一般的破解軟體如saminside都支援,指令行界面,黑客的最愛,支援CUDA。

可以自己生成表,不要錢,傳說中的120G就來自于此。

支援HASH類型:LM, NTLM, MD5, SHA1, MYSQLSHA1, HALFLMCHALL, NTLMCHALL.

擴充名:rt

最小彩虹表是最基本的字母數字表,就這樣它的大小就有388MB,這是Ophcrack啟動盤預設的表,該表可以在11分鐘内破解所有可能14位數字字母密碼組合中的99.9%。國内有比較流行的傳說中的120G的彩虹表,國外還有幾T的海量彩虹表。win2003及以前的windows作業系統的密碼采用的LM算法加密,而Vista、Win7、Win2008/R2采用的是NTLM,NTLM比LM安全得多。

由于LM最多隻有7位,是以它的彩虹表很小。而NTLM用了散列函數,是以理論上密碼是可以無限長的,是以NTLM的彩虹表往往很大,120G肯定是不夠完成所有可列印字元的,最大的彩虹表已經是T量級了。

某人用彩虹表測試破解MD5的小結:

ophcrack的表不支援破解md5,具體講.rt .rtc .rti格式的,隻需對比一組資料就可以。同樣是破解12位的純數字密碼:

.rt的需要20GB .rtc的需要8.75GB .rti的需要1.67+1.67+1.68+1.71=6.72GB

明顯是.rti的小,但是我試過,我下了上面.rti格式破解12位的6.72GB的表中的1.67GB,其破解效果很讓我驚訝,我本以為純數字的破解出來的可能性是四分之一,因為我隻下了4個表中的一個,我隻下了那1.67GB,但我試着破解了幾個12位數字加密的32位md5,結果大多數都能跑出來,很少有跑不出的,汗。但當我驚喜時發現他并不支援破解16位的md5,然後去那國外的官方論壇去逛了逛,才發現這并不支援破解16位的md5。原來老外不來16位這一套,但我們國内的網站用16位的md5占絕大多數,是以入侵時大部分得到的是16位的MD5密碼,而老外的就不來16位的,郁悶。

Ophcrack文檔描述了它所能使用的彩虹表之間的差異:

字母數字表 10k 388MB 包含所有字母數字混合密碼中99.9%的LanManager表。這些都是用大小寫字母和數字組成的密碼(大約800億組合)。

由于LanManager哈希表将密碼截成每份7個字元的兩份,我們就可以用該表破解長度在1到14之間的密碼。由于LanManager哈希表也是不區分大小寫的,該表中的800億的組合就相當于12*10的11次方(或者2的83次方)個密碼。

字母數字表 5k 720MB 包含所有字母數字組合的密碼中99.9%的LanManager表。但是,由于表變成2倍大,如果你的計算機有1GB以上的RAM空間的話,它的破解速度是前一個的4倍。

擴充表 7.5GB --xp special包含最長14個大小寫字母(密碼大于14 LM-HASH會全顯示0或以AA3D開頭,詳見另一篇文章​​Windows LM/NTLM HASH加密​​)、數字以及下列33個特殊字元(!”#$%&’()*+,-./:;?@[]^_`{|} ~)組成的密碼中96%的LanManager表。該表中大約有7兆的組合,5*10的12次方(或者2的92次方)密碼。

NT 8.5 GB--vista special 我們可以使用該表來破解計算機上的NT哈希表,這是LanManager 哈希表所做不到的。該表包含了用如下字元組成的可能密碼組合的90%:

·最高6位字元由大小寫字母、數字以及33個特殊字元(同上面列舉的一樣)

·7 大小寫字母及數字

·8 小寫字母及數字

該表包含7兆種組合,對應7兆的密碼(NT哈希表不存在LanManager哈希表的弱點)。

注意:所有這些彩虹表都有其特定适用的密碼長度和字母組合。太長的密碼(如數十位),或者包含表中沒有的字元,那麼用彩虹表就無法破解。

PS:無一例外,上面的方法需要機器,需要資源,是以,聰明的國人想到了另一種神奇的方法,不過我不能說。。。

六、為什麼加鹽哈希可以抵禦彩虹表

彩虹表在生成的過程中,針對的是特定的函數H,H如果發生了改變,則已有的彩虹表資料就完全無法使用。

如果每個使用者都用一個不同的鹽值,那麼每個使用者的H函數都不同,則必須要為每個使用者都生成一個不同的彩虹表。大大提高了破解難度。

是以,BCrypt算法因為每次加密的鹽都是不一樣的,很難被破解。

我的微信公衆号:架構真經(id:gentoo666),分享Java幹貨,高并發程式設計,熱門技術教程,微服務及分布式技術,架構設計,區塊鍊技術,人工智能,大資料,Java面試題,以及前沿熱門資訊等。每日更新哦!

  1. ​​https://baijiahao.baidu.com/s?id=1611935212672798027&wfr=spider&for=pc​​

繼續閱讀