パスワード生成ツール
crypto.getRandomValues を使用してブラウザ内で生成しています。送信・保存もURLへの記録も行わないため、リンクを共有しても漏えいしません。
入力した内容が保存・記録・共有されることはありません。
ブラウザ内で強力なランダムパスワードを生成します。曖昧な強度メーターではなく、実際のエントロピーをビット単位で表示します。データの送信・保存は行いません。
使い方
- 長さと使用する文字種を選びます。
- すぐに生成されます。「生成」を押すと新しく作り直せます。
- 個別に、またはまとめてコピーします。
複雑さより長さが効く
エントロピーは、長さに文字種の数の2を底とする対数を掛けたものです。この式の形そのものが、議論のすべてを物語っています。パスワードに1文字足すと、探索空間は文字種の数だけ掛け算で増えます。文字種を1つ丸ごと追加しても、増えるのは1回分だけです。小文字だけの16文字のパスワードは約75ビット、4種類すべてを使った12文字のパスワードは約79ビットです。記号を加えるより、小文字を4文字足すほうが効果があります。
大文字1つ、数字1つ、記号1つといった構成ルールが支持を失ったのはこのためです。理論上は数ビット増えますが、実際には人を同じようないくつかの予測しやすい置き換えへと追いやります。先頭を大文字にし、末尾に数字と感嘆符を付けるといったものです。攻撃者はそうしたパターンを明示的にモデル化しているので、このルールは安全になった気分を与えながら、パスワードを推測しやすくしてしまいます。NISTのSP 800-63Bが構成要件と定期的な変更の義務づけをどちらも取りやめ、代わりに長さと、既知の漏洩パスワードとの照合を推奨しているのはまさにこの理由からです。
エントロピーが測るのは文字列ではなく生成過程
多くの強度メーターが誤っているのがこの区別です。エントロピーは、どう選ばれたかという過程の性質であって、出てきた文字の性質ではありません。72種類の文字から一様に12文字を選ぶ生成器は、どの12文字になっても74ビットを生み出します。たまたま英単語の綴りになったものも含めて、ほかとまったく同じ強さです。
逆もまた成り立ち、こちらのほうが重要です。人が考え出したパスワードのエントロピーは、その人の選び方が持つ分しかなく、式が示す値よりはるかに小さくなります。人は空間のごく狭い片隅から選ぶからです。完成した文字列を見るだけのメーターにはこれが見えません。Tr0ub4dor&3に高い点を付けても、攻撃者の単語リストはすぐにそれを見つけてしまいます。
ここに表示している数値が正直なのは、生成過程がわかっているからです。偏りのない乱数源から、設定したとおりの文字種の中で、一様にランダムに選んでいます。文字列についての推測ではなく、抽選についての算数です。つまり、結果を手で書き換えた瞬間に、その数値は正しくなくなります。
パスフレーズ
ゲーム機のコントローラーで入力したり、電話越しに読み上げたりしなければならない場合は、ランダムな単語を並べたパスフレーズのほうが、同じ強さで扱いやすくなります。重要なのはランダムという言葉です。自分で作文するのではなく、サイコロや生成器を使ってリストから選んだものでなければなりません。
標準的なDicewareの単語リストには7,776語が収録されているので、1語あたり約12.9ビットになります。4語で約52ビットですが、それだけではもう十分ではありません。6語で約77ビットになり、パスワードマネージャーのマスターパスワードやディスク暗号化の鍵など、覚えておく必要があるものには妥当な目標です。ほかのすべてを守るものには7語か8語を使いましょう。
自分で思いついたフレーズには、これに近い強さはまったくありません。歌詞、名言、文法的に正しい文は、どれもパスワード解析用の辞書に大量に収録されており、文法そのものが空間を大きく狭めてしまいます。
アカウントを本当に守るもの
強度は、アカウントのセキュリティのうち生成器が手助けできる部分ですが、たいていは破られる部分ではありません。
破られるのは使い回しです。漏洩した認証情報は数時間のうちにほかのあらゆるサービスで試されるため、複数のサイトで1つのパスワードを共有していると、最も弱いサイトがすべてのサイトの安全性を決めてしまいます。攻撃者は平文を持っているので、使い回したパスワードのエントロピーがどれほど高くても役に立ちません。サイトごとに別々のパスワードを使うことが最も価値の高い習慣で、それを現実的にするのがパスワードマネージャーです。マネージャーは、人が目では見分けられないフィッシングページも見破ってくれます。
次が二要素認証で、SIMスワップで傍受されうるSMSではなく、パスキーやハードウェアキーが理想です。そして、自分の努力の限界もはっきりさせておく価値があります。サービス側がパスワードを不適切に保存していたり、平文で漏洩させたりすれば、あなたが何を選んでも関係ありません。これは、より長いパスワードではなく、サイトごとに異なるパスワードと二要素認証を使うべき理由です。
パスワードは実際にどう破られるのか
ログインフォームにパスワードを打ち込むオンライン推測は、多くの人が思い浮かべる攻撃ですが、実は最も効果が薄い方法です。レート制限とアカウントロックによって、1アカウントあたり数回の試行しかできないからです。本気の攻撃はすべてオフラインで起きます。ハッシュのデータベースが盗まれたあと、攻撃者を縛るのは手元のハードウェアだけになります。
オフラインのクラッキングはアルファベット順に総当たりするわけではありません。まず過去の漏洩から作られたワードリスト、つまり人々が実際に選んだ数億件のパスワードから始め、そこに変換ルールを次々と適用します。先頭を大文字にする、末尾に西暦を足す、aを@に置き換える、末尾に感嘆符を付ける。パスワードを強くしたつもりで人が加える変形は、まさにそのルールが網羅している範囲です。
クレデンシャルスタッフィングは最も安上がりな攻撃で、クラッキングすら不要です。ある漏洩から得たメールアドレスとパスワードの組み合わせを、ほかのあらゆるサービスに片っ端から試すだけで、成功率は商売として成り立つほど高いのです。多くの人が使い回しているからです。だからこそ、サイトごとに固有のパスワードを使っていれば、利用しているサイトの運用がずさんでも自分の身を守れます。
パスワードマネージャーとパスキーの実際
サイトごとに固有で高エントロピーなパスワードを持つ現実的な手段は、パスワードマネージャーしかありません。そして二つ目の利点はあまり語られません。見た目がそれらしいだけのドメインでは、マネージャーは自動入力しないのです。よくできたフィッシングページは人をだませますが、URLが一致しないためマネージャーはだませません。
パスキーは共有秘密そのものをなくすことで、さらに一歩進んでいます。鍵ペアが端末上で生成され、秘密鍵は端末から出ることがなく、サイトが保存するのは公開鍵だけです。つまりサイトのデータベースには盗む価値のあるものがなく、署名がオリジンに紐づいているためフィッシングの対象にもなりません。対応はブラウザ、OS、主要サービスのいずれでも広がっています。
移行は段階的で、雑然としたものになります。ほとんどのアカウントは今後何年もフォールバックとしてパスワードを残すでしょうし、リカバリーの導線はどちらの方式でも弱点であり、エコシステムをまたいだパスキーの同期もまだ足並みがそろっていません。提供されているところではパスキーを有効にし、それ以外では強固で固有のパスワードを使い続ける。これが現実的な立ち位置です。
チームや製品でポリシーを決める
現代のガイダンスの多くが参照しているのはNISTのSP 800-63Bで、その推奨内容は多くの人を驚かせました。文字種の構成ルールなし、定期的な強制変更なし、最低8文字以上でそれよりずっと長いものも許可、そして漏洩済みパスワードのリストとの照合です。
根拠は人間の行動にあります。構成ルールは誰もが同じ予測しやすい置き換えに走る原因になりますし、強制ローテーションはPassword1、Password2、Password3を生み出します。変更のたびに弱くなり、しかも付箋に書かれるのです。侵害の疑いへの対応としての失効には今も意味がありますが、それはカレンダーに従うのとはまったく別のことです。
ポリシーの文面よりも重要な実装上の要点が三つあります。第一に、長いパスワードとあらゆる文字を許可すること。スペースや絵文字も含めてです。最大長の制限は、たいていパスワードの保存方法が間違っている兆候です。第二に、黙って切り詰めないこと。bcryptは72バイトを超える部分を無視します。第三に、新しいパスワードを漏洩データと照合すること。Have I Been Pwnedのrange APIなら、パスワードそのものが使える形でクライアントの外に出ることなく確認できます。
攻撃者が狙うのはリカバリーの部分
どのアカウントも、そこへ戻る一番弱い経路と同じ強さしかありません。リセットリンクの送り先が、覚えやすい日付で守られたメールアカウントなら、20文字のパスワードには何の意味もありません。だからこそ、すべての土台になっているメールアカウントには、自分が維持できる範囲で最も強いパスワードと最も強い第二要素を割り当てるべきなのです。
秘密の質問は、答えが公開されているパスワードにすぎません。避けられない場合は、追加のパスワードとして扱ってください。質問ごとにランダムな文字列を生成し、マネージャーに保存するのです。
バックアップコードは、みんなが飛ばして後悔する部分です。二要素認証を有効にするときに生成し、印刷するか、認証アプリが入った端末に依存しない場所に保管し、サービスが許すなら第二の要素も登録しておきましょう。誰も想定していない失敗は攻撃者ではありません。スマートフォンをなくし、唯一の第二要素がその中にあった、という事態です。
強度メーターに見えるものと見えないもの
ここで表示されるエントロピーの値が誠実なのは、過程がわかっているからです。設定したとおりのアルファベットからの一様ランダムな抽出であり、これは文字列についての推測ではなく、くじ引きについての算術です。そして結果を手で編集した瞬間に、その値は正しくなくなります。
入力されたパスワードを採点するメーターは、はるかに難しいことを推定しています。zxcvbnのような優れたものは、ワードリスト、キーボードのパターン、日付、よくある置き換えを探索し、それらでどれくらい速く見つかるかを報告します。素朴なメーターがやっている文字種の数を数える方法よりも、はるかに役に立つ数字です。
だから素朴なメーターはP@ssw0rd1を高く評価しますが、ワードリストならミリ秒で見つけます。サインアップフォームを作るなら、パターンを理解するメーターと漏洩チェックを組み合わせれば、実際のリスクに対応したフィードバックをユーザーに返せます。長さと記号だけで動く色付きのバーは、結局のところ感嘆符を足すことを教えているだけです。
よくある質問
- 乱数はどこから取得していますか?
- ブラウザの暗号学的乱数源である crypto.getRandomValues を使用しています。Math.random は意図的に使用していません。時刻に基づいて初期化される高速な疑似乱数であり、出力を十分に観察すれば予測可能だからです。
- エントロピーの数値は何を意味しますか?
- 真の乱数のビット数で、長さ × log2(文字種数) で計算されます。1ビット増えるごとに推測に必要な計算量は2倍になります。記号が含まれているかどうかを見るだけのメーターとは異なり、これが正確な強度指標です。
- どのくらいのエントロピーが必要ですか?
- 45ビット未満は本気の攻撃者に対して弱いといえます。70ビット程度で高速ハッシュへのオフライン攻撃に耐えられます。100ビットを超えれば、当面のハードウェアでは総当たり不可能です。既定の設定では100ビットを大きく超えます。
- 解読時間はどのように算出していますか?
- 高速ハッシュに対する毎秒1000億回のオフライン攻撃を想定し、鍵空間の半分を探索する時間を表示しています。これは現実的な最悪ケースであり、実際のログイン画面への攻撃はこれより桁違いに遅くなります。
- パスワードは送信・記録されますか?
- いいえ。ブラウザ内で生成され、送信も保存もURLへの記録も行いません。そのためリンクを共有しても漏えいしません。ただし保管にはブラウザのタブではなくパスワードマネージャーをご利用ください。
- 紛らわしい文字を除外する理由は?
- 0とO、1とlなどは、読み上げたり紙から入力したりする際に区別しづらいためです。除外するとエントロピーがわずかに下がるため、有効にするとビット数の表示も更新されます。
最終更新:
操作手順、期待した結果、実際の結果を記載してください。秘密情報や個人情報は削除してください。
