什麼是 MD5?
MD5(Message-Digest Algorithm 5)由 MIT 計算機科學實驗室與 RSA Data Security Inc. 於 90 年代初設計,經 MD2、MD3、MD4 迭代而來。它是一種單向雜湊函數,將任意長度的「位元組串」轉換為固定長度(128 位,16 位元組)的「指紋」值。
關鍵特性:
- 輸入敏感:輸入任意微小變化,輸出劇烈改變(雪崩效應)。
- 不可逆:無法從雜湊值反推原始資料(數學上為多對一映射)。
- 固定長度:無論輸入多長,輸出恆為 128 位。
核心應用場景
1. 檔案完整性校驗(指紋)
對檔案計算 MD5 值並保存。傳輸或儲存後重新計算,若值異則檔案被篡改。結合第三方時間戳或數位簽名,可防止發布方抵賴。
2. 密碼儲存(不儲存明文)
系統僅儲存密碼的 MD5 雜湊值。用戶登入時,將輸入密碼計算 MD5 再比對。開發者、管理員均無法得知原始密碼(僅能重設)。
3. 字典攻擊與防禦
攻擊者預計算常見密碼的 MD5 值建立「彩虹表」,再查表破解。防禦措施:
- 使用鹽值:儲存前在密碼前/後附加隨機字串再雜湊,使預計算失效。
- 採用慢速雜湊(如 bcrypt、PBKDF2、Argon2)增加暴力破解成本。
- 限制登入失敗次數、啟用多因子認證(MFA)。
MD5 算法流程(RFC 1321)
- 填充:在訊息末尾加 1 個 1、若干 0,使長度 ≡ 448 (mod 512) 位。
- 附加長度:以 64 位小端序整數記錄原始訊息位長度,補至 512 位倍數。
- 初始化鏈接變量:四個 32 位暫存器 A=0x67452301, B=0xEFCDAB89, C=0x98BADCFE, D=0x10325476。
- 四輪主迴圈:每輪 16 步,共 64 步。每步使用非線性函數(F、G、H、I)、常數表 T[i]、循環左移、模 232 加法,混合訊息分塊與暫存器值。
- 輸出:最終 A、B、C、D 串接為 128 位雜湊值(小端序)。
安全性現狀與建議
MD5 自 2004 年起被證實存在碰撞攻擊(可構造兩不同輸入產生相同雜湊),已不適合用於數位簽名、SSL 憑證等需強碰撞抵抗的場景。但對於檔案校驗、非安全關鍵的唯一標識生成,仍具實用價值。
現代替代方案:
- SHA-2 系列(SHA-256、SHA-512)
- SHA-3(Keccak)
- 密碼儲存專用:bcrypt、scrypt、Argon2、PBKDF2
參考資源
RFC 1321 官方規範:https://www.ietf.org/rfc/rfc1321.txt