雜湊函數為什麼不能還原?分清 MD5、SHA-256 的安全性
DDEVELOPER
開發發布: 5 分鐘閱讀

雜湊函數為什麼不能還原?分清 MD5、SHA-256 的安全性

SHA-256 等雜湊函數會將輸入資料轉成固定長度的雜湊值。它與加密不同,沒有可用來解密的金鑰。不過,這不代表別人無法猜出輸入內容。要理解「單向」的意思,必須先分清攻擊者已知什麼,以及想找出什麼。

日文原文發布: 2026-05-07

原像、第二原像與碰撞:三種不同的安全性要求

這三種抗性分別描述不同的攻擊目標:

  • 原像抗性(preimage resistance):已知一個雜湊值,難以找出能產生該值的輸入。
  • 第二原像抗性(second-preimage resistance):已知一份輸入,難以找出另一份不同、但雜湊值相同的輸入。
  • 碰撞抗性(collision resistance):難以找出任意兩份不同、但雜湊值相同的輸入;攻擊者可以自行選擇兩份輸入。

尋找碰撞時,攻擊者的選擇比「匹配指定雜湊值」更自由。即使是理想的 n 位元雜湊,受生日效應影響,一般碰撞搜尋所需的嘗試次數也約為 2^(n/2) 的量級。這是規模估算,不是保證成功的次數;實際強度仍取決於演算法、輸入長度與攻擊模型。

壓縮與雪崩效應,不等於能保護容易猜中的秘密

可能的長輸入比固定長度的雜湊值更多,因此必然有不同輸入對應到同一個值。但這個事實本身,無法證明替指定雜湊值找到輸入有多困難。輸入略有變動、輸出就大幅改變的「雪崩效應」,也不能單獨證明單向安全性。

四位數 PIN 碼從 0000 到 9999,只有 10,000 種候選值。攻擊者可以逐一計算並比對;即使沒有破解雜湊演算法,也可能猜出原本的輸入。

儲存密碼時,應使用具備鹽值(salt)與成本參數的專用密碼雜湊方案,而不是直接儲存單次 MD5 或 SHA 計算的結果。NIST 的密碼驗證指引要求密碼加鹽後以合適的方案處理,並透過成本參數提高每次猜測的計算成本。

MD5、SHA-1 的碰撞,與 SHA-2、SHA-3 的差異

MD5 已出現碰撞攻擊;RFC 6151 說明,數位簽章等需要碰撞抗性的用途不能再使用 MD5。SHAttered 研究也實際產生了兩份內容不同、SHA-1 值卻相同的 PDF。這些碰撞結果不等於能從任意雜湊值還原原始資料;反過來說,也不能只因原像攻擊很難,就判定受碰撞攻擊影響的舊簽章方式仍然安全。

SHA-256、SHA-384 與 SHA-512 都屬於 SHA-2 家族。SHA-384 與 SHA-512 使用不同的初始值,取出最終結果的方式也不同,因此 SHA-384 不是把 SHA-512 的結果直接截短。SHA-3 則是 FIPS 202 定義的另一套設計。NanToo 的雜湊產生器未提供 SHA-3。

選擇演算法時,應依用途與通訊協定的要求判斷,不能只看名稱中的數字大小。

比較雜湊值前,先確認輸入的位元組相同

雜湊函數處理的是位元組序列。雜湊產生器會將輸入欄中的文字編碼為 UTF-8,不會刪除前後空白,也不會進行 Unicode 正規化。輸入欄的換行使用 LF;這是文字雜湊工具,不是計算整個檔案檢查碼的工具。

SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("你好,世界!") = fa65d94b3532d83fd24ada92dadecfc7ae5370e6dbf762133027a89c2e7202f1

重現範例時,只輸入 hello 或 你好,世界!,不要包含引號或末尾換行。中文範例使用全形逗號「,」與驚嘆號「!」,換成半形符號就會改變輸入。空白、換行方式或 Unicode 字元序列不同,也可能得到不同的雜湊值。可參考 UTF-8 原理文章,分清字元數與位元組數。

十六進位小寫、十六進位大寫與 Base64,可以表示同一組雜湊位元組;改變顯示格式不會改變雜湊演算法。Base64 與 Base64url 文章進一步說明編碼格式與資料本身的差別。

雜湊值相同,本身不能證明資料來自誰。要防範惡意竄改,還需要透過可信管道取得預期雜湊值,或使用數位簽章、符合用途的驗證機制。

參考資料與來源

編輯說明

本文使用 AI 協助編輯,並於發布前由編輯確認。內容仍可能包含事實、解讀或時效上的錯誤;進行重要判斷前,請查閱所列的一手資料或官方文件。

相關工具

相關文章