JWT簽名驗證工具(RS256/ES256,公鑰驗證)

一款開發者工具,可使用SPKI格式的公鑰(PEM)在瀏覽器中即時驗證以RS256或ES256簽名的JWT(JSON Web Token)。同時顯示解碼後的Header/Payload以及過期時間檢查結果。所有輸入內容僅在瀏覽器內處理,不會發送到伺服器。

支援的簽名演算法一覽

演算法 金鑰型別 雜湊函式 說明
RS256 RSA(RSASSA-PKCS1-v1_5) SHA-256 基於RSA公鑰密碼體制的簽名方式,是Google、Auth0、Okta等主流OAuth 2.0/OpenID Connect提供商為ID令牌採用的標準預設演算法。
ES256 ECDSA(P-256橢圓曲線) SHA-256 基於橢圓曲線密碼學的簽名方式,可用比RSA更短的金鑰長度和簽名長度實現同等安全性,越來越多地應用於移動應用和物聯網裝置。

用公鑰驗證 JWT 的簽章

本工具以 SPKI 形式的 PEM 公鑰,驗證由 RS256 或 ES256 簽署的 JWT,並同時列出解碼後的標頭與酬載以及有效期。您輸入的一切都在瀏覽器內處理,不會外傳。

值得強調的是:簽章有效與權杖有效,本是兩回事。 簽章通過,只證明內容自簽發以來未被改寫而已。真正的認證還須核對 exp(有效期)、nbf(生效時刻)、iss(簽發者)與 aud(預期受眾)是否合乎您的預期。另一個在實作上眾所周知的陷阱,是讓權杖自己的標頭來決定用哪種演算法驗證。 除非伺服端事先把可接受的 alg 定死,否則這個選擇便向攻擊者敞開了。

驗證的步驟

  1. 貼入待驗的 JWT 那是以點分作三段的字串。
  2. 貼入 PEM 形式的公鑰 要的是公鑰,不是私鑰。 RS256 取 RSA 金鑰,ES256 取 P-256 曲線上的金鑰。
  3. 驗證簽章 工具會報出金鑰與簽章是否相符。
  4. 核對解碼內容與有效期 簽章通過的權杖,一旦過期仍然不可使用。 兩者都要看。

用好本工具的小技巧

  • 輸入的公鑰必須是PEM格式(SPKI,以「-----BEGIN PUBLIC KEY-----」開頭)。直接貼上私鑰檔案或證書(.crt)無法完成驗證。
  • 系統會根據JWT Header中alg欄位的值(RS256或ES256)自動切換所使用的驗證演算法,無需手動選擇。
  • 驗證簽名的同時也會檢查Payload中的exp宣告,若已過期會顯示警告。即使簽名正確,過期的令牌通常也應被拒絕。
  • 本工具僅支援RS256和ES256。若需確認HS256等共享金鑰方式簽名的JWT,可使用姊妹工具JWT編碼器用相同的共享金鑰重新簽名並比對結果。
  • 用於驗證的公鑰並非機密資訊,直接貼上從身份提供商公開端點(如JWKS)獲取的公鑰即可,無需擔心洩露問題。

這些情境會用到

查看 ID 權杖的內容

由身分提供方簽發的權杖,可拿它的公鑰來核。

分辨金鑰有誤還是簽章損壞

驗證失敗時,可在本機判明這二者中究竟是哪一個出了岔子。

檢驗金鑰輪替

依次試過新舊兩把金鑰,便可確認更替能否照計畫走完。

追查故障的根由

接到認證失敗的回報時,可先判明問題是否出在權杖本身。

JWT 驗證的術語

RS256
以 RSA 金鑰搭配 SHA-256 的簽章方式。簽署用私鑰,驗證用公鑰。
ES256
以 P-256 曲線搭配 SHA-256 的簽章方式。金鑰與簽章都比 RSA 來得短。
SPKI
承載公鑰的標準形式。在 PEM 中以 -----BEGIN PUBLIC KEY----- 開頭。
exp
給出有效期的宣告。簽章再無可挑剔,過了這一刻的權杖也不得接受。
nbf
給出權杖自何時起可用的宣告。在此之前,權杖尚未生效。
演算法混淆
某些實作的弱點在於:權杖的標頭指名哪種演算法,便照著哪種去驗證。 可接受的方式須在驗證一方定死。

常見問題

僅支援RS256和ES256的驗證。HS256、HS384、HS512屬於共享金鑰方式,需要發籤名方和驗證方共用同一金鑰,因此無法用只輸入公鑰的本工具驗證。若需確認HS256簽名,可使用姊妹工具JWT編碼器用相同金鑰重新簽名並比對結果。

身份提供商(Google、Auth0、Okta等)通常通過名為JWKS(JSON Web Key Set)的公開端點發布公鑰。可以使用JWKS轉PEM的轉換工具,或直接使用對應服務文件中提供的公鑰。

常見原因包括:①所輸入的公鑰與簽發該JWT的私鑰不成對;②JWT的Header、Payload或Signature在傳輸過程中被篡改或損壞;③複製貼上時丟失了字元。建議從來源重新準確複製JWT字串和公鑰。

目前僅支援RS256和ES256。RS384/RS512、ES384/ES512等使用更長雜湊函式的變體,屬於後續考慮擴充套件支援的候選方向。

是的,簽名的有效性與exp是否過期是分別判斷並各自顯示的。即使簽名正確,過期的令牌在實際系統中通常也應被拒絕,請務必同時留意頁面上顯示的有效期警告。
工具君

閒話 ― HMAC與公鑰簽名,區別在哪裡

JWT的簽名方式大致分為共享金鑰方式(HMAC,如HS256)和公鑰方式(RSA/ECDSA,如RS256、ES256)兩大類。共享金鑰方式要求籤名方與驗證方持有相同的秘密字串,而公鑰方式中只有簽名方持有私鑰,任何人都可以用公開的公鑰進行驗證。這一差異直接決定了API設計中的角色分工:姊妹工具JWT編碼器(HS256)適合「簽發者與驗證者同處一臺伺服器」的場景,而本工具所處理的RS256、ES256則更適合「簽發者與驗證者分屬不同組織或不同伺服器」的場景。

實際上,Google的OAuth 2.0、OpenID Connect、Auth0、Okta等主流身份提供商簽發的ID令牌幾乎無一例外地採用RS256簽名(部分也可選擇ES256)。這是因為只有身份提供商一方持有私鑰進行簽名,而數量龐大的客戶端應用(驗證方)只需使用公鑰即可完成驗證,無需向每個客戶端分發金鑰,從而將金鑰洩露的風險集中在簽名方這一個點上。

RS256與ES256都使用SHA-256進行雜湊計算,但底層的密碼演算法不同。RS256採用RSA密碼體制(通常為2048位或更長的金鑰),簽名長度往往較大,但勝在實現成熟、支援的庫眾多。ES256採用橢圓曲線密碼學(P-256),能以遠比RSA更短的金鑰和簽名長度實現同等的安全強度,因此在移動端和對負載大小敏感的API中採用日益增多。