パスワード生成機

ブラウザの暗号論的乱数(crypto.getRandomValues)でパスワードを作り、その強さをエントロピーと推定解読時間で示します。サーバーへの送信や保存は行いません。

-
推定強度: -文字プール: -平均解読時間(毎秒100億回と仮定): -

この生成機がパスワードを作る仕組み

ボタンを押すと、ブラウザが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回間違えるとロックされるサービスなら実用に耐えます。同じ秘密でも、攻撃者がどれだけ速く試せるかで安全度は大きく変わります。

設定の目安

複雑さのルールより、長さとランダム性

「大文字・数字・記号を1つずつ入れる」というルールは、人が自分で決めるパスワードでは Password1! や Summer2024! のような見え透いた変形を生みがちです。攻撃ツールは、こうしたパターン(単語+数字+末尾の記号、文字を記号に置き換えるなど)を辞書に組み込み、最初に試します。 米国NISTのデジタルアイデンティティ指針(SP 800-63B)は、構成ルールの強制や定期変更を避け、十分な長さを許容し、漏えい済みパスワードの一覧と照合する方向を示しています。最小文字数などの具体的な数字は改訂ごとに異なるため、運用ルールを決めるときは最新の文書を確認してください。 ランダムに生成した文字列には、こうした人間の癖がないという点が根本的に違います。

よくある失敗と誤解

このツールの限界と、使ってはいけない場合

生成した後にすること

  1. コピーしたパスワードをまずパスワードマネージャーに保存し、そのあとでサイトの変更画面に貼り付けます。順序を逆にすると、保存前にタブを閉じてアカウントに入れなくなるおそれがあります。
  2. 2段階認証を有効にします。パスワードが漏れても、2枚目の壁が残ります。
  3. 同じパスワードを使っていた他のサイトも一緒に変更します。
  4. 既存のパスワードの強さが気になるときはパスワード強度チェッカーを使いますが、実際のパスワードそのものではなく似た構成の文字列で試す方が安全です。

関連ツール: ハッシュ生成機(保存されたパスワードがハッシュになる様子の確認)、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です。

十分に長ければ、同じパスワードを複数のサイトで使ってもよいですか?

いいえ。長さが防ぐのは総当たり攻撃だけです。あるサイトで平文や弱いハッシュで漏れれば、その値がそのまま他のサイトに試されます。長さに関係なく、サイトごとに別のパスワードを使ってください。

この記事は一般的な情報提供を目的としており、組織のセキュリティポリシーや専門家への相談に代わるものではありません。