シークレットキージェネレーター

openssl rand なしで、ブラウザで直接作るランダムキー・シークレット

値はこのブラウザの中だけで作られます。
ブラウザの crypto.getRandomValues() で生成し、サーバーには送信せず、保存も記録もしません。アドレスバー(URL)やブラウザのストレージにも残さないため、このページを閉じると値は消えます。コピーした値の保管は利用者の責任です。

鍵長(バイト)
8〜512バイトまで指定できます。既定値の48バイトは openssl rand -base64 48 と同じ長さです。
Base64
標準の Base64。英大文字・小文字と数字、+ / を使います。環境変数や設定ファイルにそのまま書き込む、最も一般的な形式です。
Hex
16進数。0-9 と a-f しか使わないため、どこに書いてもエスケープが不要ですが、同じバイト数なら最も長くなります。
Base64URL
+ / を - _ に置き換え、パディング(=)を取り除いた形式。URL・Cookie の値・JWT にエンコードなしでそのまま入れられます。
バイト数と文字数は違います

鍵の強度を決めるのは文字数ではなくバイト数です。48バイトは384ビットの乱数で、それを Base64 で書くと64文字になります。64文字の文字列を見て「64バイトの鍵」と呼ぶと実際より強く見えてしまうため、このツールは常に両方の数値を併記します。

同じ48バイトを形式ごとに書くと

形式 48バイトのときの文字数 使用される文字
Base64 64文字 A-Z a-z 0-9 + /
Hex 96文字 0-9 a-f
Base64URL 64文字 A-Z a-z 0-9 - _

Base64 は3バイトを4文字で表します。そのため、バイト数が3の倍数のときだけパディング(=)なしでちょうど割り切れます。48は3の倍数なので64文字きっかりになり、32バイトのように3の倍数でない場合は末尾に = が付きます。

どこに何バイト使えばよいですか
用途 推奨の長さ 推奨の形式
セッションシークレット・Cookie 署名鍵 32バイト Base64
JWT 署名鍵(HS256) 32バイト Base64URL
API キー・Webhook 検証トークン 32バイト Base64URL
AES-256 鍵 32バイト Hex
余裕を持たせたいとき(既定値) 48バイト Base64

32バイト(256ビット)を超えると、総当たりで当てることは現実的に不可能になります。それより長くしても大半は余裕にすぎず、実質的な強度の差はありません。長さを伸ばすよりも、鍵をどこにどう保管するかに時間を使うほうが有効です。

なぜサーバーではなくブラウザで生成するのですか

サーバーが鍵を生成して送り返すと、その値がサーバーのアクセスログや中間プロキシ、エラー追跡ツールに残る可能性があります。一度でも残れば、その鍵はもう秘密ではありません。このツールはブラウザで生成し、ネットワークに一切流さない方式を選びました。

乱数は crypto.getRandomValues() から取得します。OS が提供する暗号学的に安全な乱数源のため、次の値を予測できません。Math.random() は予測可能で鍵の生成に使ってはならず、このツールでは使用していません。

自分で確かめたい場合は、開発者ツールのネットワークタブを開いたまま「新しく生成」を押してみてください。リクエストは一切発生しません。このページを保存してインターネット接続なしで開いても、同じように動作します。