ソルト/ランダムトークン生成器
暗号crypto.getRandomValues で暗号学的に安全なランダムソルトとトークン(Hex または Base64)を生成します。
このページの内容
ソルトとは?#
ソルトは、ハッシュ処理に混ぜ込むランダムデータであり、同じ入力 2 つが異なる出力を生成するようにするものです。その役割は秘匿ではなく一意性です: ソルトはそれが保護するハッシュの隣に平文で置かれてよく、それでも同じパスワードを持つすべてのユーザーが同じダイジェストにハッシュされることに依存する攻撃を打ち破ります。各パスワードが独自のソルトを持てば、攻撃者はデータベース全体で 1 つの事前計算テーブルを再利用できず——エントリごとに再計算しなければなりません。
このページは crypto.getRandomValues で暗号学的に強いランダムバイトを生成し、3 つのエンコードで渡します: Hex(1 バイトあたり 2 文字、パスワードソルトや完全性トークンの慣習)、Base64(よりコンパクト)、Base64url(+// を -/_ に置き換え = 詰めを落とした、URL とファイル名に安全な変種で、JWT や署名付き URL で使われます)。
同じプリミティブは汎用のランダムトークン生成器としても働きます: API キー、nonce 値、不透明な ID、ワンタイムトークンはすべて「ランダムバイトをテキストとしてエンコードしたもの」であり、まさにこれが生成するものです。
使い方#
- バイト数を設定します。既定の 16(128 ビット)が標準的なソルトサイズです。フィールドは、より長いトークンが必要な場合に最大 8192 まで受け付けます。
- 出力形式を選びます: Hex、Base64、Base64url。
- 生成をクリックし、コピーします。ステータス行は結果が表すエントロピーのビット数(バイト数 × 8)を示すため、要求したものが得られたかをひと目で確認できます。
主な特徴#
- 偏りのないランダムバイト。 ブラウザの暗号学的に強い生成器である
crypto.getRandomValuesから取得します。 - 3 つのエンコード。 ソルトとチェックサムには Hex、コンパクトなトークンには Base64、URL・ファイル名・JSON で移動するものには Base64url。
- 正直なエントロピー報告。 ステータス行は、読み間違えやすいエンコード文字列長ではなく、実際のビット数を述べます。
- 最大 8192 バイト。 同じツールが 16 バイトのソルトも 256 バイトの鍵の塊も扱います。
- ゼロアップロード。 生成はローカルです。ランダムバイトが送信されることはありません。
実例#
3 つの形式それぞれで 16 バイトを生成します。16 バイトの抽出は 128 ビットのエントロピーで、エンコード長はランダム値によらず固定です:
- Hex — 32 文字、例
7a4c9f1e0b8d2635c4a1e9f07b2d4861 - Base64 —
==詰め付き 24 文字、例8MDwarqMD7B594C5hCB1zQ== - Base64url — 22 文字、詰めなし、例
8MDwarqMD7B594C5hCB1zQ
(上の値は形を示すものです。バイトは毎回新しくランダムなため、実際の出力は毎回異なります。)256 ビットのソルトや鍵のために 32 バイトに増やすと、長さは決定論的に伸びます: Hex 64 文字、Base64 44 文字、Base64url 43 文字。このバイト数とエンコード長の固定関係は、意図したサイズを生成したかを妥当性チェックする手軽な方法です。
よくある質問#
ソルトは秘密にする必要がありますか?#
いいえ。ソルトの目的は一意性です——同じパスワードを 2 回ハッシュして異なるダイジェットになることを保証します。ハッシュと並べて平文で保存され、それで方式が弱まることはありません。秘密にしておかなければならないのは、HMAC の鍵や暗号化のパスワードであり、ソルトではありません。
何バイト生成すべきですか?#
16 バイト(128 ビット)がパスワードソルトとほとんどのトークンに標準です——偶発的な衝突を実質的に不可能にします。セッショントークンや、資金力のある攻撃者に対して長く持ちたいものには、32 バイト(256 ビット)が快適な余裕です。それ以上は、特定のプロトコルが要求しない限り、通常は過剰です。
Base64 と Base64url の違いは何ですか?#
どちらも同じバイトをエンコードしますが、Base64 は URL とファイル名を壊す + と / を使い、= で詰めます。Base64url はそれらを - と _ に置き換え、詰めを落とすため、結果はエスケープなしで URL のパス、クエリ文字列、ファイル名に直接落とせます。JWT、署名付き URL、不透明なトークンには Base64url を使い、出力がデータフィールドの中に留まるなら通常の Base64 を使います。
API キーとして使えますか?#
はい。Base64url で 32 バイトを生成すれば、256 ビットのエントロピーを持つ 43 文字のトークンが得られます——API キーや長寿命のベアラトークンには十分すぎるほどです。値はローカルで生成され後から復元できないため、必ずすぐにコピーしてください。