MD5 加密演算法是什麼?
更新日期: 2025 年 3 月 6 日
本文為 資安入門 系列文,第 2 篇
- OWASP Top 10:最新的 Web 安全風險與防範措施(2021 版)
- MD5 加密演算法是什麼? 👈所在位置
- SHA-1 是什麼?為什麼不再安全?
- 深入解析 Session:從概念到運作方式
- 什麼是 Session Fixation(會話固定攻擊)?
- HTTP 與 HTTPS 的差別:新手完整指南
- 跨站請求偽造(CSRF)入門指南:攻擊原理、實例與防禦方法
- 跨站指令碼攻擊(XSS)入門指南:從原理到防禦的全解析
- SQL 注入攻擊全解析:從入門到防禦實戰指南
- 新手指南:深入了解 Content-Security-Policy (CSP) 與網站安全
- 從零理解 Same-Origin Policy:瀏覽器安全的第一道防線
- 跨來源資源共享(CORS)完整指南:打破瀏覽器的安全邊界
MD5(Message Digest Algorithm 5) 是一種雜湊演算法(Hash Algorithm),主要用來對資料進行不可逆的單向加密,常見於密碼儲存、數據完整性驗證等用途。
MD5 會將任意長度的輸入轉換為固定長度的 128 位元(16 字節) 的雜湊值(Hash Value)。
MD5 的工作原理
MD5 透過一系列數學運算,將輸入的資料轉換為一組固定長度的「數字指紋」。
無論輸入是短是長,最終產出的雜湊值長度都固定為 128 位元(通常以 32 個十六進位字元表示)。
舉例
- 輸入
"hello"
→ MD5 雜湊值:5d41402abc4b2a76b9719d911017c592
- 輸入
"hello123"
→ MD5 雜湊值:8b1a9953c4611296a827abf8c47804d7
即使輸入內容只有細微變化(如 "hello"
和 "hello123"
),MD5 產生的雜湊值完全不同,這就是雪崩效應(Avalanche Effect) 的特性。
MD5 的用途
密碼儲存(已被淘汰,因為不安全)
早期許多網站會使用 MD5 來儲存密碼,例如:
import hashlib
password = "mypassword"
hash_value = hashlib.md5(password.encode()).hexdigest()
print(hash_value) # e99a18c428cb38d5f260853678922e03
但這種做法已經被證明不安全,因為 MD5 容易被破解。
這兩段說明了文件完整性驗證的概念,主要是確保檔案或數據在傳輸或儲存過程中沒有被篡改。以下是更詳細的解釋:
文件完整性驗證(檔案驗證)
當你從網站下載一個檔案,該網站可能會提供一個 MD5 雜湊值(MD5 hash)。這是一串根據檔案內容計算出的固定長度字串(雜湊值)。
- 下載後,你可以使用相應的工具(如
md5sum
、certutil
或其他校驗工具)計算該檔案的 MD5 值。 - 如果你計算出的 MD5 值與網站提供的值相符,表示檔案沒有被修改,確保了文件完整性。
- 如果不相符,可能表示檔案已損壞、被惡意篡改或下載過程出錯。
數據簽名與校驗
這與第一點類似,但多用於數據傳輸,確保資料在傳輸過程中沒有變更。例如:
- 透過 數位簽名(Digital Signature),發送端使用私鑰加密數據的雜湊值,接收端可用公鑰驗證,確保數據未被修改。
- 透過 校驗碼(Checksum) 或 雜湊驗證(Hash Verification),發送端計算數據的雜湊值,接收端重新計算並比對,以確保資料完整性。
這種技術常見於網路通信、安全通訊協議(如 HTTPS)、區塊鏈、電子文件驗證等,確保數據在傳輸過程中未被竄改或遭受攻擊。
MD5 為什麼不安全?
雖然 MD5 曾經廣泛使用,但現在已經不建議用於安全性相關的應用,因為它有以下嚴重缺陷:
易被破解(碰撞攻擊)
MD5 的雜湊值固定為 128 位元,對現代計算機來說,可以透過「彩虹表(Rainbow Table)」或「暴力破解」來還原原始數據。
例如,攻擊者可以使用現成的 MD5 資料庫,輸入一個已知的 MD5 值,就能查到對應的原始密碼。
碰撞攻擊(Collision Attack)
碰撞攻擊指的是兩個不同的輸入能夠產生相同的 MD5 雜湊值,這表示 MD5 不能保證唯一性,導致簽名驗證等應用變得不可靠。
2004 年,研究人員首次證明了 MD5 存在碰撞攻擊,之後的研究進一步顯示,駭客可以輕易偽造 MD5 雜湊值,讓惡意文件偽裝成合法文件。
無法抵抗現代計算能力
現今的 GPU、FPGA、甚至量子計算技術可以極速破解 MD5,駭客可輕易使用 Hashcat、John the Ripper 等工具來暴力破解 MD5 雜湊值。
現代替代方案
由於 MD5 已經不安全,現代系統應該使用更強的加密演算法,如:
✅ SHA-256(Secure Hash Algorithm 256-bit)
- 目前廣泛使用的安全雜湊演算法,適用於數據驗證與數字簽名。
✅ bcrypt、PBKDF2、Argon2
- 這些演算法專門用於密碼儲存,並且內建「加鹽(Salt)」機制,可以防止彩虹表攻擊。
補充:加鹽(Salt)是什麼?
加鹽(Salt) 是在儲存密碼時,為每個密碼額外增加一段隨機字串,以增強安全性。
當使用者設定密碼時,系統會:
- 產生一個隨機字串(Salt),並將其附加在密碼前或後。
- 使用安全的雜湊演算法(如 bcrypt、PBKDF2、Argon2),將「密碼 + Salt」一起進行雜湊計算,產生雜湊值(Hash)。
- 儲存這個雜湊值和 Salt(而不是存原始密碼)。
當使用者登入時:
- 伺服器取出該使用者的 Salt,與輸入的密碼結合後,再次計算雜湊值。
- 若計算出的雜湊值與資料庫中儲存的值相符,表示密碼正確,允許登入。
為什麼要加鹽?(防止彩虹表攻擊)
彩虹表攻擊(Rainbow Table Attack) 是一種利用預計算的密碼雜湊表來破解密碼的方法。
例如,攻擊者可能事先計算好常見密碼的雜湊值,然後對照資料庫中的雜湊值來反推出密碼。
✅ 加鹽的好處:
- 防止彩虹表攻擊:由於每個密碼的 Salt 都不同,即使兩個使用者設置相同的密碼,最終的雜湊值也不同,讓預計算的彩虹表失效。
- 增加破解難度:即使攻擊者獲得雜湊值,也無法直接比對,因為每次雜湊的輸入都不同(因為 Salt 是隨機的)。
範例:加鹽 vs. 不加鹽
❌ 不加鹽(不安全)
假設有兩位使用者:
- Alice 的密碼:
password123
→ 雜湊後變成ef92b778…
- Bob 的密碼:
password123
→ 雜湊後也是ef92b778…
如果攻擊者知道
ef92b778…
代表password123
,就能破解所有使用相同密碼的帳戶。✅ 加鹽(安全)
假設 Alice 和 Bob 的 Salt 分別是
xyz123
和abc987
:
- Alice 的密碼(加鹽後):
password123xyz123
→ 雜湊後變成a7f3d9c1…
- Bob 的密碼(加鹽後):
password123abc987
→ 雜湊後變成5e6f8a4b…
即使他們的密碼相同,儲存的雜湊值仍然完全不同,因此攻擊者無法透過彩虹表輕易破解。
結論
MD5 早期被廣泛用於密碼儲存與數據驗證,但現在已經不再安全,主要原因是容易被暴力破解和發生碰撞攻擊。
因此,對於任何安全性要求較高的應用,應該使用更安全的雜湊演算法,如 SHA-256、bcrypt、Argon2 等。