Rainbow Table Attack

彩虹表的原理可以簡單地理解為「用空間換取時間」的密碼破解技術。它的核心思想是不儲存每一個密碼的哈希值,而是只儲存「鏈」的起點和終點,藉此大幅減少儲存空間。

很多人一開始都以為彩虹表就像一個巨大的字典,可以百分之百地破解密碼。但這確實是個誤解。彩虹表之所以被視為一種巧妙的技術,正是因為它犧牲了「百分百的成功率」來換取「可行的儲存空間」。


完整的 MD5 雜湊字典大小

完整的 MD5 雜湊字典(Hash Dictionary)需要儲存每一個可能的密碼組合及其對應的 MD5 值。我們以常見的 95 個可列印 ASCII 字元(大小寫字母、數字、符號等)作為字元集來計算:

  • 密碼長度從 1 到 10 的總組合數 這是 951+952+⋯+9510 的總和。這個數字非常巨大,主要由 9510 決定,約為 5.9×1019。
  • 單一條目的儲存大小 每個條目需要儲存:
    • MD5 雜湊值:16 位元組。
    • 原始密碼(最大 10 位元):最多 10 個位元組。
    • 加上其他開銷,我們估計一個條目約 28 個位元組
  • 總儲存空間 總大小約為 5.9×1019×28 bytes≈1.65×1021 bytes。

這相當於 1,364.04 EB (Exabyte),這是一個在技術上幾乎不可能儲存的檔案大小,這還只是一個字元集的計算結果。

彩紅表預估大小

100% 覆蓋率彩虹表:並非等於完整字典,理論上空間接近完整字典,大小也和完整字典差不多。當試圖讓彩虹表達到 100% 覆蓋率時,實際上已經拋棄了它最核心的優勢,將一個實用的技術變成了一個和完整雜湊字典一樣不切實際的任務。

90% 覆蓋彩虹表:犧牲 10% 的命中率,換取大約 10% 的空間節省。


建立彩虹表

語法:rtgen < hash_algorithm > < charset> <length> [ optimize ]

  • hash_algorithm : 指定雜湊演算法
  • charset: 字元集可選 loweralpha (小寫字母), upperalpha (大寫字母), numeric (數字), mixalpha (大小寫字母), mixalpha-numeric (大小寫字母和數字), special (特殊符號)。
  • length: 長度範圍指定 plaintext_len_min (最小長度) 和 plaintext_len_max (最大長度)。
  • optimize: 主要有4個,這些參數會影響彩虹表的效率和大小,可以根據需要調整。
    • table_index:預設為 0
    • chain_len:預設為 3800(鏈長度):主要影響空間,但過長會犧牲效率
    • chain_num:預設為 33554432(鏈數量):主要影響空間,同時直接決定成功率
    • part_index:預設為 0

範例如下,產生MD5各種字元且長度1到6的彩紅表

rtgen md5 mixalpha-numeric-special 1 6 9 3800 33554432 0

這些命令會生成 .rt.rtc 檔案,請將它們保存在一個單獨的目錄中,以便後續使用。

生成過程可能需要很長時間,具體取決於您的電腦效能。


用彩紅表破解哈希值

當您有了彩虹表檔案後,就可以使用 rcrack 來進行破解。rcrack 會自動加載所有 .rt 和 .rtc 檔案,並在每個表中尋找與您的哈希值匹配的密碼。如果成功,它將顯示原始密碼。

破解hash

語法:rcrack < rainbowfile directory > -h < hash >

範例: 假設您要破解 MD5 哈希值 e10adc3949ba59abbe56e057f20f883e(對應密碼為 123456),並且您的所有彩虹表檔案都放在 /home/rainbowtables 資料夾中。

cd /home/rainbowtables
rcrack . -h e10adc3949ba59abbe56e057f20f883e

破解hash清單

語法:rcrack < rainbowfile directory> -l < hash file >

範例: 假設您有一個名為 hashes.txt 的檔案,內容如下:

e10adc3949ba59abbe56e057f20f883e
900150983cd24fb0d6963f7d28e17f72

然後,您可以使用以下命令來破解它們:

cd /home/rainbowtables
rcrack . -l hashes.txt

rcrack 將讀取 hashes.txt 中的所有哈希值並嘗試破解。