Skip to content

無料 JWT シークレット生成ツール — HS256/384/512

HS256/384/512 向けの強力で RFC 準拠の JWT シークレットを生成。100% ブラウザ内で処理し、サーバーには一切送信されません。base64url・base64・hex で .env 用にコピー。

トラッキングなし ブラウザで動作 無料
シークレットは crypto.getRandomValues でローカルに生成され、アップロード・ログ・保存は一切されません。このデバイス上にとどまります。
16 64

同等の CLI コマンド

RFC 7518 §3.2 の鍵長の正しさ、base64url / base64 / hex にわたる RFC 4648 符号化の正確さ、CSPRNG のソース(crypto.getRandomValues であり Math.random ではない)、生成されたシークレットのネットワークなし・ストレージなしのプライバシー、アクセシビリティ(ラベル付きコントロール、表示/非表示のマスク、生成・コピー時のスクリーンリーダー通知)についてレビュー済み。 — Go Tools セキュリティツールチーム · Jun 16, 2026

JWT シークレット生成ツールとは?

JWT シークレット生成ツールは、HMAC 署名された JSON Web Token が改ざんされていないことを証明するために使う、ランダムな署名鍵を生成します。HS256・HS384・HS512 でトークンに署名すると、アルゴリズムは 1 つの共有シークレットを使ってトークンのヘッダーとペイロードに対して HMAC を計算します。検証側は同じシークレットで同じ HMAC を再計算し、署名が一致した場合にのみトークンを受け入れます。その方式の安全性はすべて、シークレットが長く予測不可能であることにかかっています。それがまさに本ツールの作るもの、つまり選んだアルゴリズムに合わせて正しいサイズに調整され、ブラウザ内で生成された高エントロピーのランダム文字列です。

本ツールが何をして何をしないかを正確にしておく価値があります。本ツールはシークレット鍵、つまり JWT_SECRET 環境変数に入れる値を生成するのであって、完成したトークンを生成するわけではありません。ヘッダーとペイロードを組み立てて実際の JWT へ署名したいなら、それはJWT エンコーダーの仕事です。既存のトークンを分解して署名を検証するにはJWT デコーダーを使います。シークレットを鍵、エンコーダーをその鍵で操作する錠前と考えてください。鍵を一度生成して安全に保管し、それを再利用して多数のトークンに署名・検証します。

鍵はどのくらいの長さが必要でしょうか? その答えは好みではなく仕様で固定されています。JSON Web Algorithms 標準である RFC 7518 §3.2 は、HMAC 鍵がハッシュ出力と少なくとも同じ大きさであることを要求します。「ハッシュ出力と同じサイズ(例えば HS256 なら 256 ビット)以上の鍵を使わなければならない(MUST)。」これにより、本ツールが自動的に従うきれいな表が得られます。

| Algorithm | HMAC | Min bytes | Min bits | hex chars | base64 chars | base64url chars | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |

文字数はそれらのバイト長の RFC 4648 符号化に由来します。hex はバイト数を 2 倍にし、base64 はパディング付きで 4⁄3 に拡張し、base64url はパディングを落とすので、32 バイトの鍵は 44 ではなく 43 文字の base64url になります。base64url は JWT のネイティブ符号化(URL セーフなアルファベット、パディングなし)であり、だからここでは既定の出力です。base64url のシークレットは、エスケープなしでヘッダー・URL・設定値に置けます。

ランダム性は妥協できない部分です。本ツールは Web Crypto 鍵生成を支えるのと同じプリミティブである crypto.getRandomValues、つまりブラウザの暗号学的に安全な擬似乱数生成器からバイトを引き出します。Math.random は決して使いません。Math.random は高速ですが予測可能で、署名鍵にはまったく不適切です。予測可能な RNG は推測可能なシークレットを意味し、推測可能なシークレットは偽造可能なトークンを意味します。HMAC 検証は共有シークレットを使ってローカルで行われるため、トークンを捕捉した攻撃者は弱い鍵をレート制限なしにオフラインで総当たりできます。hashcat(モード 16500)や jwt_tool のようなツールはまさにこのために存在します。一方、完全なエントロピーを持つ 32 バイトのランダム鍵は計算的に手の届かないところにあります。教訓は明白です。パスワード・辞書語・手入力した文字列を JWT シークレットに決して使わず、ランダムなものを生成してください。

