在密碼學中,雜湊函數 (Hash Function) 是確保資料完整性 (Integrity) 與密碼安全儲存的核心基石。
與 RSA 等非對稱加密不同,雜湊演算法屬於單向函數 (One-Way Function):
理想的雜湊函數應具備抗碰撞性 (Collision Resistance),即找不到兩組不同的輸入 M1 != M2,使得:Hash(M1) = Hash(M2)
根據鴿籠原理 (Pigeonhole Principle) 與生日悖論 (Birthday Paradox),當輸入空間遠大於輸出空間時,碰撞必然存在。
由於雜湊演算法無法直接解密,攻擊者若拿到加密資料庫中的密碼雜湊值(例如 5f4dcc3b5aa765d61d8327deb882cf99),通常會採用以下幾種破解策略:
123456, password)算出雜湊值儲存在資料庫中直接查詢。我們利用 Python 來親自驗證 MD5 的單向性破解(彩虹表/字典查表)以及 MD5/SHA256 的雪崩效應。
創建 day21_hash_demo.py:
import hashlib
def test_avalanche_effect():
print("=== 1. 雪崩效應 (Avalanche Effect) 測試 ===")
text1 = "Hello World"
text2 = "Hello world" # 僅 W 改為小寫 w
hash1 = hashlib.sha256(text1.encode()).hexdigest()
hash2 = hashlib.sha256(text2.encode()).hexdigest()
print(f"輸入 1: '{text1}' -> SHA256: {hash1}")
print(f"輸入 2: '{text2}' -> SHA256: {hash2}")
print("-" * 60)
def rainbow_table_crack(target_hash):
print("=== 2. 彩虹表 / 字典查表攻擊模擬 ===")
print(f"目標 MD5 Hash: {target_hash}")
# 模擬密碼字典 (Wordlist)
common_passwords = [
"admin", "123456", "password", "picoCTF",
"iloveyou", "fju_medinfo", "security2026"
]
for pwd in common_passwords:
# 計算字典詞彙的 MD5
calc_hash = hashlib.md5(pwd.encode()).hexdigest()
if calc_hash == target_hash:
print(f"[🎯] 破解成功!對應的原文字串為: '{pwd}'")
return pwd
print("[-] 字典中未找到匹配的密碼。")
return None
if __name__ == "__main__":
test_avalanche_effect()
# 測試破解 'picoCTF' 的 MD5 雜湊值
target = hashlib.md5("picoCTF".encode()).hexdigest()
rainbow_table_crack(target)
```
### 步驟二:執行結果
在 WSL 終端機執行:
```Bash
python3 day21_hash_demo.py
輸出畫面:
=== 1. 雪崩效應 (Avalanche Effect) 測試 ===
輸入 1: 'Hello World' -> SHA256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
輸入 2: 'Hello world' -> SHA256: 64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c
------------------------------------------------------------
=== 2. 彩虹表 / 字典查表攻擊模擬 ===
目標 MD5 Hash: d5225bf0e85e43c220f1837e28989914
[🎯] 破解成功!對應的原文字串為: 'picoCTF'

面對彩虹表攻擊與雜湊碰撞,現代密碼學儲存密碼時應採用以下防護作為:
1.加入鹽值 (Salting):
在密碼雜湊前加入隨機產生的長字串(Salt),例如 Hash(Password + Salt)。這會使預先計算好的彩虹表無效化,因為攻擊者必須為每個使用者單獨生成彩虹表。
2.使用慢速雜湊演算法 (Key Derivation Functions):
避免直接使用 MD5, SHA256 儲存密碼。應改用加入工作因子 (Work Factor) 的安全演算法,如 Argon2, bcrypt, 或 PBKDF2,故意增加計算延遲,大幅拉高攻擊者的爆破成本。
3.淘汰過時演算法:
禁止將MD5與 SHA-1 用於數位簽章或安全驗證,應統一提升至 SHA-256 或SHA-3系列。