Hash 加密完全指南:MD5、SHA-1、SHA-256 到底差在哪?

管管
教學文章 技術分享

在網路安全的世界裡,Hash(雜湊)是最基礎卻也最重要的概念之一。無論你是開發者、資安人員,還是只是想保護自己密碼的一般用戶,理解 Hash 的原理和應用都至關重要。

本文將深入淺出地解析各種 Hash 演算法的差異、安全性比較,以及實際應用場景,讓你一次搞懂這個看似複雜的技術。

什麼是 Hash?

Hash(雜湊)是一種單向加密函數,它能將任意長度的輸入資料,轉換成固定長度的輸出值。這個輸出值就稱為「雜湊值」或「摘要」(Digest)。

Hash 的三大特性

1. 單向性(One-way)

Hash 只能從原文算出雜湊值,無法從雜湊值反推原文。這就像把一本書放進碎紙機——你可以輕鬆把書變成碎片,但幾乎不可能從碎片還原成書。

2. 固定長度輸出

不管輸入是一個字元還是一整部電影,輸出的 Hash 值長度都是固定的。例如 SHA-256 永遠輸出 256 位元(64 個十六進位字元)。

3. 雪崩效應(Avalanche Effect)

只要輸入有一丁點改變,輸出就會完全不同。例如:

"Hello"  → 185f8db32271fe25f561a6fc938b2e26 (MD5)
"hello"  → 5d41402abc4b2a76b9719d911017c592 (MD5)

只是大小寫不同,Hash 值就天差地遠。

主流 Hash 演算法比較

MD5(Message Digest 5)

基本資訊

  • 輸出長度:128 位元(32 個十六進位字元)
  • 發布年份:1991 年
  • 設計者:Ronald Rivest

安全性評估:❌ 已不安全

MD5 曾經是最流行的 Hash 演算法,但在 2004 年被證明存在碰撞漏洞。所謂「碰撞」是指兩個不同的輸入產生相同的 Hash 值——這對密碼學來說是致命傷。

2008 年,研究人員甚至用 MD5 的漏洞偽造了 SSL 憑證。現在,MD5 已經被認為完全不適合用於安全用途。

現在還能用 MD5 嗎?

可以,但只適合用於:

  • 檔案完整性快速檢查(非安全場景)
  • 資料庫分片(Sharding)的 Key 分配
  • 快取 Key 生成

絕對不要用於:密碼儲存、數位簽章、任何安全相關用途。

SHA-1(Secure Hash Algorithm 1)

基本資訊

  • 輸出長度:160 位元(40 個十六進位字元)
  • 發布年份:1995 年
  • 設計者:美國國家安全局(NSA)

安全性評估:⚠️ 已棄用

SHA-1 比 MD5 安全一些,但在 2017 年被 Google 和 CWI 研究院成功實現碰撞攻擊(SHAttered 攻擊)。他們創造了兩個內容不同但 SHA-1 值相同的 PDF 檔案。

現在各大瀏覽器已經不信任使用 SHA-1 簽章的 SSL 憑證,Git 也在逐步遷移到 SHA-256。

SHA-256(SHA-2 家族)

基本資訊

  • 輸出長度:256 位元(64 個十六進位字元)
  • 發布年份:2001 年
  • 設計者:美國國家安全局(NSA)

安全性評估:✅ 目前安全

SHA-256 是目前最廣泛使用的安全 Hash 演算法。比特幣的挖礦機制就是基於 SHA-256,這間接證明了它的安全性——全球礦工投入了天文數字的算力,至今沒人能破解它。

SHA-2 家族還包括 SHA-224、SHA-384、SHA-512 等變體,數字代表輸出的位元長度。

SHA-3

基本資訊

  • 輸出長度:可變(224/256/384/512 位元)
  • 發布年份:2015 年
  • 設計者:Guido Bertoni 等人(Keccak 團隊)

安全性評估:✅ 非常安全

SHA-3 是為了應對「萬一 SHA-2 被破解」而設計的備案。它採用完全不同的內部結構(Sponge Construction),即使 SHA-2 出問題,SHA-3 也不會受影響。