最後に、鍵をクライアント側で生成すること自体がセキュリティ特性です。署名シークレットは、その作成を手伝うサイトであっても、第三者に送信されるべきではありません。ここではすべてのバイトがブラウザ内で生成・符号化され、何もアップロード・ログ・保存されません。鍵を出荷する準備ができたら、Copy for .env ボタンが JWT_SECRET=… 行を渡してくれます。より大きな設定に折り込む必要があるなら、JSON to .env コンバーターが役立ちます。生成してコピーし、シークレットマネージャーに保存して、時が来たら kid ヘッダーと重複する有効期間でローテーションしてください。

// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool

// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
  algorithm: 'HS256',
  expiresIn: '15m'
});

// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });

// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"])  # whitelist!

// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
//   openssl rand -base64 32
//   node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
//   python -c "import secrets; print(secrets.token_urlsafe(32))"

主な機能

アルゴリズムに応じた鍵長

HS256・HS384・HS512 を選ぶと、本ツールは RFC 7518 §3.2 の最小鍵サイズ(32・48・64 バイト)を自動で設定します。より長い鍵を要求することはできますが、仕様に違反したり厳格なライブラリが署名を拒否したりするような短すぎる鍵を誤って用意してしまうことは決してありません。

3 つのテキストセーフな出力形式

同じランダムバイトを base64url(JWT のネイティブで URL セーフ・パディングなしの符号化で既定)、標準 base64、hex として並べて表示します。base64url は JWT_SECRET に最も安全な既定値ですが、特定のローダーやライブラリが別の形式を要求するときは切り替えられます。3 つともエントロピーは同一です。

暗号学的に安全なランダム性

すべてのシークレットは、ブラウザの CSPRNG であり Web Crypto 鍵生成の背後にあるプリミティブである crypto.getRandomValues から引き出されます。Math.random は決して使いません。これにより、予測可能な構造のない完全なエントロピーの鍵が保証され、シークレットがオフライン総当たりの手の届かないところに置かれます。

ワンクリックの Copy for .env

Copy for .env は値を慣例的な JWT_SECRET=… の代入文で包み、引用符なしの 1 行にして、鍵の名前を手入力せずに .env ファイル・Docker シークレット・CI 変数に貼り付けられるようにします。素の Copy は、値だけが必要なときに生のシークレットを取得します。

同等の CLI コマンド

選択したアルゴリズムに対応する openssl rand・Node crypto.randomBytes・Python secrets のワンライナーをパネルに表示するので、プロビジョニングスクリプトや Dockerfile で同等の強度の鍵を再現できます。競合する多くのツールはこれを省きますが、ここでは標準装備です。

表示 / 非表示のマスク

シークレットは既定でマスクされ、デモ・チュートリアル・画面共有の最中に画面に出ないようになっています。コピーする準備ができたときだけ目のアイコンで表示してください。Copy 系の操作は、表示・非表示のいずれでも常に本物のシークレットをクリップボードに置きます。

100% プライベート、ブラウザのみ

シークレットの生成・符号化・表示はすべてお使いのデバイス上で行われます。ネットワークリクエストもログもストレージもありません。DevTools →「ネットワーク」で確認してください。署名鍵は第三者に届くべきではなく、ここでは決して届きません。これがクライアント側で生成する理由そのものです。

15 言語に対応

ラベル・操作説明・ガイダンスを含むインターフェース全体が 15 言語にローカライズされているので、チームがどこで働いていてもツールが使え、セキュリティの助言が明確に伝わります。

実践例

HS256 シークレットを base64url で生成(既定)

