ランダムな Base64 を生成する方法
- バイト に必要なランダム量を 1~4096 の範囲で指定します。デフォルトの 32 バイトは 256 ビットです。
- 形式 を選びます。Base64、Base64URL(URLセーフ、パディングなし)、16進数のいずれかです。Base64 では パディングなし(=) にもチェックを入れられます。
- 複数の値をまとめて作るには 個数 を設定します。最大 1000 個で、1 行に 1 つずつ出力されます。
- 出力をコピーするか、テキストファイルとしてダウンロードします。新しい値が欲しければ 再生成 を押します。出力の下の エントロピー と 長さ には、ランダム性のビット数と文字数が表示されます。
Laravel の APP_KEY や AES-256 鍵など、特定の形式の鍵が必要な場合は、上部の プリセット から選んでください。各プリセットについては Base64 鍵生成ツール で解説しています。
出力の長さ
ランダム性を決めるのはバイト数で、形式は書き表し方を決めるだけです。Base64 は 1 文字に 6 ビット、16進数は 4 ビットしか詰め込めないので、同じ強度なら16進数のほうが常に長くなります。
| バイト | ビット | Base64 | Base64(パディングなし) | Base64URL | 16進数 |
|---|---|---|---|---|---|
| 8 | 64 | 12 | 11 | 11 | 16 |
| 16 | 128 | 24 | 22 | 22 | 32 |
| 24 | 192 | 32 | 32 | 32 | 48 |
| 32 | 256 | 44 | 43 | 43 | 64 |
| 48 | 384 | 64 | 64 | 64 | 96 |
| 64 | 512 | 88 | 86 | 86 | 128 |
バイト数が 3 で割り切れる場合(24、48)は = がまったく付かないので、パディングあり・なしの列が同じになります。値を URL、ファイル名、Cookie に入れる場合は Base64URL を使ってください。そこでは + と / のエスケープが必要になるからです。
何バイトにすべきか
- 一意な ID、リクエスト ID、アップロードファイル名: 16 バイト(128 ビット)。推測や衝突は現実的な問題になりません。
- セッショントークン、API トークン、パスワードリセット用リンク: 32 バイト。余裕を持たせても増えるのは 20 文字ほどです。
- パスワードハッシュ用のソルト: 16 バイトが一般的な推奨値です。ソルトは秘密である必要はなく、一意であればかまいません。
- テスト用データ: サイズは自由です。個数 を使えば、1000 個の値を一度にファイルに書き出せます。
ランダム文字列の強度はバイト数で決まります。44 文字の値をフィールドに収めるために 20 文字に切り詰めると、エントロピーの半分以上を捨てることになります。切り詰めるのではなく、バイト数を小さくして出力全体を使ってください。
ターミナルやコードで同じことをする
以下はどれも 32 バイトのランダム値を Base64 で出力します(secrets.token_urlsafe は URLセーフのアルファベットで、パディングなしで出力します)。
openssl rand -base64 32
head -c 32 /dev/urandom | base64
import base64, secrets
print(base64.b64encode(secrets.token_bytes(32)).decode())
print(secrets.token_urlsafe(32))
Node.js では crypto.randomBytes(32).toString("base64url") で URLセーフ形式が得られます。OpenSSL には落とし穴が一つあります。48 バイトを超えると openssl rand -base64 は出力を 64 文字で折り返すので、64 バイトの値は 2 行になります。1 行で得るには openssl rand 64 | openssl base64 -A を使うか、設定ファイルに書く前に改行を取り除いてください。ほかのレシピは OpenSSL と Python のページにあります。
よくある質問
この乱数生成はパスワードやトークンに使えるほど安全ですか?
はい。ブラウザの暗号論的に安全な乱数生成器 crypto.getRandomValues を使っています。秘密にすべき値に Math.random() は使わないでください。予測不能になるようには設計されていません。
ちょうど N 文字のランダムな Base64 文字列を作るには?
N × 3 ÷ 4 バイトを選びます。バイト数が 3 で割り切れればパディングは付かないので、33 バイトならちょうど 44 文字、48 バイトなら 64 文字です。それ以外の場合は パディングなし(=) にチェックを入れると、長さは ⌈4 × バイト数 ÷ 3⌉ になります。
生成した値が重複することはありますか?
理論上はありえますが、16 バイト(128 ビット)以上なら確率は無視できるほど小さく、衝突が起こりそうになるまでに約 2^64 個の値が必要です。一意なランダム ID の最低ラインとして 16 バイトがよく使われるのはこのためです。
値はどこかに保存されますか?
いいえ。コピーするかダウンロードするまで、このタブのメモリ上に保持されるだけです。ページは Cloudflare のページビュー計測以外のネットワーク通信もできません。再読み込みすれば消えます。