雜湊函數能把任意大小的資料轉成固定長度的「指紋」。它無所不在 —— 檔案下載、密碼儲存、數位簽章、去重。但並非所有雜湊函數今天都還適合用。這篇比較 MD5、SHA-256 與 SHA-512,並說明如何正確使用。
雜湊是什麼(不是什麼)
密碼學雜湊是單向函數:給定輸出,你無法反推輸入。同一輸入永遠得到相同輸出,而改動一個字元就會讓結果完全不同。這正是雜湊用於完整性校驗與密碼儲存的原因 —— 你比對的是指紋,而非原始資料。
雜湊不是加密(沒有金鑰、無法解密),也不是編碼(像 Base64 那樣任何人都能還原)。
為什麼 MD5 被視為不安全
MD5 產生 128 位元雜湊,曾經無所不在。問題在於碰撞 —— 不同輸入產生相同雜湊。研究者多年來已能廉價地製造 MD5 碰撞,這代表 MD5 無法再保證完整性:攻擊者可能製造一個與正常檔案有相同 MD5 的惡意檔案。
因此,MD5(以及較舊的 SHA-1)不應用於資安用途。事實上,瀏覽器內建的 Web Crypto API 根本不提供 MD5。我們的 Hash 產生器基於同樣理由只支援 SHA-2 系列。
SHA-256 vs SHA-512
兩者都屬於 SHA-2 家族,今天都被視為安全。差別在於:
- SHA-256 產生 256 位元(64 個十六進位字元)雜湊。最廣泛使用,是很好的預設值。
- SHA-512 產生 512 位元(128 個十六進位字元)雜湊。輸出更長,在 64 位元硬體上甚至可能更快。
對大多數用途 —— 檔案校驗、完整性檢查、一般指紋 —— SHA-256 是合理的預設。當某個標準或協定要求更長的摘要時,才選 SHA-512。
儲存密碼的正確方式
重點來了:你不該用單純雜湊儲存密碼,連 SHA-256 也不行。快速雜湊在現代硬體上容易被暴力破解。應改用專為密碼設計、刻意放慢並加鹽的演算法,例如 bcrypt、scrypt 或 Argon2。它們為每個密碼加上獨特的隨機鹽(salt),並有可調整的工作量以抵抗破解。
所以口訣:
- 檔案完整性 / 指紋 → SHA-256(或 SHA-512)。
- 密碼儲存 → 加鹽的 bcrypt / scrypt / Argon2 —— 絕不用裸的 SHA 雜湊。
校驗下載檔案
雜湊一個常見且正當的用途,是確認下載的檔案沒被損壞或竄改。發布者列出檔案的 SHA-256;你算出自己那份的雜湊再比對。相符,檔案就是完整的。
你可以用我們免費的 Hash 產生器在瀏覽器計算 SHA-256、SHA-384 與 SHA-512 —— 它使用原生 Web Crypto API,輸入不外傳。