Algorithm: HS256 · Format: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

HS256 は HMAC-SHA-256 で署名するため、RFC 7518 §3.2 は 32 バイト(256 ビット)以上の鍵を要求します。本ツールは crypto.getRandomValues から暗号学的に安全なランダムバイトを 32 バイト引き出し、JWT 自身が使うパディングなし・URL セーフな base64url で符号化します。32 バイトは 43 文字の base64url 文字列になります。その値をそのまま JWT_SECRET に入れてください。クリックするたびに新しいシークレットが再生成され、同じものが二度生成されることはありません。

HS512 シークレットを生成(64 バイト / 512 ビット)

Algorithm: HS512 · Format: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)

HS512 は HMAC-SHA-512 を使い、そのハッシュ出力は 64 バイトなので、RFC 7518 §3.2 は 64 バイト(512 ビット)以上の鍵を義務付けます。本ツールはアルゴリズムを検知して自動的にバイト数を引き上げるので、最小値を覚えておく必要はありません。64 バイトのランダムバイトは 86 文字の base64url 文字列、標準 base64 なら 88 文字、hex なら 128 文字に符号化されます。ここで長いアルゴリズムを選ぶことが、よりエントロピーの高いシークレットをワンクリックで用意する方法です。

シークレットを .env 行としてコピー

Click "Copy for .env"
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

「Copy for .env」は生成された値を慣例的な JWT_SECRET=… の代入文で包むので、鍵の名前を手入力せずに .env ファイル・Docker シークレット・CI 変数へ直接貼り付けられます。値は引用符なしの 1 行のままで、まさに dotenv 形式のローダーが期待する形です。より大きな設定に埋め込みたい場合は、下にリンクした JSON to .env コンバーターと組み合わせてください。

CLI からシークレットを再現(同等の強度)

Show the CLI command
openssl rand -base64 32

CLI パネルは、選択したアルゴリズムに対して同じバイト数の安全なランダムバイトを引き出す openssl・Node・Python のコマンドを表示します。HS256 なら openssl rand -base64 32、HS384 なら …48、HS512 なら …64 です。出力はバイト単位で同一の文字列ではなく、同等の強度を持つシークレットです。openssl はパディング付きの標準 base64 を出力し、本ツールは既定で base64url なので、アルファベットや末尾の文字が異なります。プロビジョニングスクリプトに合うものをお使いください。エントロピーは同じです。

シークレットの表示と非表示

Toggle the eye icon
•••••••••••••••••••••••••••••••••••••••••••  ↔  3sJ9aFq2kP7m…

シークレットは既定でマスクされているので、デモや画面共有の最中に肩越しに覗かれたり画面録画に写ったりしません。コピーする準備ができたら目のアイコンをクリックして表示し、その後また隠してください。Copy と Copy for .env は表示・マスクのどちらの状態でも動作し、クリップボードに渡るのは常に本物のシークレットで、点(・)ではありません。

JWT シークレット生成ツールの使い方

  1. 1

    署名アルゴリズムを選ぶ

    HS256・HS384・HS512 を選択します。本ツールはその HMAC 種別に対して RFC 7518 §3.2 の最小鍵長(32・48・64 バイト)を即座に適用するので、数値を調べたり鍵が短くなりすぎたりする心配はありません。

  2. 2

    出力形式を選ぶ

    base64url が既定で、JWT のネイティブな URL セーフ・パディングなしの符号化です。ローダーが要求するなら標準 base64 に、0〜f の文字しか受け付けないシステムなら hex に切り替えます。3 つとも同じランダムバイトを同一のエントロピーで符号化します。

  3. 3

    シークレットを表示してコピーする

    シークレットは既定でマスクされ、デモや画面共有の最中に画面に出ないようになっています。目のアイコンをクリックして表示し、Copy で生の値を取得するか、Copy for .env で .env ファイルや CI 変数用の JWT_SECRET=… 行をコピーします。

  4. 4

    必要に応じて再生成する

    Regenerate をクリックすると、crypto.getRandomValues から引き出した新しく独立したシークレットが得られます。環境ごとに 1 つ生成してください。同じ署名鍵を開発・ステージング・本番で再利用してはいけません。

  5. 5

    CLI の同等手段を使うか、署名へ進む

    CLI パネルには、スクリプトでのプロビジョニング用に対応する openssl・Node・Python のワンライナーが表示されます。シークレットが手に入ったら、JWT エンコーダーでトークンに署名し、JWT デコーダーで署名を確認してください。

