JWT 署名
エンコード処理はすべてブラウザ内で完結します。データは送信されません
解析しかなかった部分を補うツールです。ペイロードを書き、アルゴリズムを選び、鍵を渡すと使える JWT が出ます。 ⚠️ 鍵はオプション欄ではなく本文に書きます。PEM は必ず複数行になり、1 行の入力欄には入らないからです: ``` { "sub": "1234567890" } --- -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY----- ``` `---` だけの行が区切りで、その下が鍵です。区切りがなければ全体がペイロードになります —— HS* の鍵は 1 行の base64 なのでオプション欄にも書けます。 ⚠️ 本番用の署名鍵を Web ページに貼ることについて:ここはすべてローカルで完結し、送信も保存もしません —— ただし本番用の鍵を Web ページ(これを含む)に貼ることはお勧めしません。このページを疑うべきだからではなく、Web ページが書かれている通りのことだけをするかは監査できず、自分のスクリプトなら監査できるからです。テスト用トークンには便利ですが、本番は自分のマシンで動くコマンドを使ってください。この注意は結果の先頭に表示されます。 ⚠️ 秘密鍵は PKCS#8(`-----BEGIN PRIVATE KEY-----`)のみ受け付けます。`BEGIN RSA PRIVATE KEY`(PKCS#1)と `BEGIN EC PRIVATE KEY`(SEC1)は判別して `openssl` の変換コマンドを示します —— これらの base64 をそのままブラウザーの暗号 API に渡しても「形式が違う」とは言われず、原因の分からないエラーになります。
機能
- 13 種類のアルゴリズム:HS256/384/512・RS256/384/512・PS256/384/512・ES256/384/512・EdDSA
- ⚠️ 「本番の秘密鍵を Web ページに貼らない」という注意を結果の先頭に表示(FAQ には隠しません)
- ⚠️ `exp` がない場合は無期限に有効であると明示 —— 忘れると失効しない資格情報を発行したことになります
- `iat` と `exp` を自動補完(`iat` は書かれていないときだけ。意図して設定した時刻を上書きしないため)
- 有効期限は 5 分から 1 年まで、または設定せず自分で `exp` を書くことも可能
- ⚠️ 秘密鍵は PKCS#8 のみ。PKCS#1 と SEC1 は判別し、`openssl pkcs8 -topk8` の変換コマンドを示します
- ⚠️ ES512 は P-521 曲線を使います(「P-512」という曲線は存在しません)
- ⚠️ ES* の署名は JWS の規定どおり固定長 r‖s で、ECDSA で一般的な DER ではありません
- ⚠️ PS* のソルト長は JOSE の規定どおりハッシュ長で、ブラウザー API の既定値ではありません
- ヘッダーとペイロードの結果はそのままコピーできます
- すべてブラウザー内で完結し、鍵は送信されません
使い方
- 本文にペイロードの JSON を書きます(秘密鍵が必要なら `---` の行を足して下に PEM を貼ります)
- アルゴリズムを選びます。HS* の鍵はオプション欄に直接書けます
- 有効期限を選ぶと、JWT・ヘッダー・ペイロード・署名が出ます
よくある質問
- 本番トークンの署名に使わないよう注意されるのはなぜですか?
- ここは Web ページであり、書かれている通りのことだけをするかは監査できないからです —— 自分のスクリプトなら監査できます。このページが実際にローカルで完結し何も送信しないのは事実ですが、「私の言葉を信じてください」と「コードを自分で読む」は別のことです。特に貼るのが本番の署名鍵であればなおさらです。テスト用トークンや API の試し打ちには便利ですが、本番は自分のマシンで動くコマンドやライブラリを使ってください。
- 鍵をオプション欄ではなく本文に書くのはなぜですか?
- PEM 形式の秘密鍵は必ず複数行(ヘッダー・base64 本体・フッター)になり、汎用シェルの「テキスト」オプションは1 行の入力欄として描画されるため、物理的に入らないからです。そこで `---` だけの行を区切りにする約束にしています:上がペイロード、下が鍵です。HS* の鍵は 1 行の base64 なのでオプション欄にも書け、どちらの経路も使えます。
- RSA の秘密鍵が拒否されたのはなぜですか?
- 多くの場合フォーマットの問題です。ブラウザーの暗号 API は PKCS#8(`-----BEGIN PRIVATE KEY-----`)しか受け付けませんが、多くのツールは PKCS#1(`-----BEGIN RSA PRIVATE KEY-----`)を書き出し、EC 鍵にはさらに SEC1(`-----BEGIN EC PRIVATE KEY-----`)があります。3 つとも PEM で見た目はほぼ同じですが、内部構造が異なります。PKCS#1 の base64 をそのまま渡しても「形式が違う」とは言われず、原因の分からないエラーになります。そこでここでは判別し、`openssl pkcs8 -topk8 -nocrypt -in old.pem -out new.pem` を示します。
- 署名したトークンはどう検証しますか?
- HS* は同じ鍵で同じ HMAC を計算して比較します。RS・PS・ES・EdDSA は検証側に公開鍵を渡します —— これが非対称アルゴリズムの意義で、検証側は署名できる鍵を持つ必要がありません。なお ES* の署名は JWS では DER ではなく固定長の r‖s で、ライブラリによってはこの符号化を明示しないと検証に失敗し、原因も分かりません。
- exp がないとどうなりますか?
- ほとんどの検証ライブラリは `exp` のないトークンを無期限に有効として扱います。これは仕様の穴ではなく、`exp` が任意であり、書かなければ期限がないというだけのことです。したがって署名時に忘れると、失効しない資格情報を発行したことになり、しかも見た目は普通のトークンと同じです。このツールは結果で明示的に警告します。
関連ツール
JWT デコードと検証
エンコードJWT を header・payload・signature に分け、秘密鍵で HS256/384/512 の署名を検証します。exp・nbf は読める日時に変換。すべてブラウザ内で処理します。
ハッシュ計算
エンコードMD5・SHA-1・SHA-256・SHA-512 のダイジェストを計算します(旧システム向けの MD4・MD2 も可)。日本語も UTF-8 バイトで計算します。
HMAC 署名
エンコード秘密鍵とメッセージから HMAC 署名を計算します。空白や日本語、中国語を含む鍵でも Node・Java・Python と一致し、鍵は端末内の計算にだけ使われて送信されません。
Base64 変換
エンコードテキストを Base64 に変換し、Base64 からテキストへ戻します。日本語や中国語、emoji も UTF-8 として正しく処理。すべてブラウザ内で完結し、内容は送信しません。
URL エンコード
エンコード日本語や中国語、空白・記号を %XX にエスケープし、復元します。URL 全体とパラメータ値では方式が異なり、間違えるとリンクが開けません。ブラウザ内で処理します。
HTML 実体参照
エンコード< > & と引用符を HTML 実体参照に変換し、文字へ戻します。デコードは1回だけで、&lt; は山括弧ではなく < になります。すべてブラウザ内で処理します。