cv.cm

知識 · 文字、資料與資安

MD5 與 SHA-256 有什麼不同?

閱讀約 6 分鐘

簡答

MD5 和 SHA-256 都是雜湊函式,能把任何輸入轉成固定長度的指紋:MD5 是 128 位元,SHA-256 是 256 位元。MD5 在資安上已被攻破,攻擊者能製造出雜湊值相同的兩個不同檔案。SHA-256 目前沒有已知的實用攻擊,是數位簽章和完整性檢查的預設選擇。MD5 仍可用來偵測意外損毀,但兩者都不該直接用來儲存密碼。

開啟雜湊產生

雜湊函式在做什麼

密碼學雜湊函式接受任意大小的輸入,回傳固定大小的摘要。相同輸入永遠得到相同摘要,改一個字元就會得到完全不同的摘要,而且摘要無法還原回輸入。

輸入MD5SHA-256
abc900150983cd24fb0d6963f7d28e17f72ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
空字串d41d8cd98f00b204e9800998ecf8427ee3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

安全的雜湊必須抵擋三種攻擊:找出能產生指定摘要的輸入(原像攻擊)、找出與某個輸入摘要相同的另一個輸入(第二原像攻擊),以及找出任意兩個摘要相同的輸入(碰撞攻擊)。碰撞最容易;由於生日悖論,理想的 n 位元雜湊大約需要嘗試 2^(n/2) 次。

MD5、SHA-1、SHA-256 與 SHA-3 比較

演算法摘要長度十六進位長度現況
MD5(1992)128 位元32自 2004 年起可實際製造碰撞;資安上已破解
SHA-1(1995)160 位元402017 年首次公開碰撞;NIST 計畫在 2030 年前淘汰
SHA-256(SHA-2,2001)256 位元64安全;標準為 FIPS 180-4
SHA-512(SHA-2)512 位元128安全;在 64 位元 CPU 上常比 SHA-256 快
SHA3-256(2015)256 位元64安全;內部設計不同,標準為 FIPS 202

SHA-256 是 SHA-2 家族的一員。「SHA-2」和「SHA-256」常被混用,但 SHA-224、SHA-384 和 SHA-512 也都是 SHA-2 函式。

MD5 與 SHA-1 是怎麼被攻破的

2004 年,王小雲等人發表了只需數小時就能找到的 MD5 碰撞。後續研究做出了選擇前綴碰撞:攻擊者從兩個內容不同且有意義的檔案出發,不斷附加資料直到雜湊值相同。2008 年,研究人員利用這種手法偽造出一張惡意憑證授權單位的憑證;2012 年發現的 Flame 惡意程式,也利用 MD5 碰撞偽造了 Microsoft 的程式碼簽署憑證。RFC 6151 明定,在數位簽章等需要抗碰撞性的場合不得使用 MD5。

SHA-1 接著也倒下了。2017 年,Google 與阿姆斯特丹 CWI 的 SHAttered 計畫公開了兩個 SHA-1 雜湊值相同的不同 PDF 檔,2020 年又展示了 SHA-1 的選擇前綴碰撞。Git、TLS 憑證和程式碼簽署此後都已經或正在改用 SHA-256。

針對 MD5 的原像攻擊至今仍不實際。這裡說的「破解」,是指攻擊者能刻意製造出互相碰撞的檔案,而不是任何現有的 MD5 都能被反推。

MD5 何時還能用,何時不行

用途可以用 MD5 嗎?原因
偵測下載或複製過程中的意外損毀可以隨機的位元錯誤不會產生碰撞
自家系統內的去重或快取鍵通常可以只要攻擊者無法控制輸入就沒問題
驗證來自惡意鏡像站的下載檔不行攻擊者可以準備好碰撞檔案;請用 SHA-256
數位簽章與憑證不行碰撞攻擊能偽造簽章
儲存密碼不行計算太快;SHA-256 也一樣

如果可以選,就選 SHA-256。它到處都支援,在現代 CPU 上有硬體加速,也省得去爭論某個用途到底會不會受碰撞影響。

密碼需要慢速、加鹽的雜湊

通用雜湊函式的設計目標就是快。一張現代 GPU 每秒可以算出數十億個 MD5 或 SHA-256 雜湊值,所以外洩的未加鹽 SHA-256 密碼雜湊表,可以用龐大的字典檔來攻擊,而且相同的密碼會呈現相同的雜湊值。

密碼雜湊函式同時解決這兩個問題。它們為每位使用者加上獨一無二的隨機鹽值,讓相同密碼得到不同雜湊值;而且刻意設計得很慢,較新的設計還會大量消耗記憶體,讓 GPU 幾乎占不到便宜:

  • Argon2id:2015 年密碼雜湊競賽(Password Hashing Competition)的優勝者,通常是新系統的首選。
  • scrypt:消耗大量記憶體,支援廣泛。
  • bcrypt:已使用數十年;注意它只會讀取密碼的前 72 個位元組。
  • 高迭代次數的 PBKDF2:在要求使用 FIPS 驗證演算法的場合可以接受。

常見問題

MD5 雜湊可以解密嗎?

不行。雜湊不是加密,沒有可以反推的金鑰。網路上的「MD5 解密」工具,其實是到預先算好的常見字串雜湊表裡查詢,所以短的或常見的輸入很快就會被找到。

2026 年的 SHA-256 還安全嗎?

安全。目前沒有針對 SHA-256 的實用碰撞或原像攻擊,NIST 也持續核可它。它 2^128 的抗碰撞強度遠超過現有的運算能力。

為什麼網站還在提供 MD5 校驗碼?

它能抓出下載不完整或損毀的檔案,這才是常見的問題。至於防範遭竄改的檔案,只有校驗碼來自可信來源、而且使用 SHA-256 以上時才有幫助。

SHA-256 適合用來雜湊密碼嗎?

單獨使用不適合。它速度快,預設也不加鹽,外洩的雜湊值能以每秒數十億次的速度猜測破解。請改用 Argon2id、scrypt 或 bcrypt。

所有知識文章