實驗簡介
實驗所屬系列: 密碼學
實驗對象: 大學/專科資訊安全專業
相關課程及專業: Python程式設計
實驗時數(學分):2學時
實驗類别: 實踐實驗類
預備知識
Hash:一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預映射pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,是以不可能從散列值來确定唯一的輸入值。簡單的說就是一種将任意長度的消息壓縮到某一固定長度的消息摘要的函數。後文所說的MD5算法是常用雜湊演算法之一,類似的還有MD5算法,SHA-1算法。
RainbowCrack:生成彩虹表的工具,是Philippe Oechslin 更快的時間記憶權衡技術的一般簡易實作。能夠實作:
1.全時間記憶體權衡工具套件,包括彩虹表生成,排序,轉換和查找
2.支援任何雜湊演算法的彩虹表
3.支援任何字元集的彩虹表
4.支援原始檔案格式(.rt)和壓縮檔案格式(.rtc)的彩虹表
5.計算多核處理器支援
6.使用NVIDIA GPU進行GPU加速(CUDA技術)
7.采用AMD GPU的GPU加速(OpenCL技術)
8.具有多個GPU的GPU加速
9.以及相應的系統相容
MD5消息摘要算法(MD5 Message-Digest Algorithm):一種被廣泛使用的密碼散列函數,可以産生出一個128位(16位元組)的散列值(hash value),用于確定資訊傳輸完整一緻。MD5由美國密碼學家羅納德·李維斯特(RonaldLinn Rivest)設計,于1992年公開,用以取代MD4算法。
實驗目的
1)了解雜湊演算法的概念。
2)了解彩虹表攻擊的原理以及進行相應實戰。
3)掌握針對彩虹表攻擊的防禦要點。
實驗環境

伺服器:Windows 7 64位 ,IP位址:随機配置設定
輔助工具:Python2 IDE,RainbowCrack(1.7版本)
請在實驗機内下載下傳源碼及軟體:http://tools.hetianlab.com/tools/rainbow.zip
實驗步驟一
在資訊化時代,手機已經成為了我們生活中不可缺少的一部分,而我們的手機鎖屏密碼大部分都是4位數字的組合,在存在着防禦暴力破解機制的前提下(例如多次嘗試失敗進行鎖定),我們可以用怎樣的加密機制來防止不懷好意的人破解我們的手機密碼呢?同樣,身為Cracker的你,怎樣在别人無法察覺的情況下破解手機密碼呢?
我們的任務分為3個部分:
1.以防禦者的視角,編寫對于4位密碼進行md5加密的腳本,來抵禦攻擊者對密碼的嗅探。
2.以攻擊者的視角,通過生成相應的彩虹表來對4位數字密碼MD5密文進行破解。
3.以防禦者的視角,通過某種措施來抵禦彩虹表破解或者使攻擊者的破解難度和成本大大增加。
任務描述:使用任意一種語言,對特定的四位數字進行MD5加密(例如‘1234’),輸出加密後的結果:
實驗步驟二
任務描述:使用給定的彩虹表生成工具RainbowCrack,生成破解四位數字組合MD5值的彩虹表,并對實驗一中的MD5字元串進行破解。
操作步驟
1)生成彩虹表:
使用指令:rtgen md5 numeric 4 4 0 3000 400000 0
//顯示了生成後的檔案名
//顯示了生成相應彩虹表所用時間
2)對彩虹表進行排序:
彩虹表是一串彩虹鍊。每條彩虹鍊都有一個起點和一個終點。rtsort程式通過終點對彩虹鍊進行排序,使二進制搜尋成為可能。
運作以下指令對目前目錄中的所有.rt彩虹表進行排序:
rtsort .
切勿中斷rtsort程式; 否則被分類的彩虹表可能會被損壞。
如果可用記憶體大小小于正在排序的彩虹表的大小,則需要與彩虹表大小一樣大的臨時硬碟空間來存儲中間結果。
我們生成的這表太小,是以瞬間就完成了排序.
3)對我們實驗一中的md5密文進行彩虹表破解:
附指令示例,破解單個哈希:(.為彩虹表在目前目錄的寫法,不在目前目錄直接寫路徑)
rcrack . -h fcea920f7412b5da7be0cf42b8c93759
rcrack_cuda . -h fcea920f7412b5da7be0cf42b8c93759
rcrack_cl . -h fcea920f7412b5da7be0cf42b8c93759
破解多個哈希:
rcrack . -l hash_list_file
rcrack_cuda . -l hash_list_file
rcrack_cl . -l hash_list_file
對于單個的哈希值,我們可以直接用rcrack.exe . -h hashnum來進行破解:
以’1234’為例
//彩虹表破解成功
//類似的,還可以通過同樣的思路破解SHA1等雜湊演算法
(彩虹表攻擊是高效的,但是存儲彩虹表所要花費的代價也是高昂的,以MD5雜湊演算法為例,我們僅僅4位數字組合的彩虹表便用去了6M左右的空間,而10位小寫字母與數字的組合便需要花費316GB的記憶體空間。但無論怎樣,彩虹表在空間上的花銷是一定要優于字典對的)
實驗步驟三
任務描述:針對彩虹表的攻擊原理,思考對這種攻擊的防禦手段:
示例:通常,我們對彩虹表攻擊的防禦措施有兩種:
①“加鹽”:彩虹表隻能通過有限密碼集合生成查找表——當密碼集合擴大,彩虹表占用的空間将以指數速度增加。是以目前最常用的方式是将使用者密碼添加一段字元串(鹽化)後再做散列。
saltedhash(password) =hash(password+salt)
如果将使用者密碼後添加一段随機字元串,然後将随機字元串和散列後的哈希值存儲在密碼資料庫中。彩虹表将不得不計算出鹽化後的密碼,而鹽化後的密碼會大大增加散列前的長度,進而使密碼集合過大而變得不可能生成彩虹表。
示例:我們直接在之前‘1234’的md5值後面增加’aaaa’的鹽值,結果不能通過彩虹表破解。
②已知彩虹表是應用于主流的雜湊演算法的,那麼通過對雜湊演算法進行修改,自然能夠防禦彩虹表破解。
但這樣存在某些隐患,例如,黑客可以将産品的算法通過逆向工程提取出來,通過算法生成特定的彩虹表。如果私有加密算法強度不夠或是有設計缺陷的,屆時密碼破解将比使用彩虹表更加容易。
習題