FlowingDev

パスワード強度入門:あなたの秘密の隠し味は…数学だった

パスワード強度がどのようにエントロピー(予測不可能性を定量化し、クラック時間を推定する情報理論の概念)を用いて測定されるかを学びます。

ツールを試す: パスワード強度

ひとことで言うと

パスワード強度とは、攻撃者があなたの秘密を暴くのにどれだけの推測(つまり「エントロピー」)が必要かを測る指標であり、その純粋な計算量を人間が理解できる時間的見積もりに変換したものです。

これが解決する問題

はじめにコンピュータありき。そしてデータがあり、すべては順調だった。しかし、他の人々がそのデータを見たがるようになり、我々はパスワードを発明した。初期の頃は単純なものだった。root、admin、guest。セキュリティというよりは、ペラペラの鍵がついた書類棚のような、基本的なアクセス制御に近かった。

そしてインターネットが登場した。突然、それらのコンピュータは施錠された部屋にあるだけでなく、地球上の他のすべてのコンピュータと接続されるようになった。ペラペラの鍵は、今やあなたのデジタルライフの玄関を守るものとなり、攻撃者たちはその鍵をこじ開けるのが非常にうまくなってきた。

最初に現れたのはブルートフォース攻撃(総当たり攻撃)だ。「a」「b」「c」...「aa」「ab」...といった具合に、すべての組み合わせを試す。これは機能するが、時間がかかる。そこで攻撃者たちはより賢くなった。彼らは人間が怠惰で予測可能であることに気づいたのだ。これが辞書攻撃につながる。「axfsvj」を試すより、「password」や「sunshine」、「123456」を試した方がいいじゃないか? これは破壊的な効果を発揮した。

システム管理者はポリシーで対抗した。「パスワードは8文字以上で、数字と大文字を1つずつ含めること!」。ユーザーは、いつだってクリエイティブなルール遵守者だ。彼らは Password1、Password2、そして時代を超えた傑作 P@$$w0rd1 で応じた。複雑さのルールは、偽りの安心感を生み出してしまった。

我々はパスワードの品質を測定する、より良い方法を必要としていた。文字種別のチェックボックスを埋めるのではなく、その真の、予測不可能なランダム性を測定する方法が。つまり、「推測しにくいこと」を定量化する方法が必要だったのだ。そこで登場するのが、情報理論という数学分野に根ざした、パスワード強度の概念だ。それはエントロピーという形式的な指標を提供し、スーパーコンピュータを持つ執拗な攻撃者の猛攻に、パスワードがどれだけ長く耐えられるかを推定する。

内部の仕組み

パスワード強度の推定は、その核心において数字のゲームだ。攻撃者があなたのたった一本の針であるパスワードを見つけるために、どれだけ大きな干し草の山を探さなければならないかを計算しようとしているのだ。

### エントロピー:魔法の数字

パスワード強度の測定単位はエントロピーであり、「ビット」で測定される。情報理論において、エントロピーは不確実性やランダム性の尺度だ。パスワードの場合、それはあなたのパスワードがどれだけ予測不可能かを定量化する。

基本的な計算式は美しくシンプルだ。

Entropy = log₂(Search Space)

「Search Space」(探索空間)は、特定のルールの下で可能なパスワードの総数である。単純なランダム生成されたパスワードの場合、探索空間は次のように計算される。

Search Space = N ^ L

ここで:

  • N は文字セット(選択可能な記号のプール)に含まれる文字の数。
  • L はパスワードの長さ。

これをメインの計算式に戻すと、Entropy = log₂(N ^ L) となり、これは Entropy = L * log₂(N) に簡略化できる。

いくつかの一般的な文字セットのサイズ(N)は以下の通りだ。

  • 数字のみ(0-9): N = 10
  • 小文字の英字(a-z): N = 26
  • 大文字小文字混合の英字(a-z, A-Z): N = 52
  • 英数字+大文字小文字混合(a-z, A-Z, 0-9): N = 62
  • フルASCIIキーボードの記号: N ≈ 95

したがって、小文字のみを使用した8文字のパスワードの場合、エントロピーは 8 * log₂(26) となり、約 8 * 4.7 = 37.6 ビットとなる。

「37.6ビット」とは実際にはどういう意味か? エントロピーが1ビット増えるごとに、探索空間は2倍になる。つまり、38ビットのエントロピーを持つパスワードは、37ビットのものよりもクラックするのが2倍難しい。この指数関数的な成長こそが、ランダムな文字を1つか2つ追加するだけで強度が劇的に向上する理由なのだ。

### エントロピーからクラック時間へ

