首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

MD5 演算法深度解析:原理、流程與安全應用

     編輯:關於C++

什麼是 MD5?

MD5(Message-Digest Algorithm 5) 由 Ronald Rivest 於 1991 年設計,是 MD4 的改進版。它將任意長度的位元組串(byte stream)轉換為固定長度 128-bit(16 位元組)的雜湊值。注意:輸入是「位元組串」而非「字串」,因此與字元編碼(UTF-8、Big5 等)無關,僅取決於原始位元組值。

核心特性

  • 單向性:無法從雜湊值反推原始輸入(數學上對應無限多原像)。
  • 雪崩效應:輸入微小變化(如 1 bit)導致輸出劇烈改變。
  • 固定輸出長度:無論輸入多長,輸出皆為 128-bit。
  • 抗碰撞(歷史):設計目標為難以找到兩組不同輸入產生相同雜湊,但 2004 年起已被實際破解,不再適合數位簽章、SSL/TLS 憑證、完整性驗證等安全關鍵場合。

典型應用場景(非機密性保護)

  1. 檔案完整性校驗:發布軟體時提供 MD5 雜湊,使用者下載後比對,確認檔案未被竄改或損毀。
  2. 密碼儲存(僅限舊系統/相容性):系統儲存 MD5(password) 而非明文。驗證時計算輸入密碼的 MD5 比對。現代系統應改用 bcrypt、Argon2、PBKDF2 等慢速雜湊 + Salt。
  3. 快速查找/索引:資料庫雜湊索引、分散式系統一致性雜湊(如 Memcached 的 Ketama 演算法)。
  4. 訊息鑑別碼 (HMAC-MD5):結合金鑰提供訊息完整性與來源驗證(仍建議改用 HMAC-SHA256)。

MD5 演算法詳細流程(RFC 1321)

步驟 1:補位

訊息長度 L(bit)滿足 L ≡ 448 (mod 512)。具體做法:先加一個 1 bit,再補 0 bit 至達標。補位後長度為 K×512 + 448 bits(即 K×64 + 56 bytes)。

步驟 2:附加原始長度

以 64-bit 小端序整數表示原始訊息長度 L(bit),附加在補位後的資料末尾。此時總長度為 512-bit 的倍數(N×512 bits)。

步驟 3:初始化緩衝區

四個 32-bit 暫存器(以十六進位顯示):

A = 0x01234567
B = 0x89ABCDEF
C = 0xFEDCBA98
D = 0x76543210

步驟 4:定義非線性函數

每輪使用不同函數(X,Y,Z 為 32-bit 字):

F(X,Y,Z) = (X & Y) | (~X & Z)
G(X,Y,Z) = (X & Z) | (Y & ~Z)
H(X,Y,Z) = X ^ Y ^ Z
I(X,Y,Z) = Y ^ (X | ~Z)

步驟 5:主迴圈(四輪,每輪 16 步,共 64 步)

每輪處理一個 512-bit 區塊(16 個 32-bit 字 M[0..15])。使用常數表 T[1..64](T[i] = floor(2^32 × |sin(i)|))。

每步操作形式:a = b + ((a + f(b,c,d) + X[k] + T[i]) <<< s),其中 f 為輪函數,k 為訊息字索引,s 為左循環位移量,i 為步驟號。

四輪索引與位移量安排(節錄):

輪次函數步驟範例
1F[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] ...
2G[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] ...
3H[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] ...
4I[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] ...

每輪結束後:A += AA; B += BB; C += CC; D += DD(AA..DD 為輪初值)。

步驟 6:輸出

將最終 A,B,C,D 以小端序串接為 128-bit 雜湊值(通常以 32 字元十六進位字串表示)。

安全性現狀與替代建議

攻擊類型現狀影響
碰撞攻擊2004 年 Wang 等人實際構造碰撞,複雜度 ~2^39可偽造數位簽章、惡意軟體繞過白名單
選擇前綴碰撞2009 年 Stevens 等人改進,複雜度 ~2^50可產生任意前綴的兩份不同檔案同雜湊
預像攻擊理論複雜度 2^128,尚無實際破解單向性尚存,但不建議新系統使用

結論:MD5 已不適合任何需要抗碰撞的安全用途(數位簽章、憑證、完整性驗證、新系統密碼雜湊)。

  • 完整性校驗/非安全索引:可繼續使用 MD5(效能佳)。
  • 密碼儲存:必須改用 Argon2id(首選)、bcrypt、scrypt、PBKDF2-HMAC-SHA256,並加入唯一 Salt。
  • 新設計:採用 SHA-256/384/512、SHA-3 (Keccak)、BLAKE2/3。
  • HMAC:改用 HMAC-SHA256 或更強。

RFC 1321 官方規格

https://www.ietf.org/rfc/rfc1321.txt

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved