本文へスキップ

ランダムキー生成

Random Key Generator

暗号学的な乱数バイトを指定した長さで16進・Base64・Base64URLとして生成し、アプリのシークレットに使えるようにします。

`SECRET_KEY`やJWTの署名鍵には、決められた長さの無作為なバイト列を、決められた符号化で置く必要があります。よくあるその場しのぎ、つまりキーボードを適当に叩いたもの、UUID、プロジェクト名のハッシュは、どれも見た目よりエントロピーが足りません。ここではそのバイト列を生成して符号化します。

🔒 ブラウザの中だけで動きますrandomkeysecretgenerator

ランダムなシークレット

muku2V-eL-RMqLypbBA5sbhBIm_uIl5Q0kuK1VO-Hdc
JWK(oct)として見る
{
  "kty": "oct",
  "k": "muku2V-eL-RMqLypbBA5sbhBIm_uIl5Q0kuK1VO-Hdc",
  "ext": true
}

WebCrypto の鍵

本物の CryptoKey を JWK として書き出したものです。crypto.subtle にそのまま渡せます。

どのバイトも crypto.getRandomValues から出ていて、このタブの外には出ません。サーバーで作ることも、サーバーへ送ることもありません。

使い方

  1. バイト数を選びます

    32バイト(256ビット)でほとんどのものは足ります。HMAC-SHA256、AES-256、セッションの鍵などです。これらについては、長くしても強くはなりません。役に立つ長さはアルゴリズムが決めます。

  2. 設定が求める符号化を選びます

    16進は曖昧さがなく、長さは2倍になります。Base64URLは`+`、`/`、`=`を避けるので、URLやヘッダー、あるいは何かが解析する`.env`ファイルに置くならそちらです。

  3. リポジトリではなく、秘密の保管場所に置きます

    一度コミットされた鍵は、そのコミットをどれだけ速く取り消しても、差し替えなければならない鍵です。環境ごとに別の鍵を生成してください。

よくある質問

無作為さはどこから来ていますか。

ブラウザのCSPRNGである`crypto.getRandomValues`で、OSから種を得ています。送信されるものも保存されるものもありません。

ブラウザで作った鍵は`openssl rand`で作った鍵と同じくらい良いものですか。

無作為さの質は同じです。どちらもOSから引いています。違うのは、鍵がどこに表示されるかです。画面の上であり、その画面は同期しているブラウザかもしれませんし、DOMを見ている拡張機能が入っているかもしれません。自分の管理下にない端末では、コマンドラインを使ってください。

これをUUIDに使えますか。

代わりにUUID生成を使ってください。UUIDv4は決まった配置を持ち、6ビットをバージョンとバリアントに使うので、素の無作為な文字列は正しいUUIDになりません。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。