ビットはコンピュータにとっては素晴らしいが、人間は分、年、そして永遠といった単位で考える。クラック時間の見積もりを得るには、もう一つの要素が必要だ。それは攻撃者の推測速度である。

これは非常に変動しやすい。オンライン攻撃(実際のログインフォームに対して推測する)は、1秒あたり10回の試行に制限されるかもしれない。しかし、より現実的なシナリオはオフライン攻撃だ。この場合、攻撃者はパスワードハッシュのデータベースを盗み出している。最新のGPUを使えば、彼らは1秒間に数十億、あるいは数兆ものハッシュ計算を実行できる。

強力な攻撃者が1秒間に100億(10¹⁰)回の推測ができると仮定しよう。発見を保証するために必要な推測回数は 2^Entropy だ。平均的には、その半分の時点で発見されるので、次のように時間を推定できる。

Crack Time = (2^Entropy / 2) / GuessesPerSecond

事態がどれだけ急激にエスカレートするかを見てみよう。

エントロピー (ビット) 総推測回数 平均クラック時間 (@ 10¹⁰ H/s) セキュリティレベル
30 約10億 0.1秒未満 ごく僅か
40 約1兆 約1分 非常に弱い
50 約1000兆 約15時間 弱い
60 約100京 約1.8年 まずまず
70 約10垓 約1,800年 強い
80 約1秭 宇宙の年齢以上 非常に強い

この表は、わずか数ビットのエントロピーを追加するだけで、いかに絶大な違いが生まれるかを示している。

### ブルートフォースを超えて:パターンの問題

単純な L * log₂(N) という計算式には大きな欠陥がある。それは、すべての文字が完全にランダムに選ばれていると仮定している点だ。人間はそのようには動かない。我々は単語や日付、予測可能な置き換えを使う。P@$$w0rd1 は9つのASCII文字のランダムなシーケンスではない。

ここで、最新のパスワード強度推定ツールが本当に賢くなるところだ。Dropboxの有名なzxcvbnライブラリのような最高のツールは、単に素朴なエントロピーを計算するだけではない。攻撃者のように振る舞い、あなたのパスワードを構築するための「最も安価な」方法を見つけようとする。

  1. チャンク化: パスワードをチャンク(塊)に分割する。Tr0ub4dor&3! は Tr0ub4dor、&、3、! になる。
  2. パターンマッチング: 各チャンクを複数のパターンと照合して分析する。
    • 辞書にある単語: troubador は英語の辞書にあるか?(はい)。一般的な単語か?(はい)。
    • よくある置き換え: Tr0ub4dor は troubador の o を 0 に、a を 4 に置き換えたように見えるか?(はい)。
    • キーボードパターン: qwerty や asdfg のようなシーケンスか?
    • 日付: 1999 や 2024 のように見えるか?
    • 繰り返し文字: aaaaaa のようなものか?
  3. コスト分析: 各チャンクのパターンに基づいてエントロピーを計算する。一般的な辞書の単語は、同じ長さのランダムな文字列よりもはるかに低いエントロピーを持つ。password のエントロピーは 8 * log₂(52) ではなく、一般的なパスワードのリストから1つを推測するのに近いため log₂(20000) に近くなる。
  4. 合計: 「最も安価な」チャンクのエントロピーを合計して、現実的で実戦的な強度推定値を得る。これが、correct-horse-battery-staple が Tr0ub4dor&3 よりもはるかに高いスコアを獲得する理由だ。後者の方が「複雑そうに」見えるにもかかわらず、だ。

実社会での事例

### 裏目に出た企業ポリシー

ある中規模のテック企業が、厳格な新しいパスワードポリシーを導入した。最低10文字、大文字1つ、数字1つ、記号1つを含めるというものだ。目標は高エントロピーのパスワードを強制することだった。しかし、彼らが手にしたのは、Summer2024!、Fall2024!、Winter2025! のようなパスワードを作成する従業員たちだった。単純な強度メーターなら、これらにまずまずのスコアを与えるだろう。しかし、攻撃者が下位レベルのアカウントを侵害してそのパターンを学習したとき、彼らは何もブルートフォースする必要はなかった。季節と年の組み合わせを試すスクリプトを書くだけで、すぐに数十のアカウントへのアクセス権を手に入れたのだ。

教訓: 強制された複雑さは、しばしば予測可能なパターンを生み出す。優れた強度メーターは、これらの一般的なスキームを検出し、ペナルティを課すべきである。

### XKCD『Correct Horse Battery Staple』がもたらした天啓