よくある JWT シークレットの間違い

パスワードや短いフレーズをシークレットに使った

人間が選んだ文字列は署名鍵にはエントロピーが少なすぎ、辞書攻撃や総当たり攻撃でオフラインに復元され、その後は任意のトークンを偽造できます。代わりに完全なエントロピーのランダムシークレットを生成してください。

✗ 誤り
JWT_SECRET=mySuperSecret123  →  low entropy, brute-forceable
✓ 正しい
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0  →  32 random bytes

鍵がアルゴリズムの要求より短い

RFC 7518 §3.2 は HMAC 鍵がハッシュ出力以上の長さであることを義務付けます。HS256 の 16 バイト鍵は 32 バイトの下限を下回り、署名を弱め、一部のライブラリは即座に拒否します。

✗ 誤り
16-byte key with HS256  →  below the 32-byte minimum
✓ 正しい
32-byte key with HS256  →  meets RFC 7518 §3.2

Math.random で鍵を生成した

Math.random は暗号学的に安全ではなく、その出力は予測可能なので、それで作ったシークレットは推測可能で、署名したトークンは偽造可能です。署名鍵は crypto.getRandomValues のような CSPRNG から得なければなりません。

✗ 誤り
Math.random()-based key  →  predictable, unsafe
✓ 正しい
crypto.getRandomValues key  →  full entropy

署名前にシークレットを再符号化した

ツールが生成した正確な文字列を保存して渡してください。あるサービスでは base64 デコードしてバイトにし、別のサービスではリテラル文字列として扱うと、両者の鍵が異なり、すべての署名チェックが失敗します。

✗ 誤り
Service A: raw string · Service B: base64-decoded  →  signatures never match
✓ 正しい
Both services use the identical stored string  →  signatures verify

すべての環境で同じシークレットを再利用した

1 つの JWT_SECRET を開発・ステージング・本番で共有すると、どこかでの漏洩がどこでもトークンを偽造でき、ローテーションが全か無かになります。環境ごとに別々のシークレットを用意してください。

✗ 誤り
Same JWT_SECRET in dev, staging, prod  →  one leak breaks all
✓ 正しい
A unique secret per environment  →  blast radius contained

検証時にトークンの alg を信用した

検証側がトークンの申告するアルゴリズムを何でも受け入れると、alg:none や HS/RS 混同の偽造が成立します。シークレットがどれほど強力でも、明示的なアルゴリズムのホワイトリストを渡してください。

✗ 誤り
jwt.verify(token, secret)  →  accepts the token's alg
✓ 正しい
jwt.verify(token, secret, { algorithms: ['HS256'] })  →  pinned

このツールを使う人