各演算法速度比較

在同一台機器上處理相同資料,各演算法的相對速度大致如下:

演算法相對速度安全性
MD5⚡⚡⚡⚡⚡ 最快❌ 已破解
SHA-1⚡⚡⚡⚡ 快⚠️ 已棄用
SHA-256⚡⚡⚡ 中等✅ 安全
SHA-512⚡⚡ 較慢✅ 更安全
SHA-3⚡⚡ 較慢✅ 最安全

注意:對於密碼儲存來說,「慢」反而是優點!

密碼儲存的正確姿勢

直接用 SHA-256 存密碼安全嗎?不夠安全!

為什麼單純 Hash 不夠?

  1. 彩虹表攻擊:攻擊者可以預先計算常見密碼的 Hash 值,建立對照表。
  2. 暴力破解:現代 GPU 每秒可以計算數十億次 SHA-256。

解決方案:Salt + 慢速 Hash

Salt(鹽值)

在密碼前後加上隨機字串,讓相同密碼產生不同 Hash:

password: "123456"
salt: "x7Km9pQ2"
實際 Hash: SHA256("x7Km9pQ2" + "123456" + "x7Km9pQ2")

這樣即使兩個用戶使用相同密碼,資料庫裡的 Hash 值也完全不同。

慢速 Hash 演算法

專門為密碼設計的演算法,刻意讓計算變慢:

演算法特點推薦度
bcrypt經典、廣泛支援⭐⭐⭐⭐
scrypt記憶體密集、抗 ASIC⭐⭐⭐⭐
Argon2最新標準、可調參數⭐⭐⭐⭐⭐

實際應用場景

1. 檔案完整性驗證

下載軟體時,官網通常會提供 SHA-256 校驗碼。你可以用它確認下載的檔案沒有被篡改:

# macOS / Linux
shasum -a 256 downloaded-file.zip

# Windows PowerShell
Get-FileHash downloaded-file.zip -Algorithm SHA256

2. Git 版本控制

Git 使用 SHA-1(正在遷移到 SHA-256)來識別每個 commit。那串看起來像亂碼的 commit ID,其實就是該 commit 內容的 Hash 值。

3. 區塊鏈

比特幣的工作量證明(Proof of Work)要求礦工找到一個讓 Block Header 的 SHA-256 值小於目標值的 Nonce。這個過程需要大量計算,確保了區塊鏈的安全性。

4. 數位簽章

簽署文件時,實際上是對文件的 Hash 值進行加密,而不是整個文件。這大幅提升了效率。

5. API 認證

許多 API 使用 HMAC-SHA256 來驗證請求的合法性。這結合了 Hash 和密鑰,確保請求沒有被篡改。

常見問題解答

Q: MD5 還能用嗎?

A: 看用途。檔案快速比對、快取 Key?可以。密碼、安全驗證?絕對不行。

Q: SHA-256 和 SHA-512 哪個更安全?

A: SHA-512 理論上更安全,但 SHA-256 對現有威脅已經足夠。選擇時可以考慮效能需求。

Q: 聽說量子電腦會破解 Hash?

A: 量子電腦對 Hash 的威脅比對稱加密小。Grover 演算法可以加速搜尋,但只是「開根號」的加速,把 SHA-256 的安全性降到約 SHA-128 的水準,仍然是安全的。

Q: 我該選哪個演算法?

A:

  • 一般安全用途:SHA-256
  • 密碼儲存:Argon2id 或 bcrypt
  • 需要極高安全性:SHA-3 或 SHA-512
  • 非安全用途(快取、分片):MD5 或 xxHash

結語

Hash 演算法是數位世界安全的基石。雖然 MD5 和 SHA-1 已經成為歷史,但 SHA-256 家族仍然堅守著我們的數位安全。

記住幾個關鍵原則:

  1. 永遠不要用 MD5/SHA-1 做安全用途
  2. 密碼儲存要用專門的慢速 Hash + Salt
  3. SHA-256 是目前的黃金標準
  4. 保持關注密碼學的最新發展

現在就去檢查一下你的系統,看看有沒有還在用 MD5 存密碼的老舊程式碼吧!