パスワードの総当たり時間の計算ツール
英小文字・英大文字・数字・記号のうちどれを使い、何文字にするかから、パスワードの組み合わせの数とエントロピーを計算し、攻撃者が1秒あたりに試せる回数ごとに、すべてを試すのにかかる時間を試算します。長さと文字の種類のどちらが効くか、オンラインとオフラインの攻撃でどれほど違うかを確かめられます。
結果
- 文字の種類の数 N
- –
- 組み合わせの数 N^L
- –
- エントロピー(L × log₂N)
- –
- すべて試す時間
- –
- 平均して当たるまでの時間(半分)
- –
文字をランダムに選んだパスワードを、総当たりで1つずつ試す場合の計算です。辞書の単語や名前、よく使われるパスワードは、この値よりはるかに短い時間で見破られます。
グラフで見る
ほかの入力は今の値のまま、選んだ入力だけを今の値の1/4〜4倍の範囲で変えたときの結果です。赤い点が今の値です。
組み合わせの数とエントロピー
文字の種類がN種類、長さがL文字のパスワードの組み合わせは N^L 通りです。英小文字だけの8文字なら 26^8 ≈ 2.09×10^11、英大小文字と数字の8文字なら 62^8 ≈ 2.18×10^14 通りです。この数を2を底とする対数で表したものがエントロピーで、L × log₂N ビットになります。1ビット増えるごとに組み合わせは2倍になるので、エントロピーは総当たりへの強さの目安として使われます。
長さを伸ばすか、文字の種類を増やすか
文字の種類を26から62に増やすと、1文字あたりのエントロピーは約4.7ビットから約5.95ビットに増えます。一方、長さを1文字伸ばすと、そのたびにN倍になります。英小文字だけでも12文字にすれば 26^12 ≈ 9.5×10^16 で、英数字8文字(約2.2×10^14)よりはるかに多くなります。覚えやすい単語をいくつか組み合わせた長いパスフレーズが勧められるのは、このためです。ただし、意味のある単語の組み合わせは、文字をランダムに選ぶ場合より組み合わせの数が少なくなる点に注意が必要です。
オンラインの攻撃とオフラインの攻撃
ログイン画面に1つずつ入力する攻撃(オンライン)では、ロックアウトや回数制限によって1秒に数回程度しか試せません。一方、漏えいしたパスワードのハッシュ値を手元で計算するオフラインの攻撃では、速いハッシュ関数ならGPUで1秒に数十億回以上試せることがあります。そのため、パスワードを保存する側は、ソルトを付けたうえで、bcryptやArgon2のように計算に時間とメモリがかかるハッシュ関数を使い、試せる回数を大きく減らします。このツールで試行回数を切り替えると、同じパスワードでもかかる時間が何桁も変わることを確かめられます。
総当たり以外の攻撃と対策
実際の攻撃では、まず辞書の単語、よく使われるパスワード、名前や生年月日、それらに数字や記号を少し足したものから試すので、ランダムでないパスワードは計算よりずっと早く破られます。また、別のサービスで漏れたパスワードを使い回していると、リスト型攻撃でそのまま使われてしまいます。長くランダムなパスワードをサービスごとに変え、パスワードマネージャーで管理し、多要素認証を組み合わせることが基本的な対策です。
情報セキュリティの問題を解く
- A英小文字のみは約21秒、62種類は約6時間
- B英小文字のみは約21秒、62種類は約4.7分
- C英小文字のみは約3.5分、62種類は約2.5日
答えと解説を見る
正解:A. 英小文字のみは約21秒、62種類は約6時間
8文字のパスワードの候補の数は、使える文字の種類を8回掛けた数です。英小文字だけなら 26^8 = 208827064576 通り(約2.1×10^11)で、1秒に1×10^10個試すと、約2.1×10^11 ÷ 1×10^10 ≈ 21秒で全部を試し終えます。62種類なら 62^8 = 218340105584896 通り(約2.2×10^14)で、約21834秒、つまり約6時間かかります。文字の種類を増やすと、候補の数は1文字あたりの倍率の8乗で効くため、約1000倍に増えます。ただし、この計算は、漏えいした高速なハッシュ値を手元で総当たりする場合の目安です。辞書に載っている単語や使い回しのパスワードは、総当たりよりはるかに早く見つかるので、長くてランダムなパスワードを使い、サービスの側では遅いハッシュ方式や、ログインの試行回数の制限、多要素認証を組み合わせることが大切です。
- Aハッシュ値からソルトを使って元のパスワードを復元できるようにし、パスワードを忘れた利用者に知らせられるようにする
- B同じパスワードを使う利用者がいても保存されるハッシュ値が異なるようにし、あらかじめ計算したハッシュ値の表を使った解読を難しくする
- Cハッシュ値を短くして、データベースの容量を節約する
答えと解説を見る
正解:B. 同じパスワードを使う利用者がいても保存されるハッシュ値が異なるようにし、あらかじめ計算したハッシュ値の表を使った解読を難しくする
パスワードは、そのまま保存せず、ハッシュ関数で計算したハッシュ値を保存するのが基本です。ログインのときは、入力されたパスワードのハッシュ値を計算して、保存された値と比べます。しかし、ハッシュ値だけを保存すると、同じパスワードの利用者は同じハッシュ値になり、よく使われるパスワードのハッシュ値をあらかじめ計算した表(レインボーテーブルなど)と照らし合わせるだけで、多くのパスワードが分かってしまいます。ソルトは、利用者ごとにランダムに作ってパスワードに加える値で、ハッシュ値と一緒に保存します。ソルトは秘密にする必要はありませんが、利用者ごとに値が違うので、同じパスワードでもハッシュ値が異なり、事前に計算した表が使えなくなります。攻撃者は利用者ごとに計算し直す必要があり、手間が大きく増えます。
- A計算に時間がかかる方式は出力が長いので、衝突が起きなくなるから
- B計算に時間をかけると、ハッシュ値から元のパスワードを正規の利用者だけが復元できるようになるから
- C保存されたハッシュ値が漏えいしたときに、攻撃者が候補のパスワードを1つ試すための計算も重くなり、総当たりや辞書攻撃にかかる時間が大きく増えるから
答えと解説を見る
正解:C. 保存されたハッシュ値が漏えいしたときに、攻撃者が候補のパスワードを1つ試すための計算も重くなり、総当たりや辞書攻撃にかかる時間が大きく増えるから
パスワードのハッシュ値が漏えいすると、攻撃者は手元の計算機で候補のパスワードを次々にハッシュ化して、一致するものを探せます。SHA-256のような汎用のハッシュ関数は、大量のデータを速く処理するために作られているので、GPUなどを使えば1秒あたりに膨大な数の候補を試せてしまいます。bcryptやArgon2のようなパスワードの保存のための方式は、計算の繰り返しの回数(コスト)を調整でき、1回の計算をわざと重くします。例えば1回の計算を100万倍遅くすれば、総当たりにかかる時間も100万倍になります。正規の利用者がログインするときは1回計算するだけなので、0.1秒程度の遅れなら問題になりません。Argon2は計算に多くのメモリも使うように設定でき、GPUや専用の回路で大量に並列に計算することを難しくします。どの方式でも、利用者ごとのソルトと組み合わせて使います。
よくある質問
8文字のパスワードは何通りありますか?
使う文字の種類によります。英小文字だけなら 26^8 ≈ 2.09×10^11 通り、英大小文字と数字なら 62^8 ≈ 2.18×10^14 通り、さらに記号32種類を加えた94種類なら 94^8 ≈ 6.10×10^15 通りです。
エントロピーは何ビットあればよいですか?
守る対象や攻撃の方法によりますが、オフラインの攻撃を考えると、ランダムに選んだ文字で少なくとも70〜80ビット程度が目安とされることがあります。英大小文字と数字なら12〜14文字ほどにあたります。人が考えたパスワードはランダムではないので、計算上のビット数より弱くなります。
入力した文字列は送信されますか?
いいえ。計算はこのページの中だけで行い、入力した文字列はどこにも送りません。それでも、実際に使っているパスワードは入力しないでください。判定に使うのは、文字の種類と長さだけです。
ハッシュ化されていれば安全ですか?
ハッシュ化だけでは不十分です。ソルトがないと同じパスワードが同じハッシュ値になり、事前に計算した表で一度に調べられてしまいます。速いハッシュ関数では総当たりも速いため、ソルトに加えて、bcryptやArgon2のような計算の重いハッシュ関数を使います。