パスワード定期変更云々

「定期的にパスワードを変更」すべきか否か、セキュリティの話でたびたび繰り返されるテーマです。
だいたいの話は徳丸浩さんが昨年書かれたエントリで完結してると思います。
(私も定期的に変更するのはあまり意味が無いと思ってます)

ところで、↑のエントリのコメントの一つを、高木浩光さんがブックマークしてました。

「総当りで試し終わる前にパスワードが変わってしまうことになります」< これが(私の待ち望んでいた)典型的誤解。パスワード変更しても突破確率はたいして変わらない。これが直感でわからない人達がいるのが原因。

http://b.hatena.ne.jp/HiromitsuTakagi/20090806#bookmark-15186383


一応直感で分かってる(つもり)のpochi-pですが、(自分が)間違ってる可能性もあるので一度きっちり検証してみたいと思います。


そんな訳で、夏休みの自由研究は「パスワードを定期的に変更する効果を数学(というより算数?)的に確認してみる」です。
(私は数学ガールの感想を「え、えーと。ミルカさんもテトラちゃんも可愛いね!」と誤魔化すしかないレベルの数学知識なので、どっかの式で計算間違いしてるかもしれません)


総当りでパスワードを試す場合、ヒット率は

試行時間 ÷ 全て総当りするのにかかる時間

となります。
これは

試行時間で可能な組み合わせ数 ÷ 全ての組み合わせ

と同義です。(1通りにかかる試行時間は全て同じものと仮定します)


定期的な変更をした場合、「変更前に新パスワードが試行済みかどうか」が加味されます。
(新パスワードがまだ試されてなかったら、結局ヒットするので状況は変わってない)


パスワードが変更された時点で今後のヒット率等を求めるには

「新パスワードが試行対象外」の確率 = 変更前までに試行済みの時間 ÷ 総当りに必要な時間
「新パスワードが試行対象内」の確率 = 1 − (変更前までに試行済みの時間 ÷ 総当りに必要な時間)


「次のパスワード変更前にヒットする」確率 = パスワードを変更する時間 ÷ 総当りに必要な時間
「次のパスワード変更前にヒットしない」確率 = 1 − (パスワードを変更する時間 ÷ 総当りに必要な時間)


「新パスワードが試行対象内」かつ「ヒット前に変更される」確率= (1 − (変更前までに試行済みの時間 ÷ 総当りに必要な時間)) × (1 − (パスワードを変更する時間 ÷ 総当りに必要な時間))

大雑把に書いてこんな感じの式になりますね。
総当りで解析されている間にn回変更を繰り返せば、

1回目のヒットしない確率 ×
2回目のヒットしない確率 ×
……略……
n−1回目のヒットしない確率 ×
n回目のヒットしない確率

が「最後まで逃げ切れる確率」となるはずです。


それを元に「全て総当りされる時間で、定期的な変更があった場合に最後まで逃げ切れる確率」を確認します。
計算に使ったのはこんな感じのソースです。(VB.NET)
例えば100日で全て総当り可能なパスワード強度の場合、1日毎〜100日毎の変更の効果は次のグラフのようになります。
(適当に抜粋しました)

横軸が解析時間、縦軸が回避率、??dayってなってるのは「??日毎にパスワード変更」の意味です。
直線になっているのは100日毎に変更、というより100日間変更しなかった場合の回避率です。


ちなみに↑だと目の錯覚で一番上の線の右端が61〜63%くらいに見えますが、実際は60%の線とほぼ重なってます。
(↓拡大図↓)


頑張れば60%程度の確率で回避出来るという事のようですね。
ただし最初の変更時点での回避率以上にはならないようです。
また「最後まで試行される」場合は回避率アップの効果はあるものの、「試行される時間が短い」場合には効果というほどの効果が出ません。極めて限定的な効果と言えるでしょうか。
ではこれをさらに短い間隔(1/10日、1/100日、1/1000日、1/10000日)でパスワード変更すると、どうなるでしょうか?


