JWT 簽署與驗證器
用自己的金鑰簽署權杖,對照密鑰、PEM、JWK 或即時 JWKS 驗證權杖——並建立你的 API 對外發布的金鑰集。所有密碼學運算都在你的瀏覽器裡進行。
JWT 的可信度,取決於它的簽名。任何人都能讀取權杖——解碼證明不了任何事——所以這個工具做的是解碼器做不到的事:用你的金鑰簽署權杖(HS256/384/512、RS256/384/512、ES256/384/512、EdDSA),對照密鑰、PEM 或 JWK 公鑰、貼上的 JWKS,或即時 JWKS URL(以 kid 比對)驗證權杖,並建立你的 API 對外發布的 JWKS。配套指南簽署與驗證 JWT說明了為什麼解碼不是驗證、演算法混淆攻擊如何運作,以及「已驗證」能證明什麼、不能證明什麼。想在沒有金鑰的情況下讀取權杖,請用JWT 解碼器;金鑰本身的產生與轉換,請看SSH 金鑰套件。
最後更新:
簽署權杖
這份密鑰不到 32 個字元。短密鑰很快就會被離線猜中——正式用途請用又長又隨機的密鑰。
驗證權杖
「已驗證」表示簽名與這把金鑰相符,且權杖在有效期限內。它不表示簽發方值得信任——那取決於金鑰從哪裡來。
建立與驗證 JWKS
建立 JWKS
從產生的金鑰、PEM 或貼上的 JWK 加入金鑰。每個項目都會得到一個 kid——能計算時用 RFC 7638 指紋,否則用頁面會標明的隨機 id。
金鑰集中的金鑰
還沒有金鑰。請在上方產生一把,或貼上 PEM 或 JWK。
驗證 JWKS
轉換金鑰 (PEM ⇄ JWK)
在「簽署」分頁貼上金鑰、在那裡產生一把,或在下方轉換。HMAC 密鑰沒有 PEM 形式——oct JWK 就是整把金鑰。
🔒 簽署與驗證都在本機以 WebCrypto 進行。密鑰與私鑰絕不傳送、不儲存、不記錄——重新整理頁面,它們就消失了。
你的金鑰永不離開本頁
簽署與驗證使用你瀏覽器的 WebCrypto,以你貼上或在此產生的金鑰進行。密鑰與私鑰只存在於頁面記憶體中:不上傳、不寫入 localStorage 或 cookie,也不放進 URL。重新整理或關閉頁面,它們就消失了。唯一的例外是你自己啟動的 JWKS URL 擷取:它只會傳送你輸入的 URL,去取回公開金鑰——絕不會傳送密鑰。在任何地方貼上正式金鑰之前,請先讀簽署與驗證 JWT。
如實說明的限制
EdDSA 需要較新的瀏覽器:舊瀏覽器沒有 WebCrypto Ed25519,本頁會直說,而不會假裝簽出一個簽名。ECDSA P-256 是到處都能用的備案。
加密 PEM(以通關密語鎖住的私鑰)第一版不支援。本頁會明確拒絕——請先用 openssl pkcs8 -topk8 -nocrypt 解密,絕不要把通關密語貼進網頁。
JWKS URL 擷取要看對方伺服器是否送出 CORS 標頭。多數身分提供者會送;不送時擷取會誠實地失敗,頁面會請你改貼 JWKS。擷取的永遠只有公開金鑰——JWKS URL 絕不會帶密鑰。
什麼時候簽署勝過解碼
解碼 JWT 就是讀它:標頭與載荷是 base64url,持有權杖的人都能看到兩者。所以光靠解碼器永遠回答不了唯一重要的問題——簽發方真的簽了它嗎?簽署是工作的另一半:持有私鑰(或 HMAC 密鑰)的一方產生簽名,驗證方再用公鑰重算一次同樣的數學。本頁把兩半都留在你的瀏覽器裡,因為涉及的金鑰是網路工具處理過最敏感的輸入。
這個區分對非對稱演算法最重要。用 HS256 時,驗證用的密鑰就是簽署用的密鑰——能檢查你權杖的人也能鑄造權杖,在同一個服務內部沒問題,洩漏出去就到處都是問題。用 RS256、ES256 或 EdDSA 時,簽署金鑰留在簽發方手裡,只有公鑰會流通:你的 API 可以發布 JWKS、加入新的 kid 來輪換金鑰,讓全世界的驗證方都能檢查權杖,卻永遠拿不到偽造權杖的能力。
這個工具拒絕做的事
有兩項拒絕是故意的。第一是 alg: none:聲稱不需要簽名的權杖會被直接拒絕,並顯示原因——接受它的驗證方就是在接受偽造品。第二是演算法混淆:拿 HMAC 密鑰遞上 RS256 權杖(或反過來)時,驗證會明確警告並失敗,絕不會悄悄把金鑰換個家族重新解讀。這兩者都是經典的 JWT 攻擊,本頁用結構來防堵——金鑰家族必須與權杖的 alg 家族相符,否則驗證失敗。
第三項拒絕更微妙:本頁永遠不會告訴你某個權杖「值得信任」。有效的簽名只證明權杖是用某把金鑰簽的,到期檢查只證明它在有效期限內——僅此而已。要不要信任那把金鑰,是關於它從哪裡來的決定:從身分提供者 well-known URL 擷取的 JWKS、你自己釘選的公鑰、你產生的密鑰。指南簽署與驗證 JWT會說明「已驗證」能證明什麼、不能證明什麼。
JWT 術語,一一說清
JWT. JSON Web Token (RFC 7519):在各方之間傳遞宣告的精簡、URL 安全方式——標頭.載荷.簽名,每一段都是 base64url 編碼。載荷人人可讀;只有簽名與密鑰有關。
JWS. JSON Web Signature (RFC 7515):JWT 底下的簽名格式。JWT 就是載荷為 JSON 宣告集的 JWS。
JWK. JSON Web Key (RFC 7517):以 JSON 物件表示的一把密碼學金鑰——kty,以及金鑰材料(RSA 的 n/e、EC 的 x/y、Ed25519 的 x、共享密鑰的 k)。
JWKS. JSON Web Key Set:帶有 "keys" 陣列的物件——簽發方發布公鑰的標準方式,通常位於 /.well-known/jwks.json。
kid. 金鑰 ID:標頭中指明哪把金鑰簽了這份權杖的宣告。驗證方會拿它與 JWKS 比對;沒有它時,若金鑰集只有一把金鑰就會用那一把,頁面也會如實說明。
alg. 標頭中指明簽名演算法的宣告(HS256、RS256、ES256、EdDSA……)。驗證方必須釘選它接受的演算法——信任權杖自己的 alg 宣告,就是混淆攻擊。
HMAC. 雜湊訊息驗證碼(Hash-based Message Authentication Code):對稱簽名——同一把密鑰簽署與驗證。快速簡單;持有密鑰的每個人都能鑄造權杖。
RSASSA-PKCS1-v1_5. RS256/384/512 背後的 RSA 簽名方案:雜湊經過包裝,再以私鑰指數運算。具確定性——相同輸入永遠產生相同的簽名字節。
EdDSA. Edwards 曲線數位簽名演算法:這裡用的是 Ed25519——金鑰小、驗證快、簽名具確定性。WebCrypto 支援需要較新的瀏覽器。
常見問題
把私鑰貼進本頁安全嗎?
在本頁,金鑰永不離開你的瀏覽器:簽署在頁面記憶體中以 WebCrypto 進行,不上傳、不儲存、不記錄,重新整理就清除。不安全的模式是伺服器端簽署——你的私鑰會穿過網路。即便在本地,也請用你信任的裝置——如果機器是共用的,請把貼過的正式金鑰當作已洩漏。請改在這裡產生測試金鑰,不要貼真金鑰。
為什麼我的 RS256 權杖無法用密鑰驗證?
因為密鑰和 RSA 金鑰屬於不同家族,本頁拒絕混用——這項拒絕正是演算法混淆防護。RS256 權杖需要簽發方的 RSA 公鑰(PEM、JWK 或 JWKS);密鑰只能驗證 HS256/384/512。如果你的公鑰格式不對,可以轉換:JWKS 分頁提供 PEM ⇄ JWK 轉換。
JWKS URL 擷取實際上傳送了什麼?
向你輸入的 URL 發出一次要求 JSON 的 GET 請求。沒有金鑰、沒有密鑰、沒有權杖、沒有識別碼會跟著去——回應是一組公開金鑰。如果伺服器沒有送出 CORS 標頭,瀏覽器會阻擋讀取,頁面會請你改貼 JWKS。
權杖在這裡驗證通過了,API 卻拒絕它。為什麼?
這裡的驗證只檢查簽名與時間範圍,對照你提供的金鑰。API 還會檢查宣告:它預期的簽發方 (iss)、它服務的對象 (aud),以及 kid 是不是它目前信任的金鑰。已輪換出去的金鑰所簽的權杖,或為不同對象鑄造的權杖,在數學上驗證通過,仍會被正確地拒絕。
EdDSA 在我的瀏覽器裡無法使用。怎麼辦?
Ed25519 需要較新的瀏覽器——舊瀏覽器完全沒有 WebCrypto Ed25519,本頁會直說,而不會假裝。請改用 ES256 (ECDSA P-256) 作為備案:只要有 WebCrypto 的地方都支援,本頁也能替你產生金鑰。如果非用 Ed25519 不可,請更新瀏覽器。