彩虹表-破解雜湊演算法

來源:互聯網
上載者:User

  彩虹表(Rainbow Table)是一種破解雜湊演算法的技術,它的效能非常讓人震驚,在一台普通PC上輔以NVidia CUDA技術,對於NTLM演算法可以達到最高每秒103,820,000,000次明文嘗試(超過一千億次),對於廣泛使用的MD5也接近一千億次。更神奇的是,彩虹表技術並非針對某種雜湊演算法的漏洞進行攻擊,而是類似暴力破解,對於任何雜湊演算法都有效。但是無論怎樣,
彩虹表永遠是在資料加解密中是無奈但十分有效方法。

    這幾乎是令人難以置信的,Roger迫不及待的去看了
http://www.project-rainbowcrack.com 所介紹的原理。這其實已經不是新的技術了,但是很遺憾的是,搜尋“彩虹表原理”出來的文章對彩虹表原理的介紹都有不太正確,Roger就在這裡簡單的介紹一下,主要參考的是Wiki上的這篇
http://en.wikipedia.org/wiki/Rainbow_tables,英文好的可以去看這篇論文
http://lasecwww.epfl.ch/pub/lasec/doc/Oech03.pdf。

  我們先來做點科普,雜湊(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等。

    破解Hash的任務就是,對於給出的一個q,反算出一個p來滿足q = H(p)。通常我們能想到的兩種辦法,一種就是暴力破解法,把P中的每一個p都算一下H(p),直到結果等於q;另一種辦法是查表法,搞一個很大的資料庫,把每個p和對應的q都記錄下來,按q做一下索引,到時候查一下就知道了。這兩種辦法理論上都是可以的,但是前一種可能需要海量的時間,後一種需要海量的儲存空間,以至於以目前的人類資源無法實現。

    我們可以簡單的算一下,對於14位的大小寫加數字(先不算特殊字元了)組成的密碼的集合有多大?自然就是(26*2+10)^14 = 62^14 = 1.24 * 10^25,這個就約等於12億億億,即使我們每納秒可以校正一個p(一秒鐘10億次,目前PC做不到),暴力破解法也大概需要4億年;如果我們採用查表法,假定Hash的結果是128Bit即16位元組的,光存放Hash(不存放明文P)就需要10^26位元組的儲存空間。什嗎?現在硬碟很便宜?沒錯現在1GB硬碟大概是五毛錢,那麼按這個來算光儲存這個Hash大概需要5億億人民幣來買硬碟。所以有些文章說彩虹表就是依賴查一個巨大的表來破解Hash,簡直是個無知的玩笑。

    也正因為如此,我們一直都認為Hash是足夠安全的,十幾位的密碼也是強度足夠的,直到彩虹表的出現。現在我們來看看彩虹表是怎麼乾的。

    彩虹表的根本原理就是組合了暴力法和查表法,並在這兩者之中取得一個折中,用我們可以承受的時間和儲存空間進行破解。它的做法是,對於一個Q = H(P),建立另一個演算法R使得 P = R(Q),然後對於一個p,這樣進行計算:

  p0 -H-> q1 -R->p1 -H-> q2 -R->p2 -H-> q3 -R->p3  … -H-> q(n-1) -R->p(n-1) -H-> qn -R->pn

    簡單的說,就是把q用H、R依次迭代運算,最後得到pn,n可能比較大。最後我們把p0和pn都儲存下來,把其他的結果都丟棄。然後用不同的p0代入計算,得到多個這樣的p的對子。

    我們在做破解的時候,給出了一個q,我們來尋找p。我們先把q做一次R運算得到一個值例如叫c1,然後把c1和每一個p對的最後一個做比較,假如和某一個pn相等,那麼有可能這個pn所對應的p(n-1)就是我們在追尋的q,為了驗證我們把pn對應的p0再做一次鏈式計算,比對qn是否就是給出的q,如果是,很明顯p(n-1)就是我們在追尋的p,因為 p(n-1) -H-> qn。如果不是就繼續尋找直到遍曆所有的q0qn對。

    事情還剛剛開始,我們再算q -R-> c1 -H-> -R-> c2,再比對c2是否是qn,如果是,那麼p(n-2)就可能是p;再算c3、c4直到c(n-1),不知道這樣說你明白了嗎?

    總的來說,就是用一個p0pn對來儲存了一個鏈子的資料,如果n很大,就可以大大減小了儲存的空間。這樣帶來的問題是必須做n次比對,時間更長,但是我們不需要瞬間破解,等待幾秒乃至幾天破解一個密碼都是可以接受的。

    當然這裡只是講述了最粗淺的原理,仔細想一下還有很多的問題,例如R的選擇,Hash衝突的處理,如何選擇p0來實現足夠的覆蓋,如何在有限資源下產生彩虹表等等。對這些感興趣的可以去看看RainbowCrack的源碼
http://www.project-rainbowcrack.com

    說到彩虹表不得不說ophcrack和LM Hash了。本來即使是彩虹表的千億次速度,破解14位元字字母的密碼也需要百萬年的時間,無奈微軟為自己的Windows密碼設計了一個極其傻逼的演算法LM Hash:它把超過7位的密碼拆成兩個7位的密碼分別做hash。。。然後還大小寫不分,這使得它的取值範圍只有 36^7 約 784億,這麼小的集合加上彩虹表的威力,很快就可以破解出來。於是有了ophcrack,它可以dump SAM,然後Load指定的彩虹表進行破解。SAM是Windows存放密碼散列的地方(system32\config\sam),一般情況下是受到作業系統保護的,即使是管理員也沒辦法讀取,但是還是有很多工具能把它讀出來,例如ophcrack內建的pwdump。下面是Roger在筆記本上用ophcrack破解一個11位大小寫+數字密碼的,僅僅4秒!如果table已經在記憶體中,速度還會更快,幾乎是瞬間。當然這個程式要求記憶體比較大,否則Load
Table會比較慢。

ophcrack還有Live CD的ISO供下載,這意味著,只要可以物理接觸一個XP的系統,就可以輕鬆的擷取所有使用者的密碼明文!那我們將如何應對?像Windows這樣的是無法有力的保護散列的存放的,唯一的辦法是禁用很弱智的LM Hash演算法,僅使用比較強的NT Hash,破解的難度會增大很多。Vista以後預設禁用了LM Hash。對於XP,可以修改本地安全性原則的安全選項,“網路安全:不要再下次更改密碼時儲存Lan Manager的 Hash值” 設為啟用,再修改一次密碼就可以了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.