開發者工具

HMAC 產生器

用密鑰為訊息簽名,不會傳輸任何資料。

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 在您的瀏覽器中完成。