新しいサービス用に JWT_SECRET を用意する
HMAC 署名のトークンを発行する API を立ち上げますか? ライブラリが使うアルゴリズムを選び、シークレットを JWT_SECRET=… 行としてコピーして、サービスの環境に入れてください。開発・ステージング・本番には別々の鍵を生成し、1 つのシークレットを複数の環境で共有しないでください。
侵害された、または古くなったシークレットをローテーションする
鍵の漏洩が疑われたり、単にローテーションの時期が来たりしたら、ここで新しいシークレットを生成し、新しい kid を割り当て、有効なトークンが期限切れになるまで検証し続けられる重複期間を設けて展開してください。侵害が確定した場合は、即座にローテーションし、受け入れ集合から古い鍵を外します。
弱い、または手入力した鍵を置き換える
JWT_SECRET が短いフレーズやコピーされた例の値になっているコードベースを引き継ぎましたか? その鍵はオフラインで総当たり可能です。完全なエントロピーの 32 バイトの代替を生成し、ローテーション期間を設けて差し替え、悪用される前にトークン偽造の穴を塞いでください。
パイプラインで鍵生成をスクリプト化する
鍵を手作業ではなく CI や Dockerfile で作成したいですか? CLI パネルの openssl・Node・Python のワンライナーを使ってプロビジョニングスクリプト内で同等の強度のシークレットを生成し、各コマンドが生成するバイト長と符号化を理解するためにこのページを使ってください。
JWT 署名を安全に教える
本番の鍵を一切露出させずに HS256 の仕組みをチームに説明できます。画面上で使い捨てのシークレットを生成し(表示するまでマスクされたまま)、JWT エンコーダーでサンプルトークンに署名し、JWT デコーダーで検証して、署名と検証の一連の流れを見せられます。
HS256・HS384・HS512 の鍵サイズを比較する
どの HMAC 種別で標準化するか迷っていますか? アルゴリズムを切り替えて、必要な鍵長と符号化された文字列がどう伸びるか(43・64・86 文字の base64url)を確認し、設定にコミットする前に、システムに合う強度とトークンサイズのトレードオフを選んでください。
ローカル開発用の鍵を生成する
ローカルの認証フローを動かすために、手早く有効なシークレットが必要ですか? ワンクリックで生成し、.env 用にコピーすれば作業を再開できます。デプロイ前に置き換え忘れるプレースホルダーではなく、本物の CSPRNG の鍵で。

生成ツールの仕組み

crypto.getRandomValues(CSPRNG)
シークレットは、Web Crypto の暗号学的に安全な擬似乱数生成器である crypto.getRandomValues で Uint8Array を埋めることで生成されます。これは Web Crypto 鍵生成を支えるのと同じエントロピー源です。Math.random はどこでも決して使いません。統計的に予測可能で、いかなる暗号鍵にも不適切だからです。
RFC 7518 §3.2 の鍵サイズ調整
アルゴリズムごとのバイト数は、HMAC 鍵がハッシュ出力以上のサイズであることを求める JSON Web Algorithms の要件に従います。HS256(SHA-256)は 32 バイト、HS384(SHA-384)は 48、HS512(SHA-512)は 64 です。アルゴリズムを選ぶと最小値が設定され、本ツールは仕様の下限を下回る鍵を出力しません。
RFC 4648 符号化(base64url / base64 / hex)
生のバイトは RFC 4648 のアルファベットで符号化されます。base64url はパディングなしの URL セーフなアルファベットを使い(32 バイト → 43 文字)、標準 base64 は +、/、= パディングを使い(→ 44 文字)、hex は 1 バイトを 2 文字で書きます(→ 64 文字)。形式を切り替えると同じバイトが再符号化され、根底のエントロピーは変わりません。
なぜ base64url が既定なのか
JWT の構成要素自体が base64url で符号化されており、URL セーフ・パディングなしのアルファベットは、base64url のシークレットがヘッダー・URL・設定ファイル内でエスケープを必要としないことを意味します。標準 base64 の + や / や末尾の = はそうした文脈で壊れる可能性があるので、base64url が JWT_SECRET の保守的な既定です。
Copy-for-.env のフォーマット
Copy for .env は、dotenv 形式のローダーが変更なしに解析する形である、引用符なしの 1 行 JWT_SECRET= を出力します。生のシークレットには .env ファイルで引用が必要になる文字が含まれないので、その行はそのまま貼り付けても安全です。
同等の強度の CLI コマンド、バイト単位では同一でない
CLI パネルの openssl rand -base64 N、Node randomBytes(N).toString('base64url')、Python secrets.token_urlsafe(N) のコマンドはすべて、選んだアルゴリズムに対して N バイトの安全なランダムバイトを引き出します。これらは同等の強度の鍵を生成しますが、同じ文字列ではありません。openssl はパディング付きの標準 base64 を出力するので、本ツールの base64url 既定とはアルファベットや末尾の文字が異なります。

