http://en.wikipedia.org/wiki/Brute-force_attack http://en.wikipedia.org/wiki/Dictionary_attack http://en.wikipedia.org/wiki/Rainbow_tables http://lasecwww.epfl.ch/pub/lasec/doc/Oech03.pdf http://www.91ri.org/7593.html http://www.ha97.com/4009.html
也就是常說的"暴力破解",這是一種"時間消耗型"的password reverse方式,肯定了密文的加密方式的前提下,使用相同的加密算法,計算 M = H(P) P爲全部的明文空間 H爲加密算法 M爲密文 而後將計算獲得的M和待破解的密文進行比較,若是匹配成功,則對應的明文P即爲待破解密文的明文。值得注意的是,這個枚舉P和比較M的過程每每是在內存中進行的,
也即在計算的過程當中一邊產生,一邊比較,此次破解結束後,下一次破解又要從新開始從頭枚舉,效率不過高
典型的Brute-Force-Attack如圖
字典破解本質上仍是"暴力破解"的一種,我以爲它是"Brute-Force-Attack"的另外一個極端,"Brute-Force-Attack"是一種純的"時間消耗型"的攻擊方式,它全部的開銷都是時間,
而"Directory-Based-Attack"是一種純的"空間消耗型"的攻擊方式。 在"Directory-Based-Attack"中,攻擊者是對全部的明文(M)進行預計算(PreConputation),將全部的明文的HASH都事先計算好,並保存起來。典型的MD5字典以下: .... password 5f4dcc3b5aa765d61d8327deb882cf99 admin 21232f297a57a5a743894a0e4a801fc3 cnblog efbc3548e65e7225dcf43d3918d94e6f .... 在進行破解的時候,破解程序將字典映射Mapping到內存中,而後將HASH和待破解的密文進行逐條比較(這點和Brute-Force是同樣的),直到找到某條HASH和待破解的密文相同爲止。
值得注意的是,基於字典的暴力破解時間上比單純的內存計算型暴力破解更有效率,只要一次的"字典生成"花費必定的時間,後續的屢次破解均可以重複使用這個字典。
注意,這裏說的"字典"指的對應某個算法的字典: MD5 Directory、SHA1 Directory、NTLM Directory等等。 總的來講,字典攻擊是對單純的內存型暴力破解的一個改進,它引入了PreComputation的思想,但缺點也很明顯,須要佔用及其龐大的磁盤空間,以致於對於長度16以上的密碼字典,
完整存儲根本不可能
典型的"Directory-Based-Attack"如圖
這是對"Brute-Force"和"Directory-Base"的一種折中的破解技術,在2003年瑞典的Philippe Oechslin 在Making a Faster Cryptanalytic Time-Memory Trade-Off一文
(文章開頭有給出連接)中首次被提出,它有效的利用了PreComputation的優勢,同時又克服了Diecretory-Based消耗太空磁盤空間的缺點,在這二者中找到了一個平衡點。 不過,它也有缺點,即: 1) password+salt: 加鹽 2) key stretching: 密碼擴展,包括輪數擴展和長度擴展 接下來,咱們的文章會重點分析這個彩虹表破解的技術原理
在開始研究Rainbow Table-Attack的技術以前,咱們有必要先明白一個問題,雖說彩虹表破解技術比"Brute-Force-Attack"、"Directory-Based-Attack"都要好,但並非全部場景下都能使用彩虹表進行破解的。密碼破解有兩種場景:php
1) 遠程破解場景 攻擊者面對的是一個遠程的服務器,而且目標服務器存儲密碼的生成算法也不知道,此時,咱們只能使用Hydra等工具進行窮舉破解(Brute-Force)、
或者字典破解(Diretory-Attack)
2) 本地破解場景 攻擊者知道遠程服務器的密碼生成算法(經常發生在一些常見的CMS系統後中)、經過hashdump抓到了內存中的HASH密碼(LM、NTLM)、或者已經拿到了密碼的HASH值(脫庫中常見),
攻擊者能夠在本地本身的計算機上進行本地計算,這個時候,相比暴力破解(Brute-Force-Attack)、字典破解(Directory-Attacj)來講,彩虹表破解就是一個更好的選擇了。
Rainbow Table相比Directory作的第一個改進就是將龐大的明文密文對"分紅"了"明-密文對鏈chain",鏈條的長度越長,空間的縮減效果就越大。爲了使用彩虹表技術,須要事先肯定兩個
函數: H(HASH函數): 密碼的加密方式,不一樣的彩虹表對應於不一樣的加密方式(這點和Directory-Based的道理是同樣的) 常見的H函數有: MD四、MD五、SHA一、
R(Reverse Hash函數): 逆HASH函數,並非真的對HASH函數求逆(咱們都知道HASH函數是不可逆的),這裏所謂的R函數,只是一個映射Mapping函數,將H()獲得的密文再次映射回一個對應
的明文,不必定是原來的明文,只要是明文就行
要注意,彩虹表的核心思想仍是PreComputation的字典思想,因此生成彩虹表就是在生成一個字典,只是這個生成過程再也不是單一的H計算,並保存明-密文對那麼簡單了。html
咱們分別看每一條鏈:linux
H(wikiedia)=ao4kd -> R1(ao4kd)=secret -> H(secret)=9kpmw -> R2(9kpmw)=jimbo -> H(jimbo)=v0d$x -> R3(v0d$x)=rootroot H(abcdefgh)=1vn6s-> R1(1vn6s)=bernie-> H(bernie)=kolscx-> R2(kolscx)=zurich-> H(zurich)=8ntpy -> R3(8ntpy)=myname .... H(passwd)=dlcm4-> R1(dlcm4)=culture-> H(culture)=re3xes-> R2(re3xes)=crypto-> H(crypto)=1tik0-> R3(1tik0)=linux23
有幾個重點要關注:算法
1) 在這個例子中,彩虹表的chain length是3,也就是說一條鏈包含3個節點,也即這種狀況能夠以本來 1/3 的磁盤空間保存同等規模的字典服務器
2) wikiedia稱爲"頭結點",rootroot稱爲"尾節點"。咱們最後須要保存的也就是這個頭-尾節點對,而中間的中間值全都不用保存,這也是彩虹表省空間的緣由架構
3) R一、R二、R3....Rk(K表明每條鏈的長度,在這個例子中是3),是K個不一樣的Reverse Hash函數,它存在的目的是爲了不出現不一樣的chain中出現重複的節點,咱們能夠思考一下,若是這個R在一條鏈中的每一個節點都是同樣的,那若是假如在兩條鏈中的某兩個節點在進行R()以後,獲得了相同的結果,則在這以後,H計算也會獲得相同的結果,緊接着R計算又是相同的結果,則形成了重複存儲,浪費了存儲空間,也減低了這套破解系統的明文空間覆蓋度,從而間接影響了破解效果。app
假如R是不變的: H(startpoint1)=median1 -> R(median1)=median12 ...... -> R(median1x)=same -> H(same)=same1 -> .... same_end H(startpoint2)=median2 -> R(median1)=same -> H(same)=same1 -> .... same_end ... 注意這個重合必定是發生在不一樣鏈上的不一樣位置的節點,由於H的"非碰撞性"保證了這點(思考),這個重合致使的是兩條鏈中的某一段發生了"重合"
會出現這個現象的緣由是由於咱們選擇的R函數很難保證"非碰撞性",即沒法保證不一樣的輸入在進行R計算不會獲得不一樣的輸出,爲了解決這個問題,將一條鏈上的不一樣節點的每次計算都使用不一樣的R函數,這樣,即便在不一樣鏈上的不一樣位置由於Rk是不同的,就不會發生重合了。分佈式
回到主題上來,這個鏈式的表生成好以後,咱們之保存每條鏈的頭和尾的兩個明文節點,中間的點都是"可計算的",故丟棄,把所有的鏈的頭尾節點保存起來,就成了所謂的彩虹表ide
再次回顧這張圖函數
假如咱們要破解的HASH密文爲re3xes 1) 對密文re3xes進行Rk(k表明最後一個R函數,這裏是R3)運算,獲得一個臨時結果 I,將這個臨時結果I和每條鏈的尾節點進行比較,檢測是不是某一條鏈的尾節點 1.1) 若是匹配成功,則破解成功,咱們知道了這個待破解的密文屬於某一條鏈,就能夠利用這條鏈的頭尾節點重現(再次計算)出這條鏈上的每一個明密文對,天然也包括了待破解密文的明文 1.2) 若是匹配失敗,在全部鏈的尾節點上都沒有這個臨時結果 I,則繼續進行(2) 2) 對密文re3xes進行Rk-1(k-1表明倒數第二個R函數,這裏是R2),這裏又獲得一個臨時結果: crypto,再對臨時結果crypto進行H計算,獲得: 1tik0,再對1tik0進行Rk
(k表明最後一個R函數,這裏是R3)獲得一個臨時結果: linux23。將這個臨時結果和每條鏈的尾節點進行比較,檢測是不是某一條鏈的尾節點 1.1) 若是匹配成功,則破解成功,在這個例子中咱們知道匹配成功,就能夠利用這條鏈的頭節點: passwd重現(再次計算)出這條鏈上的每一個明密文對,天然也包括了待破解密文的
明文: culture 2.1) 若是匹配失敗,則繼續調用Rk-2進行搜索,步驟都是相似的 ... 直到完成了R1的搜索,若是尚未找到匹配的,則宣佈本次破解失敗,須要增大彩虹表文件大小、重組字典
咱們知道,彩虹表的核心思想是"PreComputation預計算",而預計算的一個最大大問題就是"當加密的形式發生變化,這個預生成的字典從某種程度上就無用了"。這麼說有些不太準確,我想表達的意思是預計算對算法的變化很是敏感,這也是對抗彩虹表技術的一個思考方式。
由於彩虹表須要針對算法變化的每一種形式都預生成一個對應的字典,若是這個變化空間很大,就會使彩虹表的生成成本變得很大,這樣,彩虹表本來解決的空間成本問題又再次暴露出來。
而要達到"算法變化"的方式很是多,常見的有如下兩種方法
1) 加鹽 saltedhash(password) = hash(password+salt) Or saltedhash(password) = hash(hash(password)+salt) 須要對付這種加密方式,彩虹表就須要針對salt的每一種可能的取值都生成一套字典,當salt的長度很長時,彩虹表的生成成本和破解效率都會大幅降低 2) 密碼加強 key stretching 是加密方式變化除了"加鹽",加密輪數也是一個可變化的點,MD5-Crypt and in bcryp中都使用了Crypt Loop技術,即便用同一個算法,或不一樣的算法組合對一個明文進行迭代的
屢次(1000以上)加密,這樣,加密的輪數和加密方式的組合自己也構成了一個"變化空間" 須要對付這種加密方式,彩虹表就須要針對每個加密輪數+加密方式的組合都生成一套字典,一樣,彩虹表的生成成本和破解效率都會大幅降低
http://files.cnblogs.com/LittleHann/MD5%E7%A0%B4%E8%A7%A3%E5%B7%A5%E5%85%B7.rar MD5解密器我的增強版 LC5 http://ishare.iask.sina.com.cn/f/8862330.html Ophcrack http://www.objectif-securite.ch/ophcrack.php SAMInside http://www.insidepro.com/eng/saminside.shtml Rainbowcrack http://www.project-rainbowcrack.com/ 彩虹表免費下載 https://www.freerainbowtables.com/en/tables/
研究一下目前密碼破解的新技術,主要有如下幾個方面
1. 當前密碼破解的方法 目前大規模高速密碼破解技術主要有: 1) CPU破解 經過大規模、高覆蓋率、社工庫類型的明文密碼庫做爲輸入字典,對密文進行破解,這裏的關鍵就在於字典庫的高高覆蓋率,能夠達到很高的破解率 2) GPU破解 關於GPU的告訴運算原理,能夠參考這兩篇文章,我目前對硬件的研究並很少,也會也許會考慮寫一些關於GPU硬件方面的研究文章 http://blog.chinaunix.net/uid-9620812-id-3061237.html http://wenku.baidu.com/link?url=j90kB6Vk8KuEA8lITgZNJ4GbHeXgiArFcS3xwXRaEv83LxtqUFaWJLDyxqN6ue1iB-q3zwNTfPL55k2qneDHD3nHc2cqzBW2tktrfMRboDi GPU破解所帶來的變化是計算速度的成倍提高,至關於本來的CPU破解,理論上GPU破解也能夠採用字典的方法,可是,由於GPU的超高速性,因此針對GPU破解,咱們就能夠更多地採用一些時
間消耗型的計算,減小CPU破解中的磁盤IO的瓶頸問題。 也就是說,基於GPU的破解架構,咱們採用"暴力窮舉"就成了更好的選擇,可是,單純的使用暴力窮舉也不是很好的辦法,例如: LittleaHann2014china這種類型的密碼,長度極長,可是
卻含有必定的規律性,若是採用純粹的暴力窮舉,破解的效率不會很好。 因此,針對GPU破解,目前採用的"基礎字典"+"詞根衍變"的破解技術,這能夠理解爲在高速GPU的架構下對時間消耗和磁盤IO消耗的一個折中的優化方案,這個方案中有3個要素 1) 必定規模的明文字典 2) GPU高速運算 3) 某種詞根衍變算法,能根據詞根衍變算法,對基礎的字典進行詞根重組,組合出新的密碼,例如組合出LittleaHann2014china http://hashcat.net/oclhashcat/ hashcat是一款使用GPU加速破解的軟件,具備很好的效果。 2. 分佈式的破解技術 1) 利用分佈式系統作大規模批量破解 2) 對明文字典進行有效切分 舉例來講,一個明文的MD5值是一個32位的密文,則咱們能夠根據這個32位密文的每一位的值將本來的一個大的字典切分紅不一樣的部分,並放在不一樣的子目錄中。 例如: ... 02f521d18b7100ce07cd17c94fe5a89f 03f521d18b7100ce07cd17c94fe5a89f 12f521d18b7100ce07cd17c94fe5a89f 13f521d18b7100ce07cd17c94fe5a89f ... 是一堆MD5值,咱們先根據MD5值的第一位進行分類,將第一位爲0的MD5對應的明文都放到一個路徑下,將第一位爲1的MD5對應的明文放到另外一個路徑下。 而後在剛纔第一位爲0的目錄下,咱們繼續進行切分,將第二位爲2的放到一個目錄下,將第二位爲3的放到另外一個目錄下 同時在剛纔第一位爲1的目錄下,咱們繼續進行切分,將第二位爲2的放到一個目錄下,將第二位爲3的放到另外一個目錄下 這個過程會不斷地遞歸下去,直到分到單個明文字典文件的大小在可接受的範圍內,即磁盤IO的壓力可以取得平衡的時候。 這樣作的好處在於,當你拿到一個待破解的密文,能夠根據這個密文的頭部每一位數值,進行對應的路徑定位,這樣,路徑定位的過程從"某種程度上來講"就已是在進行破解了,並且更重
要的是,這種技術能夠有效利用分佈式的架構,緩解由於讀寫文件致使的IO瓶頸,是一種很是好的技術
目前密碼破解存在的問題
在密碼破解攻防領域中,加鹽salt依然是一種簡單、而十分有效的方法,對於加鹽的密碼,黑客們要破解存在如下幾個問題 1. 加鹽salt的長度很短,只有幾位的鹽 1) 直接生成字典、彩虹表(在投入-產出比可接受的狀況下) 2) 用GPU直接在內存中進行暴力枚舉,由於若是鹽的長度很短,在高速GPU的架構下投入-產出比徹底能夠接受 2. 加鹽的長度很長,到達12位以上 1) 生成字典(不可行) 2) GPU破解(耗時太大)
咱們能夠看到,密碼破解的本質是"資源",這個資源包括字典的資源、計算能力的資源,固然加上詞根衍算法,就能將擁有的資源的效果翻倍
接下來待研究的知識點
1. 詞根衍變算法 2. 分佈式的、根據指定位的值對文件切分的多級目錄存儲明文詞典 3. GPU破解(須要購買相應的顯卡)