JWT 生成 (署名) — HMAC / RSA / ECDSA を Web Crypto で
JWT (JSON Web Token) を Web Crypto API でブラウザ内のみで生成 (署名) するツール。HS256 / HS384 / HS512 (HMAC 共通鍵)、RS256 / RS384 / RS512 (RSASSA-PKCS1-v1_5)、PS256 / PS384 / PS512 (RSA-PSS)、ES256 / ES384 / ES512 (ECDSA P-256/P-384/P-521) に対応。Header / Payload を JSON で入力 (`exp` / `iat` / `nbf` の自動補完オプションあり)、鍵は HMAC は文字列、非対称鍵は PKCS#8 PEM または JWK で入力。出力は標準的な `header.payload.signature` 形式の JWT で、jwt-decode / jwt-verify ツールにそのまま貼り付けて確認可能。秘密鍵も payload もネットワークに送信されません。
使い方
1) アルゴリズムを 12 種類から選びます (HS256 が標準)。HS* は HMAC 共通鍵、RS*/PS* は RSA、ES* は ECDSA。 2) Header と Payload を JSON で入力します。`alg` は自動で上書きされ、`typ` は未指定なら `JWT` が補完されます。 3) 秘密鍵を入力 — HMAC は任意の文字列、非対称鍵は PKCS#8 PEM (`-----BEGIN PRIVATE KEY-----`) または JWK 形式 (`{kty: 'EC', ...}`)。 4) 必要なら『クレーム自動補完』で `iat` `nbf` `exp` を自動付与。 5) 『JWT を生成』を押すと Web Crypto で署名され、`header.payload.signature` 形式の JWT が出力されます。jwt-decode / jwt-verify に貼り付けて確認できます。
よくある質問
- なぜ秘密鍵が PEM ではなく PKCS#8 形式なのですか?
- Web Crypto の `crypto.subtle.importKey('pkcs8', ...)` が PKCS#8 形式 (= `BEGIN PRIVATE KEY`) のみを受け付けるためです。OpenSSL で `BEGIN RSA PRIVATE KEY` (PKCS#1) の鍵がある場合は `openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs1.pem -out pkcs8.pem` で変換してから貼り付けてください。EC鍵 (`BEGIN EC PRIVATE KEY`) も同様に変換が必要です。または JWK 形式 (`{kty: 'EC', d: '...', x: '...', y: '...', crv: 'P-256'}`) で入力してください。
- HS256 と RS256 の使い分けは?
- HS256 (HMAC) は同じ秘密文字列を発行者と検証者で共有する『共通鍵方式』。サーバー間や、サーバーから自分自身に発行する短期トークンに向きます。RS256 (RSA) / ES256 (ECDSA) は秘密鍵で署名し公開鍵で検証する『非対称鍵方式』。OAuth プロバイダのように発行者が 1 つで検証者が多数いるケースに向きます。鍵を共有したくない場合は非対称鍵を選んでください。
- alg=none で署名なし JWT は作れますか?
- 本ツールはサポートしていません。`alg=none` は仕様上は存在しますが、署名検証をスキップしてしまうため重大なセキュリティ脆弱性 (CVE-2015-9235 など) の原因になります。検証側ライブラリが `alg=none` を許容しているとトークン偽造が容易になるため、業界全体で非推奨。検証用ダミーが必要なら HS256 + ダミー文字列鍵を使ってください。
- ECDSA の署名は実行ごとに変わるのですが?
- ECDSA は仕様上、署名生成時にランダムな nonce を使うため同じ payload / 鍵でも署名値が毎回異なります (= 正常動作)。これは複数回実行しても同じ payload なら同じトークンが必要な場合 (キャッシュキーなど) には不向きで、その用途は RS256 (RSA) や HS256 (HMAC) の決定論的署名のほうが適しています。検証は問題なく通ります。
- PS256 (RSA-PSS) と RS256 (RSASSA-PKCS1-v1_5) の違いは?
- 両方とも RSA 鍵を使いますが、署名アルゴリズムが異なります。RS256 は古典的な PKCS#1 v1.5 パディング、PS256 は確率的署名スキーム (PSS)。PSS のほうがセキュリティ証明が強固で新しい標準では推奨されていますが、互換性の都合で RS256 がまだ広く使われています。同じ RSA 秘密鍵でも、RS256 と PS256 では署名値が異なります。
- exp / iat / nbf を秒指定するのはなぜ?
- JWT 仕様 (RFC 7519) で `exp` / `iat` / `nbf` は『Unix epoch からの秒数』(NumericDate) で表現することが定められているためです。本ツールの自動補完は現在時刻 (秒) を取得して埋め込みます。ミリ秒ではないので注意 (JavaScript の `Date.now()` の値を直接入れると 1000 倍ズレます)。
- 鍵や Payload はサーバーに送信されますか?
- いいえ。Web Crypto API はブラウザ内で完結し、秘密鍵・Header・Payload はネットワークに一切送信されません。本番用秘密鍵を扱うのも安全です (ただしブラウザのキャッシュ・履歴に残る点には注意してください)。
類似のツール
JWT デコード — header / payload を可読化
JWT を貼り付けて Header / Payload / Signature に分解。exp / iat / nbf などの数値クレームは人間可読な日時に変換して表示。署名検証は行いません (内容確認専用)。すべてブラウザ内で処理。
JWT 署名検証 — HMAC / RSA / ECDSA 対応
WebCrypto で JWT の署名を検証します。HS / RS / PS / ES の各 SHA-256/384/512 に対応。HMAC は共通鍵文字列、RSA / ECDSA は SPKI 形式の PEM 公開鍵か JWK を入力するだけ。exp / nbf もあわせてチェックします。鍵もトークンもサーバへ送信されません。
Base64 エンコード / デコード — URL-safe 対応
テキストと Base64 文字列を相互変換します。エンコード時は URL-safe オプション付き、デコード時は URL-safe 形式 (- _、パディングなし) も自動受付。UTF-8 安全、ブラウザ内処理。
ハッシュ生成 — SHA-1 / 256 / 384 / 512
テキストから SHA-1 / SHA-256 / SHA-384 / SHA-512 のハッシュ値を一括生成します。Web Crypto API ベースでブラウザ内処理。