JWT シークレットのベストプラクティス

鍵長をアルゴリズムに合わせる
RFC 7518 §3.2 が要求するとおり、HS256 には最低 32 バイト、HS384 には 48、HS512 には 64 を使ってください。本ツールが代わりに行いますが、もし手で鍵のサイズを決めるなら、ハッシュ出力長を決して下回らないこと。短すぎる HMAC 鍵は署名を弱め、厳格なライブラリに拒否される可能性があります。
常に CSPRNG で生成し、パスワードは使わない
JWT シークレットは誰も覚える必要のないマシン認証情報なので、エントロピーを惜しまず、パスフレーズ・辞書語・手入力した文字列ではなく暗号学的に安全なランダム鍵を使ってください。人間が選んだシークレットは、JWT クラッキングツールが自動化するオフライン総当たり攻撃の最も狙いやすい標的です。
環境ごとに固有のシークレットを使う
開発・ステージング・本番にはそれぞれ独自の JWT_SECRET を持たせるべきです。1 つの鍵を共有すると、低リスクの環境での漏洩がどこでもトークンを偽造でき、ローテーションが全か無かになります。環境ごとに別々のシークレットをここで生成し、それぞれを独自のシークレットマネージャースコープに保存してください。
検証時にアルゴリズムを固定する
検証側では、常に明示的なアルゴリズムのホワイトリスト(jsonwebtoken では algorithms: ['HS256']、PyJWT では algorithms=["HS256"])を渡し、トークン内の alg フィールドを決して信用しないでください。トークンが自己申告するアルゴリズムを受け入れると、シークレットがどれほど強力でも、古典的な alg 混同や alg:none の偽造攻撃が成立します。
kid ヘッダーと重複する鍵でローテーションする
署名したトークンに鍵識別子(kid)を付け、有効な鍵を JWKS エンドポイントで公開して、ダウンタイムなしにローテーションできるようにしてください。新しい鍵で新しいトークンに署名しつつ、古い鍵のトークンが期限切れになるまで古い鍵も受け入れます。侵害が疑われる場合は重複期間を省き、古い鍵を即座に失効させます。

よくある質問

