鍵の生成方法
- 設定しようとしているものに合うプリセットをクリックします。ページを開いた時点では 32 バイト が選ばれています。
- ランダム値 から値をコピーします。Laravel や Auth.js のように設定行があるプリセットでは、すぐ貼り付けられる形式 にもその行が表示されます。
- 別の鍵が必要なら 再生成 を押します。個数 を増やせば、環境ごとに 1 つずつなど、複数の鍵をまとめて作れます。
プリセットはバイト数と形式を自動で設定します。どちらかの項目を変更すると、値はそのままで カスタム に切り替わります。
プリセットと各鍵の使い道
| プリセット | 得られるもの | 長さ | 主な設定先 |
|---|---|---|---|
| 16 / 32 / 64 バイト | ランダムなバイト列の Base64 | 24 / 44 / 88 | 汎用の鍵、ソルト、シークレット |
| Laravel APP_KEY | base64: + 32 バイト | 51 | .env の APP_KEY |
| AES-128 鍵 | 16 バイト、Base64 | 24 | AES-128-GCM または -CBC |
| AES-256 鍵 | 32 バイト、Base64 | 44 | AES-256-GCM または -CBC |
| HMAC シークレット | 32 バイト、Base64 | 44 | HMAC-SHA256 署名、Webhook |
| JWT HS256 シークレット | 32 バイト、Base64URL | 43 | HS256 トークン用の JWT_SECRET |
| Auth.js シークレット | 32 バイト、Base64 | 44 | AUTH_SECRET(旧 NEXTAUTH_SECRET) |
| Django SECRET_KEY | Django のアルファベットから 50 文字 | 50 | settings の SECRET_KEY |
| Rails secret_key_base | 64 バイト、16進数 | 128 | secret_key_base |
| API トークン | 32 バイト、Base64URL | 43 | Bearer トークン、招待リンク |
| UUID v4(Base64URL) | ランダムな UUID の短縮形 | 22 | コンパクトな ID。正規の UUID 表記も表示されます |
CSP nonce プリセットは用途が異なるため、専用ページの CSP nonce ジェネレーター があります。
サイズは各アルゴリズムに合わせています。AES の鍵はちょうど 16、24、32 バイトのいずれかで、それ以外は受け付けられません。RFC 7518 では HS256 のシークレットに 256 ビット以上を求めているため、JWT プリセットは 32 バイトです。ハッシュの出力より短い HMAC 鍵は HMAC を弱めるので、HMAC-SHA256 には 32 バイト、HMAC-SHA512 には 64 バイトのプリセットが適しています。Django プリセットは棄却サンプリングで 50 文字を選ぶため、アルファベットのどの文字も同じ確率で出現します。Django 自身の get_random_secret_key() と同じ挙動です。
Base64 の鍵はテキスト、鍵の実体はバイト列
コピーした値は、ランダムなバイト列を Base64 で表したものです。使う側のコードでは先にデコードする必要があります。
import base64, os
key = base64.b64decode(os.environ["AES_KEY"])
assert len(key) == 32
Node.js では Buffer.from(process.env.AES_KEY, "base64") で同じことができます。44 文字の文字列をそのまま AES ライブラリに渡すと、拒否される(Python なら AESGCM key must be 128, 192, or 256 bits、Node.js なら Invalid key length)か、緩いライブラリでは何も警告せずに間違ったバイト列を使ってしまいます。Laravel の base64: 接頭辞のように、フレームワークが自分の鍵を読む場合は、このデコードを自動で行います。
Base64URL と標準の Base64 はデコードすれば同じバイト列になりますが、パーサーはどちらを受け付けるかに厳しいことがよくあります。受け取る側がもう一方に対応していると分かっている場合を除き、プリセットが出力した形式のまま使ってください。
Fernet の鍵とその他の形式
Python の cryptography パッケージは、Fernet の鍵として 32 バイトをパディング付きの URLセーフ Base64 にした 44 文字を想定しています。JWT や API トークンのプリセットは = なしの URLセーフ形式を出力するので、末尾に 1 つ足すか、Python で生成してください。
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
それ以外の形式は、バイト数から考えます。カスタム を選び、ライブラリのドキュメントにあるバイト数を入力して、Base64、Base64URL、16進数のいずれかを選んでください。出力の長さについては ランダム Base64 ジェネレーター で解説しています。HMAC を Base64 で や AES 暗号化 を使えば、生成した鍵をすぐに試せます。
生成後の鍵の扱い
ここで生成した鍵は、コピーするまでこのタブの中にしか存在しません。コピーした後の安全性は、貼り付けた先次第です。本番用の鍵はプラットフォームのシークレットストアやシークレットマネージャーに保管し、環境ごとに別の鍵を使い、決してコミットしないでください。Git リポジトリに入ってしまった鍵は公開されたものとみなして交換すべきです。暗号鍵をローテーションするには、古いデータを再暗号化するか、復号用に古い鍵を残しておく必要があります。稼働中のシステムで APP_KEY を差し替える前に、その計画を立てておきましょう。
よくある質問
32 バイトの Base64 鍵を生成するには?
ページを開いた時点で 32 バイト プリセットが選ばれているので、出力にある鍵がすでにそれです。= で終わる 44 文字になります。ターミナルなら openssl rand -base64 32 で同じものが作れます。
44 文字の Base64 文字列をそのまま AES-256 の鍵として使えますか?
使えません。AES-256 に必要なのは生の 32 バイトで、44 文字はその Base64 表現です。先に文字列をデコードしてください。テキストのまま渡すと、Node.js なら “Invalid key length” のようなエラーになります。
artisan を使わずに Laravel の APP_KEY を生成するには?
Laravel APP_KEY プリセットを選び、APP_KEY=base64:… の行を .env にコピーします。php artisan key:generate が書き込むものと同じ形式で、base64: 接頭辞に、デフォルトの AES-256-CBC 暗号用の 32 バイトの乱数が続きます。
ここで Fernet の鍵を作れますか?
Fernet 用のプリセットはありません。32 バイト を選び、形式 を Base64URL にして、43 文字の末尾に = を 1 つ足してください。Fernet はパディング付きの URLセーフ Base64(44 文字)を想定しているからです。Python で Fernet.generate_key() を実行する方法もあります。
本番用の鍵をブラウザで生成しても安全ですか?
鍵は暗号論的に安全な乱数生成器 crypto.getRandomValues から作られ、ページがそれをどこかへ送信することはできません。より大きなリスクはその後の扱いです。鍵はシークレットマネージャーや保護された環境変数に置き、リポジトリには絶対に入れないでください。