哈希 (Hash):單向函數,輸入任意長度 → 固定長度摘要。特性:不可逆 (無法從摘要反推輸入)、抗碰撞 (極難找到兩輸入產生相同摘要)。常見:MD5 (128-bit, 已破解)、SHA-1 (160-bit, 弱)、SHA-256/384/512 (現代標準)。
用戶輸入 PSK (8-63 ASCII)
↓ PBKDF2-HMAC-SHA1 (4096 迭代, SSID 作為 Salt)
PMK (Pairwise Master Key, 256-bit / 64 Hex) ← 靜態主金鑰,同一 SSID+PSK 固定
↓ PRF-512 (PMK, ANonce, SNonce, AA, SA)
PTK (Pairwise Transient Key, 512-bit) ← 每次會話動態生成
├── KCK (Key Confirmation Key, 128-bit) → 計算 MIC
├── KEK (Key Encryption Key, 128-bit) → 加密 GTK 傳輸
└── TK (Temporal Key, 128-bit) → 加密數據幀 (CCMP/TKIP)
| 幀 | 發送方 | 關鍵欄位 | 用途 |
|---|---|---|---|
| Msg 1 | AP → STA | ANonce | AP 隨機數,防重放 |
| Msg 2 | STA → AP | SNonce, MIC | STA 隨機數 + 證明擁有 PMK |
| Msg 3 | AP → STA | ANonce, GTK (加密), MIC | 分發群組金鑰 GTK + 確認 |
| Msg 4 | STA → AP | MIC | 確認安裝 PTK/GTK |
關鍵點:PMK、PTK 不在握手包中傳輸。握手包僅含 MAC、Nonce、MIC。攻擊者需離線猜測 PSK → 算 PMK → 算 PTK → 算 MIC → 比對。
輸入:握手包 (MAC_AP, MAC_STA, ANonce, SNonce, MIC) + 字典 PSK 候選
循環每個 PSK:
PMK = PBKDF2-HMAC-SHA1(PSK, SSID, 4096, 256)
PTK = PRF-512(PMK, "Pairwise key expansion", MAC_AP||MAC_STA||ANonce||SNonce)
KCK = PTK[0:16]
MIC_calc = HMAC-SHA1-128(KCK, Msg2_EAPOL_Key_Data)
若 MIC_calc == MIC 捕獲值 → PSK 正確,破解成功
瓶頸:PBKDF2 4096 迭代極慢 (CPU ~1k H/s, GPU ~300k H/s)。空間換時間:airolib-ng 預計算 PMK 表 (Hash Table) → 破解時直接查表跳過 PBKDF2,但需儲存 64 Bytes × 字典大小 (rockyou 1400萬 ≈ 900 MB)。
$ wpa_passphrase "TP-LINK" "12345678"
network={
ssid="TP-LINK"
#psk="12345678"
psk=1eecc652f354863e9f985a96d48545c4994e0d21b04955432b60c2600c0743da
}
psk= 即 PMK (256-bit Hex)。相同 PSK 不同 SSID 產生完全不同 PMK,故預計算表須按 SSID 分別建立。PMK 不可逆推 PSK,直接輸入 PMK 亦可連線 (等同輸入 PSK)。
理解 PMK/PTK/MIC 推導鏈,才能真正評估 Wi-Fi 密碼安全強度並部署有效防禦。