跳到主要內容

← 返回部落格

MD5 還能用嗎?MD5 vs SHA-256 vs SHA-512 一次搞懂

雜湊函數能把任意大小的資料轉成固定長度的「指紋」。它無所不在 —— 檔案下載、密碼儲存、數位簽章、去重。但並非所有雜湊函數今天都還適合用。這篇比較 MD5、SHA-256 與 SHA-512,並說明如何正確使用。

同一個輸入,三種長度。 hello 丟進雜湊產生器:

MD5      5d41402abc4b2a76b9719d911017c592                                  (32 個十六進位字元 = 128 位元)
SHA-1    aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d                          (40 = 160 位元)
SHA-256  2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824  (64 = 256 位元)

同一個演算法不論輸入多長,雜湊值長度都一樣 —— 這正是它們能當指紋用的原因。但長度不是安全的重點:MD5 與 SHA-1 都已有可實用的碰撞攻擊,SHA-256 還沒有。把上面任何一行複製到別的工具,應該得到一模一樣的結果。

雜湊是什麼(不是什麼)

密碼學雜湊是單向函數:給定輸出,你無法反推輸入。同一輸入永遠得到相同輸出,而改動一個字元就會讓結果完全不同。這正是雜湊用於完整性校驗與密碼儲存的原因 —— 你比對的是指紋,而非原始資料。

雜湊不是加密(沒有金鑰、無法解密),也不是編碼(像 Base64 那樣任何人都能還原)。

為什麼 MD5 被視為不安全

MD5 產生 128 位元雜湊,曾經無所不在。問題在於碰撞 —— 不同輸入產生相同雜湊。研究者多年來已能廉價地製造 MD5 碰撞,這代表 MD5 無法再保證完整性:攻擊者可能製造一個與正常檔案有相同 MD5 的惡意檔案。

因此,MD5(以及較舊的 SHA-1)不應用於資安用途。我們的 Hash 產生器仍會把 MD5、SHA-1 和 SHA-2 系列一起算出來——正是為了讓你並排比較,親眼看出為什麼舊演算法只適合用在檔案校驗這類非資安場合。

SHA-256 vs SHA-512

兩者都屬於 SHA-2 家族,今天都被視為安全。差別在於:

  • SHA-256 產生 256 位元(64 個十六進位字元)雜湊。最廣泛使用,是很好的預設值。
  • SHA-512 產生 512 位元(128 個十六進位字元)雜湊。輸出更長,在 64 位元硬體上甚至可能更快。

對大多數用途 —— 檔案校驗、完整性檢查、一般指紋 —— SHA-256 是合理的預設。當某個標準或協定要求更長的摘要時,才選 SHA-512。

每個名字裡的數字就是摘要的位元長度,一個輸入就能讓它變具體。下面四個都是 hello 這個字,由我們自己的雜湊產生器在你的瀏覽器裡算出來的:

MD5      5d41402abc4b2a76b9719d911017c592  (32 個十六進位字元 / 128 bits)
SHA-1    aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d  (40 個十六進位字元 / 160 bits)
SHA-256  2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824  (64 個十六進位字元 / 256 bits)
SHA-512  9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043  (128 個十六進位字元 / 512 bits)

現在只把輸入的第一個字母改成大寫。Hello 的 SHA-256 是 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969,和上面 hello 那一串沒有任何共同之處 —— 但長度一模一樣。換成一支兩小時的影片檔,這四個長度還是完全一樣。輸出長度固定、與輸入大小無關,這才是雜湊之所以是雜湊;這四個之間的選擇只關乎「那個輸出有多難被偽造」。

儲存密碼的正確方式

重點來了:你不該用單純雜湊儲存密碼,連 SHA-256 也不行。快速雜湊在現代硬體上容易被暴力破解。應改用專為密碼設計、刻意放慢並加鹽的演算法,例如 bcryptscryptArgon2。它們為每個密碼加上獨特的隨機鹽(salt),並有可調整的工作量以抵抗破解。

所以口訣:

  • 檔案完整性 / 指紋 → SHA-256(或 SHA-512)。
  • 密碼儲存 → 加鹽的 bcrypt / scrypt / Argon2 —— 絕不用裸的 SHA 雜湊。

換更強的演算法救不了密碼儲存。password 的 SHA-256 是 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 —— 這個值和它的 MD5 一樣公開,因為快的雜湊對攻擊者也一樣快。密碼儲存需要的是刻意的函式(bcrypt、scrypt、Argon2)加上每個使用者各自的鹽。摘要長度跟這個問題無關。

校驗下載檔案

雜湊一個常見且正當的用途,是確認下載的檔案沒被損壞或竄改。發布者列出檔案的 SHA-256;你算出自己那份的雜湊再比對。相符,檔案就是完整的。

你可以用我們免費的 Hash 產生器在瀏覽器計算 SHA-256、SHA-384 與 SHA-512 —— 它使用原生 Web Crypto API,輸入不外傳。