無料 JWT シークレット生成ツール — HS256/384/512
HS256/384/512 向けの強力で RFC 準拠の JWT シークレットを生成。100% ブラウザ内で処理し、サーバーには一切送信されません。base64url・base64・hex で .env 用にコピー。
同等の CLI コマンド
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
署名アルゴリズムを選ぶ
HS256・HS384・HS512 を選択します。本ツールはその HMAC 種別に対して RFC 7518 §3.2 の最小鍵長(32・48・64 バイト)を即座に適用するので、数値を調べたり鍵が短くなりすぎたりする心配はありません。
- 2
出力形式を選ぶ
base64url が既定で、JWT のネイティブな URL セーフ・パディングなしの符号化です。ローダーが要求するなら標準 base64 に、0〜f の文字しか受け付けないシステムなら hex に切り替えます。3 つとも同じランダムバイトを同一のエントロピーで符号化します。
- 3
シークレットを表示してコピーする
シークレットは既定でマスクされ、デモや画面共有の最中に画面に出ないようになっています。目のアイコンをクリックして表示し、Copy で生の値を取得するか、Copy for .env で .env ファイルや CI 変数用の JWT_SECRET=… 行をコピーします。
- 4
必要に応じて再生成する
Regenerate をクリックすると、crypto.getRandomValues から引き出した新しく独立したシークレットが得られます。環境ごとに 1 つ生成してください。同じ署名鍵を開発・ステージング・本番で再利用してはいけません。
- 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 シークレットはサーバーに送信されますか?
安全な JWT シークレットはどう生成すればよいですか?
HS256 の JWT シークレットはどのくらいの長さが必要ですか?
base64url・base64・hex の違いは何で、どれを選ぶべきですか?
弱い JWT シークレットは破られますか?
JWT シークレットにパスワードを使えますか?
稼働中のトークンを壊さずに JWT シークレットをローテーションするには?
HMAC(HS*)鍵は RSA や ECDSA(RS*/ES*)鍵とどう違いますか?
関連ツール
すべてのツールを見る →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コミット確認・旧証明書フィンガープリント検証・移行監査向けレガシーツール。データはデバイス外に出ません。