彩虹表的原理可以簡單地理解為「用空間換取時間」的密碼破解技術。它的核心思想是不儲存每一個密碼的哈希值,而是只儲存「鏈」的起點和終點,藉此大幅減少儲存空間。
很多人一開始都以為彩虹表就像一個巨大的字典,可以百分之百地破解密碼。但這確實是個誤解。彩虹表之所以被視為一種巧妙的技術,正是因為它犧牲了「百分百的成功率」來換取「可行的儲存空間」。
完整的 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 中的所有哈希值並嘗試破解。