JWT編碼器(生成與簽名)
根據Header和Payload的JSON,使用HS256、HS384或HS512生成HMAC簽名的JWT(JSON Web Token),全部在瀏覽器內完成。包括金鑰在內的輸入內容不會發送到伺服器。
支援的HMAC簽名演算法一覽
| 演算法 | 雜湊函式 | 簽名長度 | 說明 |
|---|---|---|---|
| HS256 | SHA-256 | 256位(32位元組) | 使用最廣泛的HMAC簽章,幾乎所有JWT函式庫都支援。需要注意的是,OpenID Connect ID權杖必須支援且預設使用的簽章演算法是公開金鑰方式的RS256,HS256只是可選演算法。 |
| HS384 | SHA-384 | 384位(48位元組) | 當需要比HS256更長的簽名以提升安全餘量時可選用的中間選項。 |
| HS512 | SHA-512 | 512位(64位元組) | 簽名長度最長,通常與足夠長的隨機金鑰搭配使用。 |
產生並簽署 JWT
本工具由標頭與酬載的 JSON 當場組裝出 JWT,並以 HS256、HS384 或 HS512 施加 HMAC 簽章。包括密鑰在內,您輸入的一切都只在瀏覽器內處理,絕不送往伺服器。
這裡最常被誤解的一點是:簽章是為了察覺竄改,而非加密。 JWT 的標頭與酬載只是經過 Base64URL 編碼,因此凡是拿到權杖的人,都能把裡頭的內容照原樣讀出來。 密碼與個人資料不該放進酬載,正是這個緣故。另一個要點在於密鑰的性質:HS 系列的做法是簽署的一方與驗證的一方共用同一把密鑰。若想把驗證交給別處,便該選 RS256 或 ES256 這類公鑰方式,從而免去把密鑰交出去。
產生的步驟
-
輸入標頭的 JSON
形如
{"alg":"HS256","typ":"JWT"},請與所選的演算法保持一致。 -
輸入酬載的 JSON
寫上所需的宣告,如
sub、iat、exp。凡是想保密的值,一概不要放進來。 - 選擇簽章演算法 可在 HS256、HS384、HS512 之間選擇,數字即雜湊的位元長度。
- 輸入密鑰取得權杖 得到的是以點連接三段的字串。
用好本工具的小技巧
- 生成的JWT僅通過瀏覽器內的Web Crypto API簽名,包含金鑰在內的輸入內容不會發送到toolbase.cc的伺服器。
- 切換籤名演算法(HS256/HS384/HS512)會自動更新Header JSON中的
alg欄位。若需新增kid(金鑰ID)等其他標頭參數,可直接編輯Header。 - 本工具僅支援HMAC(對稱金鑰)方式。如需RS256、ES256等公鑰方式的簽名,請使用Node.js等伺服器端的庫。
- 編輯Header或Payload後,請務必再次點選"生成JWT",否則顯示的仍是編輯前內容生成的舊JWT。
- 如需立即確認生成的JWT內容,可將其貼上到姊妹工具JWT解碼器中檢視Header和Payload。
這些情境會用到
測試 API 的行為
能隨手鑄出帶有任意宣告的權杖,便可迅速把授權規則的各個分支都走一遍。
檢驗有效期的處置
造一個 exp 落在過去的權杖,確認過期的權杖確實會被擋下。
為測試準備權杖
可產出內容固定的權杖,充作自動化測試裡的夾具。
學習 JWT 的構造
一面改動輸入一面產生,便能眼看著每一部分落到權杖的哪個位置。
JWT 的術語
- 標頭
- 第一段,說明演算法與類別,帶有
alg與typ。 - 酬載
- 第二段,收納各項宣告。它僅僅經過 Base64URL 編碼,並未加密。
- 簽章
- 第三段,由標頭與酬載連同密鑰算出。它用來察覺竄改,對隱藏內容則毫無作用。
- 宣告
- 酬載中的每一項。標準的有
sub(主體)、iat(簽發時刻)、exp(有效期)等。 - HMAC
- 使用共享密鑰的訊息驗證方式。簽署的一方與驗證的一方必須持有同一把密鑰。
- Base64URL
- 把符號換過、以便放進網址的 Base64:
+與/換作-與_,末尾的填補也略去。
常見問題
alg欄位的值不一致,其他實現在驗證該JWT時可能會報錯,因此請務必保持兩者一致。
閒話 ― 為什麼JWT的簽名可以「僅在瀏覽器內」完成
JWT的簽名演算法大致分為兩類:傳送方和接收方共享同一金鑰的「對稱金鑰方式(HMAC,即HS256/HS384/HS512)」,以及用私鑰簽名、用公鑰驗證的「公鑰加密方式(RS256、ES256等)」。前者可以藉助W3C標準化的Web Crypto API(SubtleCrypto)中的crypto.subtle.sign(),無需任何外部庫即可在瀏覽器內完成計算,因此本工具刻意只支援HMAC方式。
HMAC簽名的安全性完全取決於金鑰是否難以被猜到,而與Header或Payload的內容無關。RFC 7518(JSON Web Algorithms)規定HS256必須(MUST)使用至少256位元(32位元組)的金鑰;若使用短單詞或字典中常見的字串作為金鑰,簽名就有被暴力破解偽造的風險。在實際生產環境中,應使用隨機數生成器生成的足夠長的隨機字串作為金鑰。
本工具是面向開發者的實用工具,主要用於API開發時的除錯或測試Webhook簽名驗證邏輯。您輸入的金鑰僅在瀏覽器記憶體中處理,不會向外部發送,但共享裝置或瀏覽器擴充套件收集剪貼簿或輸入內容的風險並非為零。強烈建議即使只是為了除錯,也不要將生產環境中實際使用的金鑰輸入此類工具。