在網路安全的世界裡,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 不夠?
- 彩虹表攻擊:攻擊者可以預先計算常見密碼的 Hash 值,建立對照表。
- 暴力破解:現代 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 SHA2562. 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 家族仍然堅守著我們的數位安全。
記住幾個關鍵原則:
- 永遠不要用 MD5/SHA-1 做安全用途
- 密碼儲存要用專門的慢速 Hash + Salt
- SHA-256 是目前的黃金標準
- 保持關注密碼學的最新發展
現在就去檢查一下你的系統,看看有沒有還在用 MD5 存密碼的老舊程式碼吧!