
雜湊的「不可逆」是甚麼意思?分清 MD5 與 SHA 的安全性
SHA-256 等雜湊函數會把輸入資料轉成固定長度的雜湊值。雜湊並非加密,沒有可供解密的密鑰;但這不表示別人無法猜出輸入內容。理解「不可逆」之前,要先分清攻擊者已知甚麼,以及試圖找出甚麼。
日文原文發布: 2026-05-07
原像、第二原像及碰撞:攻擊者要找的是甚麼?
三種抗性對應不同的攻擊目標:
- 原像抗性(preimage resistance):已知一個雜湊值,難以找出能產生該值的輸入。
- 第二原像抗性(second-preimage resistance):已知一份輸入,難以找出另一份不同、但雜湊值相同的輸入。
- 碰撞抗性(collision resistance):難以找出任何兩份不同、但雜湊值相同的輸入;攻擊者可以自行選擇兩份輸入。
搜尋碰撞時,攻擊者不用配對預先指定的雜湊值,選擇較自由。即使是理想的 n 位元(bit)雜湊,受生日效應影響,一般碰撞搜尋所需的嘗試次數亦約為 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。
選用演算法時,應按用途及通訊協定的規格判斷,不能只比較名稱中的數字大小。
比較文字雜湊值,先核對輸入的位元組
雜湊處理的是位元組(byte)序列。雜湊產生器把輸入欄內的文字編碼成 UTF-8,不會移除前後空白,亦不會進行 Unicode 正規化。輸入欄的換行使用 LF。這是文字雜湊工具,並非用來計算整個檔案檢查碼。
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("香港,你好!") = 65f89f6788c904599a1ba057a87d7fcd41fcd23dac06ec53e8c05eb671be8f52
重現以上結果,只需輸入 hello 或 香港,你好!,不要加入引號或末尾換行。中文例子使用全形逗號「,」及感嘆號「!」,改用半形標點會改變輸入。空白、換行方式或 Unicode 字元序列不同,亦可能得出不同的雜湊值。UTF-8 原理文章可協助分辨字元數與位元組數。
十六進制小寫、十六進制大寫及 Base64,可用來表示同一組雜湊位元組。切換顯示格式並不會改變雜湊演算法。Base64 與 Base64url 文章進一步解釋編碼格式與資料本身的分別。
即使雜湊值相同,也不能單憑這一點確認傳送者身分。要防範惡意竄改,須透過可信渠道取得預期雜湊值,或使用數碼簽署、符合用途的驗證機制。
參考資料及來源
編輯說明
本文使用 AI 協助編輯,並在發布前由編輯核對。內容仍可能包含事實、理解或時效上的錯誤;作出重要決定前,請查閱所列的一手資料或官方文件。

