記号より長さ:パスワードの強さをビットで計算する方法
英大文字・数字・記号のルールを満たしたパスワードがなぜ弱いのか、エントロピーで強さを測る方法、パスフレーズ、NIST が変えた推奨事項、二要素認証の考え方をまとめました。
会員登録の画面に「英大文字・小文字・数字・記号を含む8文字以上」と表示されます。何度か弾かれたあと Password1! と入れると、ようやく緑のチェックが付きました。条件はすべて満たしています。ところがこのパスワードは、攻撃者が真っ先に試す部類に入ります。
ルールを満たしても強いとは限らない
文字種のルールは、「いろいろな文字がまんべんなく混ざること」を期待しています。しかし実際の人間はそうしません。大文字は先頭に、数字は末尾に、記号は最後に ! を1つ付けるだけ。a を @ に、o を 0 に置き換えるのも、解析ツールが最初に試す規則です。ルールはパスワードを複雑に見せるだけで、推測しにくくするわけではありません。
だからパスワードの強さは、「何が入っているか」ではなく**「何回で当てられるか」**で考える必要があります。
強さをビットで数える
ランダムに作ったパスワードなら、ありうる組み合わせの数は計算できます。使える文字が N 種類、長さが L なら、組み合わせは N^L 通りです。これを2のべき乗で表したときの指数、つまり log₂(N^L) = L × log₂N をエントロピーと呼び、ビット単位で数えます。
- 英小文字26種類で8文字:8 × log₂26 ≈ 37.6ビット
- 英大文字・小文字・数字・記号25個を合わせた87種類で8文字:8 × log₂87 ≈ 51.5ビット
1ビット増えるごとに、攻撃者が試すべき数は2倍になります。38ビットと52ビットの差は14ビット、およそ16,000倍です。
グラフで注目してほしいのは、英小文字だけの16文字(75.2ビット)が、あらゆる文字を混ぜた8文字(51.5ビット)よりはるかに強いことです。文字の種類を26から87へ3倍以上に増やしても、1文字あたり約1.7ビット増えるだけですが、文字を1つ増やすごとに4.7〜6.4ビット増えます。
時間に置き換えてみます。流出したハッシュをオフラインで1秒に100億回試せると仮定すると、すべての組み合わせを試し終えるまでの時間は次のとおりです。
| パスワード | エントロピー | すべて試すまで |
|---|---|---|
| 英小文字8文字 | 37.6ビット | 約21秒 |
| 87種類で8文字 | 51.5ビット | 約3.7日 |
| 単語5つ | 64.6ビット | 約89年 |
| 87種類で12文字 | 77.3ビット | 約59万年 |
1秒に100億回というのは、SHA-256 のような高速なハッシュで保存されている場合を想定した数字です。サービスが bcrypt や Argon2id のようにわざと遅いハッシュを使っていれば、攻撃の速度は大きく落ちます(ハッシュ関数の記事を参照)。どちらにしても、利用者が自分で決められるのは長さです。
ひとつ大事な注意があります。この計算はパスワードをランダムに作ったときだけ成り立ちます。Password1! は87種類で10文字なので式の上では64ビットを超えますが、実際には攻撃用の辞書の上位にあるため、数秒ももちません。人が頭で考えたパスワードには、この式は使えません。
覚えやすくて長い、パスフレーズ
ランダムな16文字は強いものの、覚えるのは大変です。そこで、ランダムに選んだ単語をいくつかつなげるパスフレーズという方法があります。サイコロで単語を選ぶダイスウェア(Diceware)が代表的で、電子フロンティア財団(EFF)が公開している7,776語(サイコロ5個の目の組み合わせ数、6⁵)の単語リストを使うと、1語あたり約12.9ビットになります。6語なら77.5ビットで、87種類からランダムに選んだ12文字とほぼ同じ強さです。
肝心なのは、単語を自分で選ばないことです。好きな歌詞や有名なことわざはランダムではないので、式が当てはまりません。EFF のリストは英単語です。日本語の単語をローマ字で並べても考え方は同じですが、その場合もサイコロなどで機械的に選ぶ必要があります。
推奨事項も変わった
米国国立標準技術研究所(NIST)のデジタルアイデンティティガイドライン(SP 800-63B、2025年の第4版)は、長く常識とされてきたルールをいくつも覆しました。
- パスワードだけでログインする場合は最低15文字、ほかの認証手段と組み合わせる場合は最低8文字とする。
- 最大長は少なくとも64文字まで受け付けることが望ましい。
- 大文字・数字・記号を必ず混ぜるといった構成ルールを強制しない。
- **定期的な変更を求めない。**漏えいの証拠があるときだけ変更させる。
- その代わり、新しいパスワードを漏えい済みのパスワードや辞書の単語、
aaaaや1234のような繰り返し・連続の文字列のリストと照合してはじく。
日本でも、総務省の「国民のためのサイバーセキュリティサイト」が、流出していなければ定期的な変更は不要と案内しています。3か月ごとに変えるよう求めると、人は Spring2026! の次に Summer2026! を使います。変更の周期が、かえって予測しやすいパスワードを生むという判断です。
パスワード1つにすべてを預けない
どれほど強いパスワードでも、複数のサイトで使い回せば意味がありません。どこか1か所から漏れると、攻撃者は同じメールアドレスとパスワードをほかのサービスに次々と試します(パスワードリスト攻撃)。サイトごとに違うパスワードを使うには人の記憶では足りないので、パスワード管理ツールがほぼ必須です。覚えるのは管理ツールのマスターパスワード1つだけにして長いパスフレーズにし、残りはツールに作らせて覚えさせます。
そして大切なアカウントには二要素認証を設定します。認証アプリの6桁のコードがあれば、パスワードが漏れてもログインを防げます。SMS による認証は SIM スワップ攻撃に弱いため、認証アプリより一段下と考えられています。対応しているサービスなら、パスキーが最も安全です。偽のサイトではそもそも動かないので、フィッシングに強い方式です。
パスワード生成ツールで作ってみる
パスワード生成ツールは、ブラウザの暗号論的乱数(crypto.getRandomValues)でパスワードを作ります。長さと文字の種類(英小文字、英大文字、数字、記号)を選ぶと、この記事と同じ考え方で計算したおおよそのビット数も表示します。I・l・1・O・0 のような紛らわしい文字を除くオプションもあります。長さを8から16に変えてみると、数字が大きく跳ね上がるのが分かります。作ったパスワードは送信も保存もされません。
参考
- NIST SP 800-63B-4, Digital Identity Guidelines: Authentication and Authenticator Management(2025年)
- EFF, “EFF Dice-Generated Passphrases”(単語リスト)
- 総務省「国民のためのサイバーセキュリティサイト」
- OWASP, Authentication Cheat Sheet