ウェブコミックのXKCDは、今や伝説となったパスワード強度を説明するストリップを公開した。それは、典型的な「複雑な」パスワードである Tr0ub4dor&3 と、4つの一般的だがランダムな単語からなるパスフレーズ correct horse battery staple を比較したものだ。Tr0ub4dor&3 は人間が覚えるのは難しいが、その置き換えとパターンの組み合わせは計算可能なエントロピーを持ち、熱心なクラッカーなら数日で解読できるかもしれない。一方、4単語のパスフレーズは人間が思い出すのは簡単だ。2048個の一般的な単語の辞書を仮定すると、そのエントロピーは log₂(2048^4)、つまり 4 * 11 = 44 ビットの意味のあるエントロピーとなる。これを文字ごとにブルートフォースしようとすると、攻撃者は28文字の文字列に直面することになり、それは不可能なタスクだ。

教訓: 長さは、記号ベースの複雑さよりも強力で、かつユーザーフレンドリーな防御策であることが多い。パスフレーズはあなたの友達だ。

### 「ランダム」ではなかったランダムパスワード

ある開発者が、新規ユーザー向けの安全なランダム初期パスワードを生成するシステムを作成する任務を負った。彼は、簡単なスクリプトで言語のデフォルトのrandom()関数を使用した。パスワードは j8sL2!kP のように見栄えが良かった。開発者が気づかなかったのは、標準の random() 関数が、システムのクロック時間をシード(種)とする疑似乱数生成器(PRNG)だったことだ。攻撃者は、これらのパスワードの1つとその作成タイムスタンプ(例えばメールから)を入手した後、シードを突き止めることができた。そして、その同じ時間帯に作成されたすべてのユーザーの「ランダムな」パスワードの全シーケンスを再生成することができたのだ。

教訓: ランダム性の源は非常に重要だ。セキュリティ関連の事柄には、常に暗号論的に安全な疑似乱数生成器(CSPRNG)を使用すること。ブラウザなら window.crypto.getRandomValues()、Linuxなら /dev/urandom などだ。

よくある間違いと落とし穴

  • 複雑さと強度を混同する。 P@$$w0rd! は複雑に見えるが、世界的に認知された悪いパスワードだ。four random words joined は概念的にはシンプルだが、予測可能なパターンがなく、はるかに長いため、実践的にははるかに強力だ。
  • 「緑のバー」を盲信する。 ウェブ上の多くの強度メーターは危険なほど単純だ。単純な 長さ * 文字セット の計算を行い、辞書、パターン、または公開されている侵害データを確認しない。弱いメーターからの「強力」という評価は嘘である。
  • オフライン攻撃の可能性を無視する。 3回試行するとロックアウトされるログインフォームを基準にパスワードの強度を測ってはいけない。攻撃者があなたのハッシュ化されたパスワードを手に入れ、地下室のGPUラックで攻撃していると仮定しよう。常に最悪のシナリオを想定して設計すること。
  • パスワードを使い回す。 どんなに brilliant な128ビットのエントロピーを持つパスワードも、他のウェブサイトのデータ侵害で漏洩した瞬間に無価値になる。攻撃者はそれをクラックするのではなく、リストで調べてそのまま侵入するだろう。
  • ランダムなら短くても大丈夫だと思い込む。 すべてのキーボード記号を使用した真にランダムな8文字のパスワードは、まずまずのエントロピー(約53ビット)を持つ。しかし、「まずまず」はもはや以前のような意味を持たない。計算コストの低下を考えると、数週間から数ヶ月でクラックされる可能性がある。長さは、はるかに快適な安全マージンを提供する。

なぜ注目すべきか

パスワード強度を理解することは、セキュリティ専門家だけのものではない。

開発者として、何らかの認証機能を構築しているなら、あなたは最前線にいる。恣意的なルール(火曜日にのみ話されるキリル文字を1つ含めること)を強制する代わりに、実際に機能するもの、つまり長さと予測不可能性へとユーザーを導くべきだ。賢い強度推定器を統合することで、ユーザーを真に助けるリアルタイムのフィードバックを提供できる。そして、その原則を知ることで、より良いアーキテクチャ上の決定(Argon2のような遅くてコストのかかるハッシュ化アルゴリズムを選択するなど)を下すことができる。

ユーザーとして、この知識は、あなたを単なるルールの受け身なフォロワーから、自らのデータを能動的に守るディフェンダーへと変身させる。それは、あなたにとっては覚えやすく、彼らにとっては不可能に近いほど困難な秘密を作成するための直感を与えてくれる。これは、あなたのデジタルセキュリティ体制全体の理論的基盤なのだ。

さらに深く

理論はOK。さあ手を動かそう — 100%ブラウザ内で。

ツールを試す: パスワード強度