以下が100日経過した時点での回避率です。

  • 1/1日ごとに変更……0.6024803053077052202778070591
  • 1/10日ごとに変更……0.6061262384700378731520557945
  • 1/100日ごとに変更……0.6064902236613191629163339050
  • 1/1000日ごとに変更……0.6065266161681626993682262532
  • 1/10000日ごとに変更……0.6065302553587928894755334213

あまり効果が伸びてませんね……。
この様子だと「全ての組み合わせを総当りされる場合、回避率は60%程度までしか実現不能」な感じです。


さて、上記例では「全ての組み合わせを総当りされる場合」のものです。
イコール「現実的な時間で、総当りが実行可能な場合」での話です。


これが「総当りにかかる時間が一生かかっても終わらない」方向のパスワード強度の強化なら、どこまで回避率は上がるでしょうか?


これは簡単な話です。最初にでた公式の通りなので、
「試行可能な時間:総当りにかかる時間」が「1:100」なら回避率は99%、
「1:1000」なら99.9%になるし、「1:1000」なら(以下略)って具合です。


どうでしょうか?
パスワードの定期的変更の効果に比べて、レベルが違いますよね。


ちなみに総当りにかかる時間を増やすには、単純にパスワード強度(文字種×文字数)を強くすればいいだけです。*1
ちなみに先程検証した「定期的変更」の式でも、組み合わせ数を10倍にすれば総当り時間も通常10倍になる為、「変更間隔を10倍にする」と「パスワードの組み合わせを10倍にする」は、「時間あたりの変更回数を10倍にする」という意味では同じ効果を得ることが出来ます。
しかもパスワード強度を上げる場合は総当りにかかる時間自体を増やせるため、なおさらお得となっています。


英数大文字小文字だけで1文字増やせば62倍、
2文字増やせば3884倍、
3文字増やせば238328倍、
4文字増やせば14776336倍、
5文字増やせば916132832倍、
6文字増やせば3兆倍オーバーです。
(記号を含めたASCIIコードの非制御文字全てなら、1文字95倍、n文字で95^n倍でより効率的です)


人間の一生が仮に100年だとして、100年間毎日パスワード変更する効果はたかだか36500倍程度です。
つまるところ(総当りに対する)パスワードの定期的変更の効果は、たった3文字の追加にすら敵わない些細なものなのです。


ですから「90日に一度パスワードを変更する」決まりごとを作るくらいなら「パスワードは最低x文字」を「パスワードは最低x+3文字」にしちゃいましょう。*2


とにかく「総当りに必要な時間」を長引かせる事が大事です。
「総当りに必要な時間」さえ必要十分な大きさならば、パスワードの変更タイミングなんて数十年に1度で十分となります。


例えば次の二つは、「理論上の回避確率」は同じですね。

  • 総当りに必要な時間365年、パスワード変更のタイミング年1回
  • 総当りに必要な時間1年、パスワード変更回数のタイミング年365回

ですがもしパスワードが破られるとしたら、普通は後者の方です。
現実問題として総当りに365年かけれるクラッカーは(まだ)いないのですから。


そんな感じでイマイチ文章もまとまってないけど今年の夏の自由研究はこんな感じです。

結論
十分な強度のパスワード >>超えられない壁>> イマイチな強度のパスワード+定期的な変更

*1:もっと効率的なのは、「数回連続で間違えると数分間アカウントをロック」の形があります。1回の試行に1秒かかってる場合は数百倍程度の効果ですが、1ミリ秒とかで試行可能だった場合の効果は絶大となります。何より、回線速度や端末速度等に依存せず期間あたりの試行可能回数を一定に制限出来るのは強みです。ただし「ずっとアカウントロック」するのは使い勝手が悪いので止めるべきです。ちょっとのドジで業務に支障出ます。

*2:まあ最低文字数もですが最大文字数をとにかく伸ばすべき。出来れば無制限とかが望ましい。