HMAC 產生器
用密鑰為訊息簽名,不會傳輸任何資料。
- 在您的瀏覽器中執行 — 您的文字絕不會傳送到任何地方
- 免註冊、無額度限制,可隨您高興使用多少次
運作方式
HMAC 能同時證明兩件事:訊息未被竄改,以及產生它的一方持有共用密鑰。網路上大多數的 Webhook、API 請求與下載連結都是靠它來簽名。
與單純雜湊的差異,正是關鍵所在
任何人都能算出訊息的 SHA-256,所以單純的雜湊無法證明是誰製作的:改掉訊息、重新計算雜湊,沒有人能看出差別。HMAC 把密鑰納入計算,因此沒有密鑰就無法重新計算。這就是全部的重點,也是 Webhook 簽章使用 HMAC 而非雜湊的原因。
安全地驗證
在伺服器上檢查 HMAC 時,請使用恆定時間的函式進行比對:Node 中的 crypto.timingSafeEqual、PHP 中的 hash_equals。一般的 == 只要有兩個位元組不同就會立刻傳回,而其耗時會洩漏簽章有多少部分是正確的,只要有耐心就足以偽造簽章。這是真實存在的攻擊,並非只是理論。
哪種演算法
除非另有指定,否則請用 SHA-256。之所以包含 SHA-1,是因為許多較舊的 API 仍要求 HMAC-SHA-1,而 HMAC-SHA-1 並未像單純的 SHA-1 那樣被攻破,但新的用途也沒有理由選它。
十六進位或 Base64
純粹取決於對方預期的格式。十六進位的長度是兩倍、較易閱讀;Base64 較精簡,常見於 HTTP 標頭。同一個簽章會以兩種格式顯示。
您的密鑰只留在這裡
使用瀏覽器內建的 Web Crypto API 產生。密鑰與訊息絕不會傳送到任何地方,提供此類工具只有這樣才負責任,因為會上傳您密鑰的簽名工具,等於把密鑰要保護的東西拱手讓人。
HMAC 產生器常見問題
HMAC 與雜湊有什麼不同?
任何人都能重新計算雜湊值,但 HMAC 需要密鑰,因此能證明是誰產生的。
我應該使用哪種演算法?
除非 API 另有指定,否則請用 SHA-256。提供 SHA-1 是為了仍有此需求的舊系統。
我該使用十六進位還是 Base64?
依對方預期的格式而定。同一個簽章會同時顯示兩種格式。
為什麼比對必須是恆定時間?
一般的比對會在第一個不相符處提前結束,而耗時的差異會洩漏有多少部分是正確的,足以讓人偽造簽章。
我的密鑰會被傳送到任何地方嗎?
不會。所有運算都透過 Web Crypto API 在您的瀏覽器中完成。