パスワードの強度を考察する

概要

パスワードが攻撃者に知られてしまうパターンには、漏洩したパスワードが使い回されるパターンと、パスワード自体が突き止められるパターンがある。

サービスからの漏洩自体をユーザー側で防止することは難しいため、ユーザーに可能な対策はサービスごとに全く異なるパスワードを使用する程度である。

パスワード自体が直接突き止められることを防止するには、取りうるパスワードのパターン数が非常に多い必要がある。 単語の変形などによるパスワードは推測しやすすぎるため、パスワードはランダムに生成されるべきである。 パスワードのパターン数を評価するには、エントロピーを計算すればよい。

パスワード認証への攻撃への対策

パスワード認証への攻撃には、パスワード認証自体の回避と、パスワードの入手が存在する。

パスワード認証の回避は、そのアプリケーションの脆弱性を用いてパスワード入力なしに攻撃を実行する方法である。 このパターンに関しては、ユーザーが直接阻止することはできない。 したがって、セキュリティ対策の程度に関して信頼できるサービスやアプリケーションを使用するしかない。

パスワードの入手に関しては、漏洩したパスワードが使い回されるパターンと、多数のパスワードを試す方法がある。 漏洩したパスワードの使い回しに関しては、サービスごとに異なるパスワードを使用すれば、漏洩したパスワードで他のサービスの認証を突破することはできなくなる。 したがって、問題となるのはパスワードが攻撃者の試行に耐えられるかという点になる。

攻撃者の試行に耐えられるパスワード

結論から書くと、攻撃者の試行に耐えられるパスワードの条件は、パスワードが取りうるパターン数が十分に多いことである。

