HMAC 產生器
用金鑰計算訊息的 HMAC-SHA256、SHA-384、SHA-512、SHA-1 與 MD5,並可驗證 Webhook 或 API 簽章。
金鑰只在這個分頁的記憶體中使用,不會儲存或送出。
0 個字元 · 1 行
HMAC
計算中…計算中…計算中…計算中…計算中…HMAC-SHA1 與 HMAC-MD5 目前仍未被實際破解,但只建議用來對接舊系統;新系統請用 HMAC-SHA256 以上。
金鑰 0 B,訊息 0 B
伺服器驗證 HMAC 時應使用固定時間比對(例如 Node.js 的 crypto.timingSafeEqual),避免攻擊者從回應時間猜出簽章;在你自己的瀏覽器中比對沒有這個風險。
快捷鍵:Ctrl/⌘ + Enter 全部複製
使用說明
- 輸入金鑰,並選擇金鑰是一般文字(UTF-8)、十六進位或 Base64。
- 輸入訊息(例如 Webhook 的原始內容),HMAC-SHA256、SHA-384、SHA-512、SHA-1 與 MD5 會同時即時算出來。
- 選擇輸出格式:十六進位、Base64 或 JWT 使用的 Base64url。
- 要驗證收到的簽章時,把它貼到「驗證 HMAC」,就會顯示是否相符以及是哪一種演算法。
- 按「範例」載入 RFC 4231 的測試資料(金鑰 Jefe),可以和規格書的結果對照。
常見問題
我的金鑰會被上傳或儲存嗎?
不會。HMAC 是用瀏覽器內建的 Web Crypto 在你的裝置上計算,金鑰與訊息不會送到任何伺服器,也不會存進瀏覽器;關閉分頁就會消失。只有金鑰格式與輸出格式等選項會記在瀏覽器中。
HMAC 和一般雜湊(SHA-256)有什麼不同?
雜湊任何人都能算;HMAC 需要知道金鑰才能算出正確的值。收到訊息的一方用同一把金鑰重新計算並比對,就能確認訊息沒有被竄改、而且來自持有金鑰的人。GitHub、Stripe、LINE 等 Webhook 都用這種方式簽章。
為什麼我的結果和伺服器算的不一樣?
最常見的原因:訊息多了或少了結尾換行、JSON 被重新排版(必須用收到的原始內容)、金鑰其實是十六進位或 Base64 卻當成文字輸入,或兩邊的輸出格式不同(十六進位與 Base64)。有些服務還會在訊息前加上時間戳記,請對照它的文件。
比對簽章時要注意什麼?
在伺服器上請使用固定時間的比對函式(例如 Node.js 的 crypto.timingSafeEqual、Python 的 hmac.compare_digest),不要用 ==,否則攻擊者可能從回應時間逐步猜出正確簽章。在你自己的瀏覽器中比對沒有這個風險。
金鑰要多長?HMAC-SHA1 和 HMAC-MD5 還安全嗎?
RFC 2104 建議金鑰至少和輸出一樣長,例如 HMAC-SHA256 用 32 位元組以上的隨機值。HMAC-SHA1 與 HMAC-MD5 目前還沒有實際可行的攻擊,但只建議用在必須對接的舊系統;新系統請用 HMAC-SHA256 以上。