パスフレーズとは、どんなときに向くのか
「Xk7#mQ2!」のようなランダムな文字列は推測されにくい反面、覚えられません。逆に「password1!」のように覚えやすい文字列は、攻撃者の辞書にすでに載っています。 パスフレーズは、ランダムに選んだ複数の単語(例: river-castle-thunder-violin)をつなげて、この両方を満たそうとする方法です。強さを決めるのは、単語リストの大きさ、引く単語の数、そして本当にランダムに選んだかどうかの3点だけです。 自分で響きのよい単語を選んで組み合わせると、ランダム性が失われ、このページの計算は成り立ちません。 パスワードマネージャーのマスターパスワード、ディスク暗号化、PCのログインなど、頭の中から取り出して入力する場面に特に向いています。
エントロピーの計算方法
エントロピー(ビット)は、作り方を攻撃者が知っていても、秘密を特定するまでに必要な「はい/いいえ」の質問の数にあたります。N個の中から1つを均等に選ぶと log2(N) ビット、独立に引くたびに同じ量が加算されます。 この生成機のリストは英単語100語なので、1語あたり log2(100) = 6.64ビットです。従来のDiceware(サイコロを5回振って選ぶ7,776語)は1語あたり約12.92ビットです。 つまり同じ単語数なら、このツールの結果は本物のDicewareの約半分の強さです。そのため単語数を最大12まで選べるようにし、画面に出るエントロピーも実際のリストの大きさから計算しています。 数字を1桁足しても log2(10) = 3.32ビットしか増えないので、短いフレーズに数字を添えても効果は小さいままです。
単語数別の強度表(ビルド時に計算)
| 単語数 | 組み合わせ数 | エントロピー(ビット) | 平均推測時間(毎秒100億回) | 平均推測時間(毎秒1万回) | 参考: 7,776語リストの場合のビット |
|---|---|---|---|---|---|
| 3 | 1.00 × 10^6 | 19.9 | 1秒未満 | 50.0秒 | 38.8 |
| 4 | 1.00 × 10^8 | 26.6 | 1秒未満 | 1.4時間 | 51.7 |
| 5 | 1.00 × 10^10 | 33.2 | 1秒未満 | 5.8日 | 64.6 |
| 6 | 1.00 × 10^12 | 39.9 | 50.0秒 | 1.6年 | 77.5 |
| 8 | 1.00 × 10^16 | 53.2 | 5.8日 | 15,855年 | 103.4 |
| 10 | 1.00 × 10^20 | 66.4 | 159年 | 1.6 × 10^8年 | 129.2 |
| 12 | 1.00 × 10^24 | 79.7 | 1.6 × 10^6年 | 1.6 × 10^12年 | 155.1 |
時間は「全体の半分を試せば平均的に当たる」という単純な見積もりで、毎秒の試行回数は仮定値です。毎秒100億回は、高速なハッシュで保存されたパスワードファイルが流出し、手元で総当たりされる状況を、毎秒1万回は、試行回数を制限するオンラインサービスに近い状況を想定しています。 実際の速度は、保存方式(bcryptやArgon2のように意図的に遅いハッシュだと桁違いに遅くなる)、攻撃側の機材、ロック方針で大きく変わります。表は選択肢を比べるための物差しとして使ってください。
検算した計算例
例1: 4単語。 100語のリストから4単語なら 100^4 = 1億通り、26.6ビットです。平均5,000万回の推測で当たるので、毎秒100億回の攻撃では1秒未満しかかかりません。 「4単語で十分」という有名な助言は7,776語のリスト(4単語で51.7ビット)を前提にしたもので、小さなリストにはそのまま当てはまりません。既定値を4ではなく8にしているのはこのためです。
例2: 8単語。 100^8 = 10^16 通り、53.2ビットです。表のとおり、手元での高速攻撃で平均5.8日、回数制限のある環境を想定すると15,855年です。 オフライン攻撃にも耐えるマスターパスワードなら、10単語(66.4ビット)から12単語(79.7ビット)が目安です。数値はNodeで同じ式 n × log2(100) を計算し直して確認しています。
乱数の作り方と、入力データの扱い
単語の選択には、ブラウザの暗号論的乱数 crypto.getRandomValues を使います。予測される可能性のある Math.random() は、秘密の生成には向かないため使いません。 32ビットの乱数を単に100で割った余りにすると、2^32 が100の倍数ではないため、先頭付近の単語がごくわずかに出やすくなります。そこで、100の最大の倍数を超える値は捨てて引き直す「棄却サンプリング」を行い、すべての単語の確率を等しくしています。 同じ単語が2回以上出ることがありますが、重複を許す(復元抽出)からこそ上の表が正確になります。
スクリプトにはネットワーク送信も保存もログ出力もなく、フレーズはページを閉じるか再読み込みするまで画面上にしか存在しません。暗号論的乱数が使えないブラウザでは、弱い代替手段にはせずに生成を中止します。 ただし、画面共有、肩越しののぞき見、悪意のあるブラウザ拡張、履歴を残すクリップボード管理ツールまでは防げません。コピーした後は貼り付け先に入れてから、無害な文字列をコピーして上書きしておくと安心です。
よくある失敗と限界
気に入るまで引き直す。 何十回も生成して覚えやすいものを選ぶと、探索範囲が実質的に狭まります。最初に出たものを使うか、引き直す代わりに単語を1つ増やしてください。単語を手で書き換える。 言いにくい単語を差し替えるとその位置のランダム性が失われます。a を @、o を 0 に置き換える程度の変形は、攻撃側が最初に試すので効果がほとんどありません。複数のサービスで使い回す。 1か所から漏れると他のアカウントも危険です。重要なアカウントごとに別のフレーズを使うか、残りはパスワードマネージャーに任せましょう。すべての入力欄に合うとは限らない。 単語は英語の小文字です。文字数の上限、空白の拒否、大文字や記号の必須などがあるサービスでは、区切り記号を変えるか、パスワード生成機で短いランダム文字列を作る方が向いています。
結果の使い方
新しいマスターパスワードなら、生成したフレーズを一度だけ紙に書き、数日間それを見ながら入力して指に覚えさせ、覚えたら紙を処分するのが現実的です。区切り記号でつまずくならハイフンに統一してください。 既存のパスワードの目安を見たいときは、パスワード強度チェッカーが長さと文字種から推定値を示します(単語リストから選んだことまでは考慮しません)。 規模感の比較として、94種類の印字可能なASCII文字から完全にランダムに選んだ8文字は約52.4ビット、12文字は約78.7ビットで、このリストの8単語(53.2ビット)と12単語(79.7ビット)がそれぞれ同程度です。
よくある質問
単語数はいくつにすればよいですか?
100語のリストでは1語あたり約6.64ビットです。ログイン試行を制限する一般的なサービスなら6〜8単語(約40〜53ビット)、手元で攻撃される恐れのあるマスターパスワードやディスク暗号化なら10〜12単語(約66〜80ビット)を目安にしてください。
なぜ既定値が4単語ではなく8単語なのですか?
リストが小さいためです。100語から4単語では約26.6ビットしかなく、手元での総当たりなら1秒もかかりません。「4単語」の目安は7,776語のリストを前提にしています。
生成したパスフレーズはサーバーに保存・送信されますか?
いいえ。スクリプトはブラウザ内で動作し、通信も保存も行いません。再読み込みすると消えます。ただしコピーするとクリップボードに残るので、共有端末では後で上書きしてください。
数字や大文字を混ぜると安全になりますか?
ランダムな数字1桁は約3.3ビットしか増やしません。習慣的に先頭を大文字にしても、攻撃側が早い段階で試すため効果はほぼありません。確実なのは単語をもう1つ足すことで、1語あたり6.64ビット増えます。
Dicewareと同じ方式ですか?
ランダムな単語をつなげる考え方は同じです。違いは、Dicewareが7,776語のリストと実物のサイコロを使うのに対し、このツールは100語のリストとブラウザの暗号論的乱数を使う点です。1語あたりの強さが約半分なので、単語数で補う設計です。単語は英語で、日本語のフレーズは作りません。
関連ツール
- パスワード強度チェッカー - すでに使っているパスワードの目安を確認
- パスワード生成機 - 文字数と文字種を選べるランダム文字列
- ハッシュ生成機 - パスワードがハッシュに変わる様子を確認
- UUID生成機 - ランダムな識別子を作成