例として、数字4桁のパスワードを考えてみよう。 数字4桁のパスワードの総数は 10 ^ 4 であるから、10000通りである。 つまり、攻撃者は10000通りのパスワードを試せば、確実にパスワード認証を突破できるということになる。 これは、コンピュータを用いて機械的に行えば非常に短時間で突破できるパターン数である。 ちなみに、実際に数字4桁のパスワードのWebサービスは存在する。 (参考: KINEZOは映画館の係員でもパスワードを覗ける

パスワードが一番推測しにくくなる条件は、取りうるパターン全ての中から真にランダムに選ばれた場合である。 例えば、ある単語を変形したパスワードというのは、もとの単語に引きずられているため推測しやすくなる。 使われていそうな単語が推測できる場合は、実際にパスワードを突破できるほど弱いものになってしまう。 したがって、パスワードはランダムに生成されるべきである。

パターン数の計算

ここからは、具体的にパスワードを計算していく。

その前に、パスワードの生成法のエントロピーという量について説明しておく。 まず、生成法で生成されるパスワードがどれも同じ確率で生成されるものとする。 もし、どれかのパスワードがほかより生成される確率が高いなら、そのようなパスワードを狙うことでより簡単に突破できてしまうので、どれも同じ確率であるという仮定は妥当な条件になる。

以上の仮定のもとでは、パスワードの生成法のエントロピーは、生成されるパスワードのパターン数の2の対数のことで、単位はbitである。 具体例としては、数字4桁からランダムに選ぶという生成法のエントロピーは、パターンが10000通りであるから、 log2(10 ^ 4) = 13.29 bit となる。 (エントロピーの小数点以下の細かい違いは議論の大筋に影響しないため、有効数字は厳密に扱わないこととする)

直接パターン数を数えるのではなくエントロピーを計算するのは、対数の計算法則を使って計算を簡便化でき、結果の数字の桁数も抑えられるからである。 具体的に、数字4桁の場合なら log2(10 ^ 4) = 4 * log2(10) = 4 * 3.322 = 13.29 となる。 2の対数であるから、エントロピーの値が1大きくなるとパターン数は2倍となる。

英数字8文字

典型的な英数字8文字というパスワードではどうなるだろうか。

英数字はアルファベット26種の大文字小文字と数字で合わせて62種ある。 これが8文字あると、62 ^ 8218,340,105,584,896通り、47.63 bitとなる。 なお、この総数には数字のみのパスワードや、英字のみのパスワードが含まれている。 大文字・小文字・数字のすべてを含むパスワードの総数はこれより少ないが、桁数としてはほぼ変わらない。

英数字と記号8文字

記号を含む場合、使える記号の数によってパターン数が変わってくる。 ASCIIコードの記号は以下の32種と空白の計33種が存在する。

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

空白はパスワードに使わないことが多いため除外すると、文字種が 26 + 26 + 10 + 32 = 94 種あることになる。 よって、エントロピーlog2(94 ^ 8) = 8 * log2(94) = 8 * 6.554 = 52.44 bitとなる。

パスワードに記号は必要か?

一般には英数字のみのパスワードより記号を含むパスワードのほうが強固だと考えられており、記号を含むパスワードを強制するようなサービスも多くある。 しかし、上の計算からもわかるように、英数字8文字と英数字記号8文字ではエントロピーの差は4.80 bitであり、パターン数としては27.8倍程度にしかならない。 英数字9文字ならば53.59 bitあるため、記号を抜いても2~3文字長いパスワードを使うほうが圧倒的にパスワードとしての強度は高くなるのだ。

実際、JPCERT/CCも以前は「大小英字、数字、記号といった全文字種を組み合わせる」「8文字以上にする」という指針であったが、現在では12文字以上とされ記号は求められていない。 (参考: パスワードに記号は不要、JPCERT方針転換の理由

パスフレーズの検討

文字ベースのパスワードがランダムに選んだ文字を並べるのに対して、パスフレーズではランダムに選んだ単語を並べることでパスワードとする。 パスフレーズの生成法のエントロピーを評価するには、文字の種類を単語の総数に、長さを単語数にすればよい。

例として、diceware日本語訳)で6単語のパスフレーズを生成する場合を計算してみよう。 dicewareの単語辞書は7776個の単語を含んでいる。 したがって、エントロピーlog2(7776 ^ 6) = 6 * log2(7776) = 6 * 12.92 = 77.55 bitとなる。 これは英数字13.02文字のパスワードと等価である。

パスフレーズの利点は覚えやすさである。 長いパスワードを記憶するのは非常に難しいが、長いパスフレーズはそれに比べると覚えやすい。 そのため、公開鍵認証の秘密鍵のパスワードや、パスワードマネージャーのマスターパスワードのような特に強度が求められる場合に向いている。

注意点として、Webサイトなどで使われるbcryptというパスワードのハッシュ化アルゴリズムは72文字までという制限を設けている。 このように、長すぎるパスワードが制限されている場合、パスフレーズを使用するのが困難な場合がある。 これを回避するには、短い単語のリストを用いて、より多い単語数にする方法がある。

どの程度のエントロピーを要求すればいいか

ここまでパスワードのエントロピーを計算してきたが、実際にはどの程度のエントロピーを要求すればよいだろうか。 私は、英数字のパスワード文字数換算で計算するのが分かりやすい指標になると考えている。 それほど長期間使わないパスワードなら、JPCERT/CCの英数字で12文字という指標が目安になるだろう。

タイプ エントロピー (bit) 英数字換算(文字)
数字4文字 13.29 2.2
数字8文字 26.58 4.5
数字12文字 39.86 6.7
英字8文字 45.60 7.7
数字14文字 46.51 7.8
英数字8文字 47.63 8.0
diceware 4単語 51.70 8.7
英数字記号8文字 52.44 8.8
英字10文字 57.00 9.6
英数字10文字 59.54 10.0
diceware 5単語 64.62 10.9
英数字記号10文字 65.55 11.0
英字12文字 68.41 11.5
英数字12文字 71.45 12.0
diceware 6単語 77.55 13.0
英数字記号12文字 78.66 13.2
英字14文字 79.81 13.4
英数字14文字 83.36 14.0
diceware 7単語 90.47 15.2
英数字記号14文字 91.76 15.4

あとがき

ここまでに示したように、パスワードの基準というのは数値化することができる。 数値にして比較してみれば、記号を含めることがあまり効果がないものであることが分かるなど、丁寧な議論をすることが可能である。 迷信にとらわれず、必要なパスワードの強度を設定して正しくパスワードを管理することが重要である。

おまけ どうしても記号が要るなら!を使う

強固なパスワードに記号は必要ないとはいえ、記号の使用が強制される場合がある。 その場合、!を使用しておけば、JISキーボードとUSキーボードの両方で同じキーで入力できるため、トラブル時に対応がしやすくなる。