生成された JWT シークレットはサーバーに送信されますか?
いいえ。シークレットはプラットフォームの暗号学的に安全な乱数生成器である crypto.getRandomValues を使って、すべてブラウザ内で生成されます。バイトはお使いのデバイス上で生成され、ローカルで符号化され、あなただけに表示されます。何もアップロードされず、ログにも残らず、ディスクにも書き込まれず、第三者にも送信されません。DevTools →「ネットワーク」を開けば、Regenerate や Copy をクリックしてもリクエストが一切発生しないことが確認できます。つまりここで生成した鍵は、現れた瞬間からあなただけのものであり、どのサーバーも目にすることはありません。これこそが、配った鍵のコピーを原理的に保持できてしまうウェブサイト上ではなく、クライアント側で署名シークレットを生成する目的そのものです。
安全な JWT シークレットはどう生成すればよいですか?
3 ステップです。まず、アプリケーションが使う署名アルゴリズム(HS256・HS384・HS512)を選びます。すると本ツールはその種別の RFC 7518 §3.2 の最小値(32・48・64 バイト)に鍵を即座に合わせるので、数値を手で選んだり鍵が短くなりすぎたりする心配はありません。次に、符号化は base64url(JWT のネイティブで URL セーフな形式)のままにするか、設定ローダーが要求するなら base64 か hex に切り替えます。最後に Copy をクリックします。あるいは Copy for .env で貼り付けるだけの JWT_SECRET=… 行を取得し、その値をシークレットマネージャーや環境変数に保存してください(ソース管理には絶対に入れないこと)。すべてのバイトが crypto.getRandomValues 由来なので、32 バイトの鍵はすでに 256 ビットのエントロピーを持ち、人間が選んだシークレットを破るオフライン総当たり攻撃の手の届かないところにあります。コマンドラインがお好みなら、本ツールは同等の openssl・Node・Python のワンライナーも表示するので、ターミナルに貼り付けられます。
HS256 の JWT シークレットはどのくらいの長さが必要ですか?
最低 32 バイト(256 ビット)です。JSON Web Algorithms 仕様である RFC 7518 §3.2 は、HMAC 署名について「ハッシュ出力と同じサイズ(例えば HS256 なら 256 ビット)以上の鍵を使わなければならない(MUST)」と定めています。HS256 は HMAC-SHA-256(256 ビットハッシュ)で署名するので最小鍵は 32 バイト、HS384 は HMAC-SHA-384 を使い最低 48 バイト(384 ビット)、HS512 は HMAC-SHA-512 を使い最低 64 バイト(512 ビット)が必要です。本ツールはアルゴリズムを選ぶと正しい最小値を自動で選び、より長い鍵を要求することもできます。短い鍵は弱いだけでなく仕様違反であり、一部のライブラリは署名を拒否します。
base64url・base64・hex の違いは何で、どれを選ぶべきですか?
3 つとも同じランダムバイトを符号化するもので、違うのは文字のアルファベットだけであり、エントロピーは変わりません。base64url は JWT のネイティブ符号化で、URL セーフなアルファベット(+ と / の代わりに - と _)を使いパディングを省くので、トークン・URL・ヘッダー内でエスケープが一切不要です。だからここでは既定になっています。標準 base64 は +、/、= パディングを使います。設定ローダーやライブラリが明示的に古典的な base64 を期待する場合に選んでください。hex(base16)は各バイトを 2 文字 0〜f で書き、長くなりますが曖昧さのない文字列になるので、英数字以外の文字を拒否するシステムで便利です。JWT_SECRET 環境変数には base64url が最も安全な既定値です。正確な文字列を保存し、変更せずに署名ライブラリへ渡す限り、3 つのどれを使っても機能します。
弱い JWT シークレットは破られますか?
はい。これは HMAC 署名の JWT における最大のリスクです。HS256/384/512 は 1 つの共有シークレットを使うため、トークンを持つ者は誰でも、レート制限もサーバーへの接続もなしに、署名に対してオフラインの総当たり攻撃や辞書攻撃を実行できます。hashcat(モード 16500 が JWT を対象)や jwt_tool のようなツールはこのために専用設計されています。一般的な GPU では、エントロピーの低いシークレットは通常数秒から数時間で破られ、辞書語や漏洩したパスワードはほぼ即座に破られます。本ツールが生成する完全なエントロピーを持つ 32 バイトのランダム鍵は、総当たりの手の届くところにありません。攻撃者がいったんシークレットを復元すれば、管理者権限を主張するものを含め任意のトークンを偽造できるので、シークレットの強度は任意ではありません。署名鍵は人間が選んだ文字列ではなく CSPRNG で生成してください。弱いシークレット・alg 混同・トークンリプレイ攻撃のより深い解説は、JWT セキュリティのベストプラクティスのガイドをご覧ください。
JWT シークレットにパスワードを使えますか?
使えますが、使うべきではありません。人間が覚えられるパスワードは、たとえ長いパスフレーズであっても、32 バイトのランダムバイトよりはるかに少ないエントロピーしか持たず、上で述べたオフラインの総当たり攻撃や辞書攻撃の現実的な標的になります。JWT シークレットはマシン間の認証情報であり、誰も覚える必要はないので、覚えやすさのためにエントロピーを犠牲にする理由はありません。ここでランダムなシークレットを生成し、シークレットマネージャーや環境変数に保存して、アプリケーションに読み込ませてください。別の用途で覚えやすい認証情報が必要なら、それはパスワード生成ツールの仕事であり、ユーザーのパスワードを保存するならbcrypt 生成ツールの一方向ハッシュの仕事です。トークン署名鍵の仕事ではありません。
稼働中のトークンを壊さずに JWT シークレットをローテーションするには?
一気に切り替えるのではなく、重複期間を設けてローテーションします。署名するトークンに鍵識別子(kid ヘッダー)を付けて、検証側がどのシークレットで照合すべきかを分かるようにし、有効な鍵を公開します。通常はサービスが読む JWKS エンドポイントを通じて行います。ローテーションの手順は、ここで新しいシークレットを生成し、新しい kid で新しいトークンの署名を始めつつ、検証では従来の鍵もまだ受け入れ、その鍵で署名したすべてのトークンが期限切れになってから初めて古い鍵を引退させます。この重複期間により、有効なセッションが途中で無効化されることはありません。侵害が疑われる場合は穏やかな重複期間を省き、即座にローテーションし、受け入れ集合から古い鍵を外し、再認証を強制して、漏洩したトークンを一斉に検証失敗させます。
HMAC(HS*)鍵は RSA や ECDSA(RS*/ES*)鍵とどう違いますか?
同じ問題を正反対の鍵モデルで解決します。HS256/384/512 は HMAC アルゴリズムで、本ツールが生成する種類の 1 つの対称シークレットを使い、署名も検証もそれで行うので、トークンを検証できる当事者は誰でも偽造もできます。これは単純で高速であり、単一のサービスが自身のトークンを発行も検証もする場合に最適です。RS*(RSA)と ES*(ECDSA)は非対称で、秘密鍵が署名し、別の公開鍵が検証だけを行う鍵ペアを使います。署名鍵を一切公開せずに、トークンを検証する必要のある相手に公開鍵を渡せます。これは、ID プロバイダーが発行するトークンを多数の独立したサービスが検証する場合の正しい選択です。本ツールは HMAC の対称シークレットのみを生成します。生成した鍵で実際のトークンを組み立てて署名するにはJWT エンコーダーを、トークンを検査・検証するにはJWT デコーダーを使ってください。

