安全なパスワードの作り方は、つきつめると3つです。ランダムに作ること、十分に長くすること、サービスごとに別のものにすることです。覚えられない分はパスワードマネージャーに保存します。この記事では、この3つがなぜ効くのかを、IPA・総務省・米国 NIST の推奨と、実際に計算・照会した数字で確かめます。
文字数ごとの強度や確率は ZeroTool パスワード生成ツール のコードから計算した値で、サイトのテストが同じ値を再計算しています。漏えいデータの件数は 2026-10-02 に照会したもので、その後は変わっています。
「英大文字・小文字・数字・記号で10文字以上」を数字で確かめる
日本の公的な推奨を並べると、求める長さが少しずつ違います。
| 出典 | 推奨 |
|---|---|
| IPA「日常における情報セキュリティ対策」 | 大小英字、数字および記号を混在させて最低でも10文字 |
| IPA「チョコっとプラスパスワード」 | 数字・英大文字・英小文字を組み合わせてできるだけ長い文字数(15桁程度)、より安全にしたいなら記号を追加 |
| NIST SP 800-63B(第4版) | パスワードだけで認証する場合は15文字以上。多要素認証の一部なら8文字以上 |
ランダムに作ったパスワードの強さは「文字種の数 N の文字を L 個並べた組み合わせの数」で決まり、ビット数にすると L × log2N です。1ビット増えるごとに総当たりの手間は2倍になります。
| 作り方 | 文字種 N | ビット数 |
|---|---|---|
| 小文字だけ 10文字 | 26 | 47.0 |
| 大小英字・数字・記号(ZeroTool の4種)10文字 | 88 | 64.6 |
| 英小文字だけ 15文字 | 26 | 70.5 |
| 大小英字・数字 15文字 | 62 | 89.3 |
| 大小英字・数字・記号(ZeroTool の4種)15文字 | 88 | 96.9 |
| 同じ4種で 20文字(ツールの初期値) | 88 | 129.2 |
記号まで混ぜた10文字(64.6ビット)より、小文字だけの15文字(70.5ビット)のほうが強くなります。文字種を増やすより文字数を増やすほうが効くということで、IPA が15桁程度へ、NIST が15文字へと長さを重視しているのと一致します。ただし、この計算が成り立つのはランダムに作った場合だけです。
人が考えたパスワードは漏えいデータに載っている
攻撃者は「aaaa」から順番に試すわけではありません。過去に漏えいしたパスワードの一覧や辞書の単語から試し、先頭を大文字にする、a を @ に変える、末尾に数字を足す、といった規則で変形します。Have I Been Pwned の Pwned Passwords で、日本でよく使われそうな言葉を 2026-10-02 に調べた結果です。
| パスワード | 漏えいデータに出現した回数 |
|---|---|
pokemon | 2,143,254 |
naruto | 1,643,722 |
sakura | 683,950 |
doraemon | 248,819 |
aishiteru | 114,289 |
sakura123 | 107,476 |
daisuki | 32,874 |
P@ssw0rd | 6,421,042 |
ローマ字にしても、数字を足しても、記号に置き換えても、人が思いつく形はすでに一覧に入っています。総務省「国民のためのサイバーセキュリティサイト」も、名前・生年月日・辞書の単語ひとつ・キーボードの並び(qwerty、asdf)を危険な例に挙げ、理想は「ある程度長いランダムな英数字の並び」としています。
定期変更は不要、使い回しはやめる
以前は「パスワードは定期的に変更する」が定番でしたが、総務省の同じページは、流出の事実がなければ変更は不要で、定期的な変更はかえって作り方のパターン化や使い回しにつながると書いています。NIST SP 800-63B も、サービス側は定期変更を要求してはならず、侵害の証拠があるときだけ変更させること、と定めています。
代わりに重要なのが使い回しをしないことです。あるサービスから漏れたメールアドレスとパスワードの組で、別のサービスへのログインを試す攻撃(パスワードリスト攻撃)が知られているためです。NIST はさらに、新しいパスワードを漏えいデータや辞書の単語、サービス名などの一覧と照合し、一致したら別のものを選ばせること、文字種の混在を強制する規則を課さないこと、パスワードマネージャーと貼り付けを許可することをサービス側に求めています。
IPA の「コアパスワード」を数字で見る
IPA の安心相談窓口だより「不正ログイン被害の原因となるパスワードの使い回しはNG」は、使い回しを避ける方法の一つとしてコアパスワードを紹介しています。好きなフレーズ「テレビが大好き」をヘボン式ローマ字にして terebigadaisuki(15文字)、助詞の「が」を大文字に、背番号 06 を足して terebiGAdaisuki06(17文字)とし、必要なら && を足します。これにサービスごとの短い識別子を前後に付けて、サービス別のパスワードにする方法です。
2026-10-02 の照会では、terebigadaisuki、terebiGAdaisuki06、terebiGAdaisuki06&& はいずれも漏えいデータに 0 件でした。
0件は「この文字列はまだ載っていない」という意味で、強さの証明にはなりません。この方式の弱点は構造にあります。どこか1つのサービスでパスワードが平文のまま漏れたりフィッシングで盗まれたりすると、コア部分と識別子の付け方が見えるので、他のサービスのパスワードも推測しやすくなります。パスワードマネージャーが使える環境なら、サービスごとに独立したランダムなパスワードのほうが、1か所の漏えいが他に広がりません。コアパスワードは、マネージャーを使えない場面で覚えるための折衷案と考えるのが妥当です。
覚える必要があるときはランダムな単語をつなぐ
パスワードマネージャーのマスターパスワードやパソコンのログインのように、覚えておく必要があるものもあります。総務省のページは、英語でもローマ字でもよいので無関係な複数の単語をつなげる方法を紹介しています。
この方法の強さを数字にできるのは、単語をサイコロなどでランダムに選んだときです。Arnold Reinhold が 1995 年に公開した Diceware の単語リストは、サイコロ5個の目の組み合わせと同じ 7,776 語で、1語あたり log27776 = 12.9 ビットです。EFF が 2016 年に公開した単語リストも同じ語数です。5語で 64.6 ビット、6語で 77.5 ビットになり、6語なら記号入り12文字のランダムなパスワード(77.5 ビット)と同じ強さです。
自分で思いついた「好きな歌詞」や「座右の銘」はランダムではないので、この計算は使えません。
全角入力と日本語パスワードの注意
日本語環境では、IME がオンのままパスワードを入力して全角文字になってしまうことがあります。全角の pass と半角の pass は別の文字です。NIST はサービス側に、Unicode を受け付ける場合は NFC 正規化をかけてからハッシュ化するよう勧めていますが、NFC は全角英字を半角に変えません。半角に変えるのは NFKC です。
| 入力 | NFC の結果 | NFKC の結果 |
|---|---|---|
pass(全角) | pass(全角のまま) | pass |
つまり、全角で登録してしまったパスワードは、半角で打つと一致しない可能性が高いということです。パスワード欄では IME をオフにし、登録直後に一度ログインし直して確かめると安全です。
日本語の文字をパスワードに使うと、もう一つ問題があります。UTF-8 ではかなや漢字1文字が3バイトで、パスワード は5文字で15バイトです。広く使われているハッシュ方式 bcrypt は先頭72バイトしか使わないため、日本語なら24文字目までしか強さに効きません。NIST は送られたパスワード全体を検証すること(切り詰めないこと)を求めていますが、サービスがそうしているかは利用者からは見えません。
盗まれたハッシュに対する総当たりの速さ
ログイン画面からの試行は回数制限で止められますが、サービスから保存済みのハッシュが盗まれると、攻撃者は手元の GPU で制限なく試せます。公開されている hashcat 6.2.6 の RTX 4090 1枚でのベンチマークでは、ソルトなし MD5 が毎秒 1,641 億回、bcrypt(コスト5)が毎秒 18 万 4,000 回です。ツールの4種88文字でランダムに作った場合、全通りを試すのにかかる時間は次のとおりです。
| 文字数 | MD5 で保存 | bcrypt コスト5で保存 |
|---|---|---|
| 8 | 6.1時間 | 619年 |
| 10 | 5.4年 | 480万年 |
| 12 | 4万1,600年 | 370億年 |
サービスがどの方式で保存しているかは利用者には選べません。MD5 のような速いハッシュで保存されていても耐えられる長さにしておくことが、利用者側でできる対策です。
ZeroTool パスワード生成ツールの使い方
パスワード生成ツール はブラウザの crypto.getRandomValues() でパスワードを作り、通信は行いません。このページはアクセス解析や広告のスクリプトも読み込みません。
- 「Length」で長さを 4〜128 文字から選びます(初期値 20)。
- 文字種のチェックボックスで、英大文字(26)・英小文字(26)・数字(10)・記号(26種類の
!@#$%^&*()-_=+[]{}|;:,.<>?)を選びます。4種すべてで88文字です。チェックボックスの表示は英語のままです。 - 「Exclude ambiguous」をオンにすると
0 O l 1 Iを除いた83文字から作ります。紙に書き写したり読み上げたりするパスワードに向いています。 - 「生成」で1つ、「10 個生成」で10個まとめて作ります。
強度の表示は「文字数 × log2(文字種の数)」のビット数で、40未満が「とても弱い」、60未満が「弱い」、80未満が「普通」、100未満が「強い」、100以上が「とても強い」です。初期設定の20文字なら「とても強い (129 bits)」と表示されます。
各文字は88文字全体から独立に選ぶので、毎回すべての文字種が入るとは限りません。20文字で数字が1つも入らない確率は 9.0%、4種のどれかが欠ける確率は 9.2% です。「数字を必ず含めてください」と言われたら、手で1文字書き換えるのではなく、もう一度「生成」を押してください。手で直すと、そこに人のパターンが入ります。
ネットバンキングなどで使える記号が限られているときは、記号のチェックを外し、その分文字数を増やします。大小英字と数字だけでも22文字にすれば131.0ビットで、記号入り20文字(129.2ビット)より強くなります。