知識 · 文字、資料與資安
MD5 與 SHA-256 有什麼不同?
簡答
MD5 和 SHA-256 都是雜湊函式,能把任何輸入轉成固定長度的指紋:MD5 是 128 位元,SHA-256 是 256 位元。MD5 在資安上已被攻破,攻擊者能製造出雜湊值相同的兩個不同檔案。SHA-256 目前沒有已知的實用攻擊,是數位簽章和完整性檢查的預設選擇。MD5 仍可用來偵測意外損毀,但兩者都不該直接用來儲存密碼。
開啟雜湊產生雜湊函式在做什麼
密碼學雜湊函式接受任意大小的輸入,回傳固定大小的摘要。相同輸入永遠得到相同摘要,改一個字元就會得到完全不同的摘要,而且摘要無法還原回輸入。
| 輸入 | MD5 | SHA-256 |
|---|---|---|
abc | 900150983cd24fb0d6963f7d28e17f72 | ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad |
| 空字串 | d41d8cd98f00b204e9800998ecf8427e | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
安全的雜湊必須抵擋三種攻擊:找出能產生指定摘要的輸入(原像攻擊)、找出與某個輸入摘要相同的另一個輸入(第二原像攻擊),以及找出任意兩個摘要相同的輸入(碰撞攻擊)。碰撞最容易;由於生日悖論,理想的 n 位元雜湊大約需要嘗試 2^(n/2) 次。
MD5、SHA-1、SHA-256 與 SHA-3 比較
| 演算法 | 摘要長度 | 十六進位長度 | 現況 |
|---|---|---|---|
| MD5(1992) | 128 位元 | 32 | 自 2004 年起可實際製造碰撞;資安上已破解 |
| SHA-1(1995) | 160 位元 | 40 | 2017 年首次公開碰撞;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。