この生成機がパスワードを作る仕組み
ボタンを押すと、ブラウザがOSの安全な乱数源から値を受け取る crypto.getRandomValues() を使って、1文字ずつ選びます。 チェックした文字種ごとに、まず1文字ずつ必ず配置し、残りの位置は選択した文字種をすべて合わせたプールから引き、最後に全体をランダムに並べ替えます。そのため「4種類を選んだのに数字が1つも入っていない」ということは起こりません。
乱数を文字に変換する際にありがちな落とし穴が2つあり、このツールはどちらも避けています。1つ目は、32ビットの乱数をプールの大きさで割った余りにすると、プールの大きさが2の累乗でない場合に先頭側の文字がごくわずかに出やすくなる偏り(剰余バイアス)です。偏りが出る範囲の値を捨てて引き直す(棄却サンプリング)ことで、全文字の確率を等しくしています。 2つ目は、文字を選んだ乱数を並べ替えにも流用すると両者が関連してしまうことです。並べ替え(フィッシャー–イェーツ)は、入れ替えのたびに新しい乱数を引いて行います。
エントロピーと解読時間の読み方
エントロピーは、作り方を攻撃者が知っているとき、可能なパスワードを何回試す必要があるかを2の累乗の指数で表した値です。文字プールの大きさがN、長さがLで、各文字を独立かつ一様に選ぶなら、組み合わせはN^L通りで、エントロピーは L × log2(N) ビットです。1ビット増えるごとに組み合わせは2倍になります。 平均すると全体の半分を試した時点で当たるので、平均解読時間は 2^(ビット−1) ÷ 毎秒の試行回数 で計算します。このページの表と画面は、毎秒100億回という仮定を使っています。流出したハッシュファイルを複数のGPUでオフライン攻撃する状況を単純化した値です。 実際の速度は、サービスが採用するハッシュ方式で数千倍以上変わります(bcryptやArgon2のように意図的に遅い方式なら1回の試行がはるかに高コスト)。時間は絶対的な寿命ではなく、設定同士を比べるための物差しとして見てください。
文字構成と長さ別のエントロピーと平均解読時間
ビルド時に計算した表です。各セルの上段がエントロピー(ビット)、下段が毎秒100億回と仮定したときの平均解読時間です。紛らわしい文字を除外しない全文字プール(大文字26、小文字26、数字10、記号18)を基準に、すべての文字を独立かつ均等な確率で選んだと仮定しています。
| 文字構成(プールの大きさ) | 6文字 | 8文字 | 10文字 | 12文字 | 16文字 | 20文字 |
|---|---|---|---|---|---|---|
| 数字のみ (10) | 20 ビット 1秒未満 | 27 ビット 1秒未満 | 33 ビット 1秒未満 | 40 ビット 50秒 | 53 ビット 6日 | 66 ビット 158年 |
| 小文字のみ (26) | 28 ビット 1秒未満 | 38 ビット 10秒 | 47 ビット 2時間 | 56 ビット 55日 | 75 ビット 7万年 | 94 ビット 316億年 |
| 小文字+数字 (36) | 31 ビット 1秒未満 | 41 ビット 2分 | 52 ビット 2日 | 62 ビット 8年 | 83 ビット 1,261万年 | 103 ビット 宇宙の年齢(約138億年)をはるかに超える |
| 大文字+小文字+数字 (62) | 36 ビット 3秒 | 48 ビット 3時間 | 60 ビット 1年 | 71 ビット 5,112年 | 95 ビット 755億年 | 119 ビット 宇宙の年齢(約138億年)をはるかに超える |
| 大小文字+数字+記号18種 (80) | 38 ビット 13秒 | 51 ビット 23時間 | 63 ビット 17年 | 76 ビット 11万年 | 101 ビット 宇宙の年齢(約138億年)をはるかに超える | 126 ビット 宇宙の年齢(約138億年)をはるかに超える |
注目すべきは、種類を増やすより長さを増やす方がはるかに効くことです。小文字だけの20文字(94ビット)は、プールが26しかなくても、全80種類から選んだ10文字(63ビット)を上回ります。1文字増やすと組み合わせがプールの大きさ倍になるのに対し、記号を足してプールを広げる効果は対数でしか効かないためです。
検算した計算例
例1: 既定値(16文字、4種類すべて)
紛らわしい文字を除外した状態のプールは、大文字24 + 小文字25 + 数字8 + 記号18 = 75文字です。 エントロピーは 16 × log2(75) ≈ 100ビット、毎秒100億回の仮定での平均解読時間は宇宙の年齢(約138億年)をはるかに超えるです。 (各文字種を最低1文字含める規則のため、実際の組み合わせ数は上の計算よりごくわずかに少なくなりますが、16文字では無視できる差です。)
例2: 小文字+数字の12文字(紛らわしい文字を除外)
プールは25 + 8 = 33文字なので、12 × log2(33) ≈ 61ビット、平均解読時間は3年です。ロックアウトのあるオンラインのログインには十分ですが、ハッシュが流出してオフライン攻撃を受けうる重要なアカウントには16文字以上をおすすめします。
例3: 数字6桁のPIN
10種類の数字が6桁で 6 × log2(10) ≈ 20ビット、組み合わせはちょうど100万通りです。オフラインなら1秒未満で終わりますが、5回間違えるとロックされるサービスなら実用に耐えます。同じ秘密でも、攻撃者がどれだけ速く試せるかで安全度は大きく変わります。
設定の目安
- メール、金融、クラウドなどの中核アカウント: 16文字以上で4種類すべて。パスワードマネージャーに保存し、2段階認証も有効にします。
- 一般的なショップ・コミュニティ: 12〜16文字。サイトごとに必ず別の値にします。1か所から漏れると、同じ値を使う他のサイトにも試されます(クレデンシャルスタッフィング)。
- 記号を受け付けない、または一部しか使えないサイト: 記号をオフにして、4〜6文字長くして補います。
- 手で入力するパスワード(テレビ、ゲーム機、Wi-Fi): 「紛らわしい文字を除外」をオンのままにすると、大文字のIと小文字のlと数字の1、大文字のOと数字の0の取り違えを防げます。プールが小さくなる分は1〜2文字長くして補います。
- 暗記が必要なマスターパスワード: ランダムな記号列より、単語をつなげたものの方が覚えやすいです。パスフレーズ生成機をお試しください。
複雑さのルールより、長さとランダム性
「大文字・数字・記号を1つずつ入れる」というルールは、人が自分で決めるパスワードでは Password1! や Summer2024! のような見え透いた変形を生みがちです。攻撃ツールは、こうしたパターン(単語+数字+末尾の記号、文字を記号に置き換えるなど)を辞書に組み込み、最初に試します。 米国NISTのデジタルアイデンティティ指針(SP 800-63B)は、構成ルールの強制や定期変更を避け、十分な長さを許容し、漏えい済みパスワードの一覧と照合する方向を示しています。最小文字数などの具体的な数字は改訂ごとに異なるため、運用ルールを決めるときは最新の文書を確認してください。 ランダムに生成した文字列には、こうした人間の癖がないという点が根本的に違います。
よくある失敗と誤解
- 「記号を入れれば安全」:
P@ssw0rd!は記号が3つもありますが、最初に試される典型です。大切なのはランダム性です。 - 「生成したものを暗記しなければならない」: その必要はありません。管理アプリに覚えさせ、頭の中に残すのはマスターパスワード1つにします。
- 「定期的に変えないと危ない」: 重要なのは、漏えいの疑いがあるときにすぐ変えることです。変更を強制すると、末尾の数字を1つ増やすだけの弱いパターンが増えるという指摘があります。
- エントロピーの値を絶対的な時間と解釈する: このページの時間は仮定に基づく比較用の推定値で、ハッシュ方式、試行回数の制限、流出の有無で現実は大きく変わります。
- 生成したパスワードをチャットやメモ帳に平文で保存する: 最もよくある漏えい経路です。コピーしたらすぐ管理アプリに貼り付け、クリップボードは別の内容で上書きしておきましょう。
このツールの限界と、使ってはいけない場合
- このツールはブラウザ内だけで動作しますが、ブラウザ拡張機能やマルウェアが入っている端末では画面の値が漏れる可能性があります。安全が疑わしいPCでは使わないでください。
- サービス側で使えない記号や文字数の上限(例: 最大12文字)がある場合は、その条件に合わせてオプションを調整してください。ここで使う18種類の記号の一部は、サイトによって拒否されることがあります。
- エントロピーは「ランダムに生成して手を加えていない」パスワードにだけ意味があります。覚えやすいように一部を書き換えると、計算は成り立ちません。
- 暗号鍵やAPIトークンのようにシステムが直接使う秘密値は、そのシステムが推奨する生成方法(例: 32バイトの乱数)に従ってください。
生成した後にすること
- コピーしたパスワードをまずパスワードマネージャーに保存し、そのあとでサイトの変更画面に貼り付けます。順序を逆にすると、保存前にタブを閉じてアカウントに入れなくなるおそれがあります。
- 2段階認証を有効にします。パスワードが漏れても、2枚目の壁が残ります。
- 同じパスワードを使っていた他のサイトも一緒に変更します。
- 既存のパスワードの強さが気になるときはパスワード強度チェッカーを使いますが、実際のパスワードそのものではなく似た構成の文字列で試す方が安全です。
関連ツール: ハッシュ生成機(保存されたパスワードがハッシュになる様子の確認)、UUID生成機(ランダムな識別子)。
よくある質問
生成されたパスワードは保存されたり、サーバーに送信されたりしますか?
いいえ。生成はすべてブラウザ内で行われ、ページを閉じるか再読み込みすると消えます。値を送信するコードはなく、ブラウザの保存領域にも書き込みません。ただしコピーすればクリップボードには残ります。
どれくらいの長さなら安全ですか?
4種類すべて(紛らわしい文字を除外した既定の設定)でランダムに作った場合、12文字は約75ビット、16文字は約100ビットです。一般的なサービスは12文字以上、メールや金融などの中核アカウントは16文字以上をおすすめします。上の表で長さ別の値を比べてみてください。
なぜ I、O、l、0、1 が既定で除外されているのですか?
フォントによっては大文字のI、小文字のl、数字の1がほぼ同じに見え、Oと0も紛らわしいためです。手で入力することが多いパスワードの入力ミスを減らす既定値です。チェックを外すと全80文字のプールから選びます。プールが少し小さくなっても、1〜2文字長くすれば十分補えます。
Math.random()で作ったパスワードと何が違いますか?
Math.random()は統計的な均一性のための関数で、セキュリティ用には設計されていません。多くの実装で、出力を観察すると内部状態から次の値を推測できます。crypto.getRandomValues()はOSの安全な乱数源を使い、予測が現実的に不可能になるよう設計されたAPIです。
十分に長ければ、同じパスワードを複数のサイトで使ってもよいですか?
いいえ。長さが防ぐのは総当たり攻撃だけです。あるサイトで平文や弱いハッシュで漏れれば、その値がそのまま他のサイトに試されます。長さに関係なく、サイトごとに別のパスワードを使ってください。
この記事は一般的な情報提供を目的としており、組織のセキュリティポリシーや専門家への相談に代わるものではありません。