Bcrypt ハッシュ生成・検証ツール

セキュリティツール

bcrypt パスワードハッシュをオンラインで生成・検証。コスト調整、$2b$/$2a$/$2y$ プレフィックス対応。100% ブラウザ内で処理し、パスワードは一切送信されません。

JWT デコーダー — オンライン解析ツール

セキュリティツール

JWTトークンを無料のJWTデコーダーでオンラインデコード。ヘッダー、ペイロード、署名、有効期限、アルゴリズム、クレームを即座に検査できます。100%ブラウザ動作 — トークンはデバイスから外に出ません。登録不要、追跡なし。

JWT エンコーダー&ジェネレーター

セキュリティツール

無料のオンラインJWTジェネレーター&エンコーダー。ヘッダーとペイロードを組み立て、HS256、RS256、ES256で即座に署名できます。100%ブラウザ動作 — シークレットと鍵はデバイスから外に出ません。

MD5ハッシュジェネレーター&ファイルチェックサムツール

セキュリティツール

無料オンラインMD5ハッシュ生成ツール。ブラウザ上でMD5・SHA-256・SHA-1・SHA-512のハッシュ値を即座に生成。テキストやファイルのチェックサム検証・比較、ワンクリックコピー対応。登録不要でデータはサーバーに送信されません。

ランダムパスワード生成 — カスタマイズ可能&安全

セキュリティツール

無料のオンラインランダムパスワード生成ツール。ブラウザ上で安全な強力パスワードを即座に自動生成できます。長さや文字種のカスタマイズ、最大50個の一括生成に対応。エントロピー分析付き強度メーター搭載。データはサーバーに送信されません。

SHA-1ハッシュジェネレーター(160ビット・レガシー)

セキュリティツール

ブラウザ上でSHA-1ハッシュを生成。40文字の16進数出力、アップロード不要。Gitコミット確認・旧証明書フィンガープリント検証・移行監査向けレガシーツール。データはデバイス外に出ません。