ToolAct工具行動

MD5 雜湊生成工具

線上 MD5 加密,支援 16 位和 32 位輸出,大小寫轉換

輸入內容
字元數: 0
轉換結果
字元數: 0

格式設定

什麼是 MD5 加密?

MD5(Message Digest Algorithm 5,訊息摘要演算法第五版)是一種廣泛使用的密碼雜湊函數,由美國密碼學家羅納德·李維斯特於 1991 年設計。MD5 可以將任意長度的資料映射為固定 128 位(16 位元組)的雜湊值,通常表示為 32 個十六進位數字。 MD5 曾被廣泛用於資料完整性校驗、密碼儲存和數位簽章等場景。但由於 2004 年中國密碼學家王小雲團隊發現 MD5 存在碰撞漏洞,使得攻擊者可以構造兩個具有相同 MD5 值的不同資料,因此 MD5 已不再適合用於安全敏感場景。 MD5 輸出格式分為兩種:標準的 32 位(完整雜湊值)和截斷的 16 位(取 32 位值的中間 16 位)。本工具支援兩種格式輸出,並可選擇大寫或小寫顯示。

使用方式

何時使用

  1. 在輸入欄位中輸入要加密的文字
  2. 選擇輸出格式:大寫 32 位元、小寫 32 位元、大寫 16 位元或小寫 16 位元
  3. MD5 值會自動計算並顯示
  4. 點選「複製」按鈕複製結果

輸出格式說明

  • 需要用於校驗碼、快取鍵值或舊版 API 欄位的完整 MD5 摘要時,請使用 32 字元的輸出。
  • 僅在舊版系統明確要求完整摘要的中間 16 個字元時,才使用 16 字元的輸出。

大小寫說明

  • 大寫與小寫的 MD5 值包含相同的十六進位位元組,差異僅在於顯示格式。
  • 比對 MD5 值時,請完全符合目標系統的大小寫要求,以避免誤判為不相符。

使用場景

以常見 MD5 格式雜湊文字片段貼上一段字串,立即取得 32 字元或中間 16 字元格式的 MD5 摘要,並可選擇大寫或小寫輸出。這對應了許多舊版 API、快取鍵值和資料庫欄位仍在使用的格式。雜湊運算在瀏覽器內以標準 128 位元 MD5 壓縮完成,來源字串不會離開分頁——在重現內部舊系統的校驗碼時特別方便。
在偵錯時比對舊版簽章當舊系統要求特定 MD5 表示方式時,切換 lower32、upper32、lower16 和 upper16 有助於判斷不一致的是摘要本身還是輸出格式。輸入和輸出的字元計數能幫助發現意外的空白、尾端換行或 BOM 位元組——同一段 UTF-8 字串有無尾端 CRLF 會產生不同的摘要。
在本地處理敏感文字MD5 運算在瀏覽器中對 UTF-8 編碼的文字執行,因此內部識別碼、測試字串或臨時金鑰不需要貼到外部雜湊網站。MD5 在此用於相容性檢查,而非現代密碼儲存或強安全性場景——需要抗碰撞性時應選用 SHA-256。
從檔名或識別碼產生快取鍵值將檔名、URL slug 或組合鍵丟進輸入框,取得穩定的 32 字元摘要作為 Redis、Memcached 或 CDN 清除列表的快取鍵值。中間 16 字元格式也適用於儲存空間有限的舊版鍵值空間,代價是碰撞空間約為 2^16——對快取鍵值可接受,但不適合用於身份識別。
確認兩個系統之間的校驗碼一致性在本地對相同的資料進行雜湊,然後與舊版匯出、FTP 鏡像或韌體清單中的 MD5 進行比對。32 字元輸出完全一致表示位元組相同;任何不一致都指向編碼、換行(CRLF vs LF)、BOM 或文字編碼差異,值得在回報傳輸錯誤前先查明原因。

技術原理

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(不論有無加鹽)都不適合這個用途。