雜湊是什麼
雜湊函式(hash function)讀進一份資料,輸出一段固定長度的值,叫做雜湊值或摘要(digest)。它有三個特性:
- 同樣的輸入,永遠得到同樣的輸出。
- 輸入改一點點,輸出幾乎全變。
- 從輸出推不回輸入。這是單向的,所以雜湊不是加密,也沒有「解密」。
本工具提供兩種演算法:
| 演算法 | 輸出長度 | 十六進位字數 | 現在還能用在哪 |
|---|---|---|---|
| MD5(RFC 1321) | 128 位元 | 32 字 | 只適合檢查意外損壞、快取鍵、去重複。不適合任何安全用途。 |
| SHA-256(FIPS 180-4) | 256 位元 | 64 字 | 檔案完整性、數位簽章的一部分、內容定址。目前仍被視為安全。 |
MD5 已經不安全。 研究者已能刻意做出兩份不同、但 MD5 相同的檔案(碰撞)。RFC 6151 明寫:需要抗碰撞的場合(例如數位簽章),MD5 已不可接受。
不要拿 MD5(也不要拿單純的 SHA-256)存密碼。 這兩種演算法都設計成「算得很快」,攻擊者每秒能猜非常多次。存密碼請用專門的密碼雜湊,例如 Argon2id、bcrypt、scrypt。OWASP 密碼儲存指南建議優先用 Argon2id;舊系統用 bcrypt 時,工作因子至少 10。
使用情境
- 確認下載的檔案沒被改過、沒有損壞。 軟體官網常公布 SHA-256 值。把下載的檔案拖進來,比對兩串字是否完全相同。
- 比對兩份資料是否完全一樣。 兩個大檔案或兩段長文字,比雜湊值比逐字比對快。雜湊不同,內容一定不同。
- 除錯 API 簽章或快取鍵。 很多系統用雜湊值當快取鍵或 ETag。輸入同一段字,看自己的程式算出的值和工具是否一致,就能找出多了換行或編碼不同的問題。
範例
文字一律先轉成 UTF-8 位元組再計算。
| 輸入 | MD5 | SHA-256 |
|---|---|---|
abc | 900150983cd24fb0d6963f7d28e17f72 | ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad |
hello | 5d41402abc4b2a76b9719d911017c592 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
hello 加一個換行 | b1946ac92492d2347c6235b4d2611184 | 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 |
Hello(大寫 H) | 8b1a9953c4611296a827abf8c47804d7 | 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 |
| 空字串 | d41d8cd98f00b204e9800998ecf8427e | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
abc 的兩個值是公開的標準測試值:MD5 見 RFC 1321 附錄 A.5,SHA-256 見 RFC 6234 第 8.5 節。可以用來確認你的程式算得對不對。
常見錯誤
- 用 MD5 或 SHA-256 存密碼。 這是最嚴重的錯誤。資料庫外洩後,常見密碼的雜湊值可以用預先算好的表直接查出原文。請改用 Argon2id 或 bcrypt,它們會自動加鹽(salt,每個使用者不同的隨機值)並刻意算得慢。
- 多了一個換行。 在終端機用
echo "hello" | md5算,echo會在結尾加換行,結果是hello\n的值,不是hello的值。上面範例表第 2、3 行就是這個差別。 - 大小寫或前後空白不同。
Hello和hello的雜湊完全不同。從網頁複製時,前後常夾帶空白。 - 文字編碼不同。 同一個中文字,UTF-8 和 Big5 的位元組不同,雜湊也不同。本工具一律用 UTF-8。
- 以為雜湊可以「解密」。 雜湊是單向的,沒有解密。網路上所謂的「MD5 解密」,其實是拿常見字串的雜湊表去比對,只對弱密碼有效。這也正是不能用 MD5 存密碼的原因。
常見問題(FAQ)
- MD5 還能用嗎?
- 可以用在非安全用途,例如檢查檔案是否意外損壞、當快取鍵。不要用在任何需要防範攻擊者的地方,包括密碼、數位簽章、驗證檔案沒被惡意竄改。這些情況請用 SHA-256 或更新的演算法。
- 存密碼要用什麼?
- 用專門的密碼雜湊:Argon2id、bcrypt、scrypt。OWASP 建議優先用 Argon2id。不要用 MD5、SHA-1,也不要用單純的 SHA-256,它們都太快,容易被大量猜測。
- 雜湊可以還原成原文嗎?
- 不行。雜湊是單向函式,不是加密,沒有金鑰也沒有解密。只能拿猜測的原文去算,再比對結果是否相同。
- 為什麼我算的值和工具不一樣?
- 最常見的原因是輸入不完全相同:結尾多了換行、前後有空白、大小寫不同,或用了非 UTF-8 的編碼。先確認輸入的每個位元組都一樣。
- 我上傳的檔案會被送到伺服器嗎?
- 不會。檔案只在你的瀏覽器裡讀取與計算,不會上傳。SHA-256 使用瀏覽器內建的 Web Crypto 功能計算。
來源(查核日期 2026-10-21)
- RFC 1321〈The MD5 Message-Digest Algorithm〉:MD5 輸出 128 位元摘要;附錄 A.5 測試值:https://www.rfc-editor.org/rfc/rfc1321
- RFC 6151〈Updated Security Considerations for MD5〉:需要抗碰撞時,MD5 已不可接受:https://www.rfc-editor.org/rfc/rfc6151
- NIST FIPS 180-4〈Secure Hash Standard〉:SHA-256 定義:https://csrc.nist.gov/pubs/fips/180-4/upd1/final
- RFC 6234〈US Secure Hash Algorithms〉第 8.5 節:SHA-256 測試值(含
abc):https://www.rfc-editor.org/rfc/rfc6234 - OWASP〈Password Storage Cheat Sheet〉:密碼用 Argon2id;舊系統用 bcrypt 時工作因子 10 以上、密碼上限 72 位元組;MD5 與 SHA-1 設計上很快,不適合存密碼:https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
- MDN〈SubtleCrypto: digest()〉:瀏覽器內建 SHA-256:https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
- 本頁 MD5 程式:依 RFC 1321 第 3 節演算法,由 KeepOnFirst 自行實作,沒有使用第三方程式碼,所以沒有第三方授權條款。測試用 RFC 1321 附錄 A.5 的 7 組測試值。