MD5 雜湊生成工具
線上 MD5 加密,支援 16 位和 32 位輸出,大小寫轉換
格式設定
什麼是 MD5 加密?
MD5(Message Digest Algorithm 5,訊息摘要演算法第五版)是一種廣泛使用的密碼雜湊函數,由美國密碼學家羅納德·李維斯特於 1991 年設計。MD5 可以將任意長度的資料映射為固定 128 位(16 位元組)的雜湊值,通常表示為 32 個十六進位數字。 MD5 曾被廣泛用於資料完整性校驗、密碼儲存和數位簽章等場景。但由於 2004 年中國密碼學家王小雲團隊發現 MD5 存在碰撞漏洞,使得攻擊者可以構造兩個具有相同 MD5 值的不同資料,因此 MD5 已不再適合用於安全敏感場景。 MD5 輸出格式分為兩種:標準的 32 位(完整雜湊值)和截斷的 16 位(取 32 位值的中間 16 位)。本工具支援兩種格式輸出,並可選擇大寫或小寫顯示。
使用方式
何時使用
- 在輸入欄位中輸入要加密的文字
- 選擇輸出格式:大寫 32 位元、小寫 32 位元、大寫 16 位元或小寫 16 位元
- MD5 值會自動計算並顯示
- 點選「複製」按鈕複製結果
輸出格式說明
- 需要用於校驗碼、快取鍵值或舊版 API 欄位的完整 MD5 摘要時,請使用 32 字元的輸出。
- 僅在舊版系統明確要求完整摘要的中間 16 個字元時,才使用 16 字元的輸出。
大小寫說明
- 大寫與小寫的 MD5 值包含相同的十六進位位元組,差異僅在於顯示格式。
- 比對 MD5 值時,請完全符合目標系統的大小寫要求,以避免誤判為不相符。
使用場景
技術原理
MD5(訊息摘要演算法第五版)由 MIT 的 Ronald Rivest 於 1991 年設計並以 RFC 1321 發布,取代了已被攻破的 MD4。它是 1990 年代和 2000 年代的主力雜湊函數:檔案完整性檢查、密碼儲存(不加鹽,安全性差)、數位簽章、惡意軟體指紋識別,以及 `md5sum`、MySQL 的 `MD5()`、Git 舊版物件儲存、`openssl dgst -md5` 等各種工具的預設摘要。輸出為 128 位元(16 位元組),幾乎總是顯示為 32 個小寫十六進位字元。設計遵循 Merkle–Damgård 結構:將訊息填充至 512 位元的倍數,附加 64 位元小端序長度,然後對每個 512 位元區塊迭代壓縮函數。128 位元狀態暴露在四個 32 位元暫存器 A、B、C、D 中,初始化為固定常數(0x67452301、0xefcdab89、0x98badcfe、0x10325476——這些值被選為「袖中無物」值:它們分別是 2、3、5、10 的平方根的小端序表示)。 每個 512 位元區塊被分成十六個 32 位元字 M[0..15],經過 4 輪各 16 步(共 64 步)。輪函數為 F = (X AND Y) OR (NOT X AND Z)、G = (X AND Z) OR (Y AND NOT Z)、H = X XOR Y XOR Z、I = Y XOR (X OR NOT Z);每一步結合一個輪函數、一個訊息字、一個輪常數 T[i] = floor(2^32 · |sin(i+1)|) 和特定步數的左旋轉,然後將結果加回狀態。4 輪的設計意圖:第 1 輪快速且非線性,第 2 輪可平行化,第 3 輪混合更積極,第 4 輪以強擴散完成。最終狀態即為整段訊息的 MD5;這使 MD5 在量子計算之前是單向函數。 崩潰:抗碰撞性已被攻破,這是密碼學應用中唯一重要的事。王小雲等人在 2004 年發表了完整的碰撞攻擊(CFRG 攻擊將碰撞搜尋縮短到 PC 上數小時)。2008 年,研究者利用 MD5 碰撞偽造了有效的 CA 憑證(Stevens 等人的「選擇前綴碰撞」攻擊);2012 年,Flame 惡意軟體利用一個仍未公開的 MD5 碰撞偽造了 Microsoft 程式碼簽章憑證。2004 年的論文將碰撞搜尋空間從 2^64 縮減到約 2^24,因此任何擁有數小時運算能力的攻擊者都能產生兩個具有相同 MD5 的訊息。Flame 事件之後,Microsoft 在 Authenticode 中明確禁止了 MD5;瀏覽器在 2014-2017 年撤銷了 MD5 簽署的 TLS 憑證;IETF 早已在 TLS、SSH 和 IPsec 中棄用 MD5。 現代 x86-64 筆電的效能資料:MD5 每核心雜湊速度為 400-700 MB/s(大輸入時受記憶體頻寬限制),SHA-256 為 200-300 MB/s,SHA-512 在 64 位元 CPU 上因 64 位元字運算而更快。對於密碼雜湊,無論吞吐量如何 MD5 都不適合——bcrypt/scrypt/Argon2id 可調整參數以抵抗 GPU 加速。在單張 RTX 4090 上,Hashcat 對 MD5 的基準測試約為 60 GH/s(每秒十億次雜湊)——比同一 GPU 上的 SHA-256 快 7-8 倍。這個差距正是 MD5 危險的原因:GPU 能在數小時內而非數年內跑完預計算表。Web Crypto 的 `crypto.subtle.digest('MD5', bytes)` 在 Chrome、Edge 和 Firefox 102+ 中以接近磁碟速度運行;較舊的瀏覽器回退到純 JS 實作(SparkMD5 或頁面內建),速度為 50-150 MB/s。RFC 1321 測試向量:空字串雜湊為 d41d8cd98f00b204e9800998ecf8427e,'a' 為 0cc175b9c0f1b6a831c399e269772661,'abc' 為 900150983cd24fb0d6963f7d28e17f72。如果你的輸出不符,錯誤幾乎都是編碼問題(將 JS 字串直接傳給 JS MD5 實作而非 UTF-8 位元組)而非演算法本身。
- Merkle–Damgård 結構使 MD5 容易受到長度擴充攻擊:已知 H(secret || msg),攻擊者可以在不知道 secret 的情況下計算 H(secret || msg || padding || extra)。這就是為什麼 MD5(secret || message) 不是安全的 MAC——應改用 HMAC-MD5(RFC 2104)或 HMAC-SHA256,它們使用不同的結構(雙金鑰巢狀雜湊)來抵抗此類攻擊。
- 測試向量(RFC 1321):空字串雜湊為 d41d8cd98f00b204e9800998ecf8427e,'a' 為 0cc175b9c0f1b6a831c399e269772661,'abc' 為 900150983cd24fb0d6963f7d28e17f72。如果你的實作沒有產生這些值,錯誤幾乎都是編碼問題(將 JavaScript 字串直接傳給 JS MD5 實作,而非透過 TextEncoder 轉為 UTF-8 位元組),而非演算法本身。
- 雜湊速率:現代 x86-64 CPU 單核心約 400-700 MB/s 的 MD5 速度,大輸入時受記憶體頻寬限制。SHA-256 大約慢 30%,為 200-300 MB/s;SHA-512 在 64 位元 CPU 上更快,因為它操作 64 位元字。對於密碼雜湊,正確的選擇是 bcrypt(成本因子 12)/ scrypt / Argon2id,它們故意設計為慢速且可調整,以抵抗 GPU 加速。
- 「4 個輪函數」F、G、H、I 的命名刻意設計為可讀成一句話('FiGiHI' / 'figi hi'),是 Rivest 的簽名風格。每個函數都是純位元運算,使用不同的混合結構,使演算法在密碼分析下不會退化為線性或仿射系統。MD5 中不存在 DES / AES 的 S-box 概念;安全性來自訊息字擴充和旋轉常數,而非替換表。
- Hashcat 在單張 RTX 4090 上的基準測試:MD5 約 60 GH/s(純雜湊),加鹽 MD5 約 30 GH/s。同一 GPU 上 SHA-256 為 8 GH/s。7-8 倍的差距正是攻擊者偏好 MD5 的原因:GPU 能在數小時內跑完預計算表,而非數年。對於需要抵抗離線攻擊的場景,應使用 SHA-256、bcrypt 或 Argon2id。
- 「雙重 MD5」(MD5(MD5(x)))有時見於舊版 PHP 和 MySQL 程式碼,通常帶有鹽值。它對碰撞攻擊沒有幫助(MD5 的碰撞只需 O(1) 額外工作即可成為 MD5(MD5()) 的碰撞),對原像搜尋僅略有減緩(約 2 倍)。現代密碼雜湊(RFC 9106 的 Argon2id、RFC 7914 的 scrypt、成本 >= 12 的 bcrypt)是密碼儲存的唯一正確答案;如果你在現代密碼欄位中看到 MD5,那就是一個 bug。
- 從 MD5 遷移:如果你維護的系統目前使用 MD5,正確的遷移方式是雙寫(讀取時同時計算 MD5 和 SHA-256,新程式碼路徑優先使用 SHA-256)作為棄用過渡期,然後在沒有任何依賴後移除 MD5。對於硬性要求 MD5 的舊版協定(NTLM、RADIUS challenge-response、某些 Kerberos 模式),MD5 短期內不會消失——Microsoft 在 2010 年修補了 NTLM 以使用 AES,但舊版為了相容性仍預設啟用,如果你有舊版 Windows 系統應完全停用 NTLMv1。
- 頁面實作:當 Web Crypto 可用時(Chrome、Edge、Firefox 102+),使用 `crypto.subtle.digest('MD5', utf8Bytes)`,以原生程式碼接近磁碟速度運行。不可用時,使用純 JS 實作(SparkMD5 0.7 或頁面內建),速度為 50-150 MB/s。兩者產生相同的輸出,因此測試向量在兩個後端都能通過。編碼步驟為 `new TextEncoder().encode(str)`,始終產生 UTF-8 位元組;不要將 JavaScript 字串直接傳給純 JS 的 MD5 實作,否則任何非 ASCII 輸入都會產生錯誤的雜湊值。
範例
空字串與短文字
空字串 -> d41d8cd98f00b204e9800998ecf8427e
hello -> 5d41402abc4b2a76b9719d911017c592
RFC: RFC 1321 第 A.1 節定義了這些測試向量大小寫敏感性
hello world -> 5eb63bbbe01eeed093cb22bb8f5acdc3
Hello -> 8b1a9953c4611296a827abf8c47804d7
HELLO -> eb61eead90e3b899c6bcbe27ac581660
注意:改變單一字元就會完全改變雜湊值(雪崩效應)數字與標點符號
123456 -> e10adc3949ba59abbe56e057f20f883e
Hello, World! -> 65a8e27d8879283831b664bd8b7f0ad4
file.txt -> 3d8e577bddb17db339eae0b3d9bcf180
注意:標點符號或空白字元任何變動都會產生完全不同的摘要為何不建議用 MD5 做安全用途
碰撞攻擊: 2004 年研究人員找到方法可建立兩則具有相同 MD5
雜湊值的不同訊息。這破壞了數位簽章與
憑證驗證。
安全用途請改用 SHA-256 或 SHA-3:
MD5: 128 位元,碰撞抗性已被破解(攻擊可行)
SHA-256: 256 位元,尚未發現實務上的碰撞
SHA-512: 512 位元,安全餘裕更高
NIST: NIST 自 2005 年起已棄用 MD5 於密碼學用途
用途: MD5 用於檔案完整性檢查、去重與快取金鑰仍是安全的常見問題
什麼是 MD5?
MD5(Message Digest 5,RFC 1321)是 Ron Rivest 在 1991 年提出的 128 位元雜湊函式。無論輸入長度多少,輸出都是 32 個十六進位字元,而且只要輸入差一個位元,輸出就會完全不同。在現代 CPU 上速度可達每秒數百 MB。
MD5 安全嗎?
用於安全用途已不安全。MD5 的碰撞攻擊自 2004 年起就具備實用性,選定前綴碰撞自 2007 年起也已可行。請勿將 MD5 用於數位簽章、憑證雜湊、密碼儲存,或任何攻擊者能選擇輸入的防竄改情境。
那 MD5 還能拿來做什麼?
用於偵測非惡意的損壞:下載校驗碼、可信檔案的簡單去重、ETag 風格的快速指紋等等。許多廠商基於相容性仍會發布 MD5,通常會與 SHA-256 並列。
計算是在本機完成嗎?
是的。貼上文字計算 MD5 完全在你的瀏覽器中進行,不會上傳或紀錄。你可以打開 Network 分頁驗證一下。
為什麼同樣的字串在別處算出不同的 MD5?
幾乎都是隱藏字元差異造成的:UTF-8 BOM、結尾換行、CRLF 對 LF 的差異,或一個工具用 UTF-8 編碼而另一個用 UTF-16。MD5 演算法本身在所有實作中是完全確定性的。
大寫與小寫的 MD5 一樣嗎?
一樣。輸出的 128 位元完全相同,大小寫只是顯示慣例。比對時應該不分大小寫。
MD5 跟 MD5(salt + password) 有什麼差別?
把密碼直接做 MD5,用彩虹表很容易破解。加 salt 可以擋掉預先運算的彩虹表,但 MD5 本身對密碼雜湊來說還是太快了。密碼請用 bcrypt、scrypt 或 Argon2;MD5(不論有無加鹽)都不適合這個用途。