★☆★JNSAメールマガジン 第29号 2014.2.21.☆★☆
Webサイトのパスワードが狙われています。従来からパスワードを狙った攻撃は報告されていましたが、従来からの推測しやすいパスワードを狙った攻撃に加えて、昨年からパスワードリスト攻撃と呼ばれる手法による不正ログインが急増しています。
パスワードリスト攻撃とは、SQLインジェクション攻撃などで漏えいしたID・パスワードの情報を別のWebサイトに当てはめて、ログイン試行する攻撃です。従来から、この方法で不正ログインができると予想はされていましたが、日本でも大規模なパスワード漏えいの事故があったことや、これらパスワード情報がブラックマーケットで流通していることから、パスワードリスト攻撃と見られる不正ログイン事件が頻繁に発生するようになってしまいました。
このようにパスワード情報が漏えいして悪用される背景には、利用者がパスワードを複数のサイトで共通にする(使い回す)ことと合わせて、漏えい元のWebサイトがパスワードの保護を十分にしていなかったことがあります。具体的には、パスワード情報が外部に漏えいした後に、簡単には悪用できないようにする施策が不足していたと考えられます。
それでは、なぜパスワードの保護が重要なのでしょうか。パスワードがWebサイト経由で漏えいしているという局面では、他の個人情報等も漏えいしている可能性が高いので、個人情報保護という観点からは、パスワードを特に重点的に保護する理由にはなりません。パスワード保護が重要である理由は下記の通りです。
2)のパスワードリスト攻撃が最近大きな問題になっていることは既に説明した通りです。パスワードリスト攻撃の対策は難しい課題ですが、ここでは、パスワードリスト攻撃の前段として、パスワードをできるだけ漏えいさせないための保護施策について説明します。
パスワードの保護方法として、まず思いつく方法は、パスワードを暗号化して保存することです。しかし、暗号化のためには、暗号鍵の管理が必須になりますが、サーバーに侵入されているという前提では、暗号鍵を安全に管理できるという保証が難しいと言えます。このため、パスワードの保護は、暗号学的ハッシュ関数という方法を用いることが一般的です。
一般に、ハッシュ関数とは、任意のデータを入力として、比較的短い固定長のデータ(ハッシュ値)に変換する関数のことです。ハッシュ関数のうち、ハッシュ値から元のデータを推測することが困難などの暗号学的な性質を持つものを暗号学的ハッシュ関数と呼び、MD5、SHA-1などのアルゴリズムが広く用いられています。
パスワードをハッシュ値として保存することは、ハッシュ値からは元のデータ(パスワード)を推測することが困難であることを利用したパスワードの保護方法です。
パスワードをハッシュ値として保存している場合は、認証の際にパスワードを照合する場合には、平文のパスワードは分からないため、利用者が入力したパスワードのハッシュ値を求め、データベースに保存されたハッシュ値と比較することで、正しいパスワードであることを確認します。
一般的に、MD5やSHA-1などの暗号学的ハッシュ関数により平文をハッシュ値に変換すると、ハッシュ値から元の平文を求めることは大変困難と言われていますが、パスワードの場合は事情が異なります。パスワードには文字種や長さの制限があるため、総当たり的な方法によりハッシュ値から平文パスワードが分かる場合があるからです。最近はGPU(Graphics Processing Unit)の高速演算を悪用して、ハッシュ値からのパスワード解読が行われるようになりました。この方法だと、単純なMD5ハッシュで保存された8文字英数字のパスワードの解読には、1日未満しか掛かりません。
このため、ソルトとストレッチングという方法により、パスワードの保護を強化することが行われます。
まず、ソルトというのは、ハッシュ値を求める前のパスワードに付加する短い文字列のことです。ソルトをユーザ毎に異なるものにすることで、同じパスワードをつけている利用者がいてもハッシュ値は異なるものになるので、利用者毎にパスワードの総当たり探索を行う必要がでてきます。これにより、利用者全員のパスワードを求めるために必要な時間が、利用者の人数に比例して増加します。
ソルトは、副作用が少なく大きな効果が得られるため必ず利用すべきですが、特定利用者のパスワードを守りたい場合にはあまり効果がありません。このニーズに対してはストレッチングが有効です。
ストレッチングとはハッシュ値の計算を繰り返し(例えば1万回)行う方法のことです。これにより、1日で終わる計算が1万日(約27年)掛かるようになります。ストレッチングの回数は多いほど効果がありますが、サーバー負荷が増大するという副作用があるため、バランスの良い回数を実測により求めるとよいでしょう。
ストレッチングは、あまり安全でないパスワードを保護するための救済策という側面があります。利用者が十分長いパスワードをつけていれば、ストレッチングは必要ありません。このため、利用者が安全なパスワードを設定することにより、ストレッチングがなくても安全性が保たれる状況が望ましいと言えるでしょう。
そのためには、サイト(サーバー)側と端末側の両方の改善が必要です。現状のWebサイト等では、8文字程度までのパスワードしか設定できないサイトが多いようです。しかし、ハッシュ値でパスワードを保存する前提では、パスワード長を制限する意味はあまりなく、長いパスワードを受け入れるようにサイト側の改善が求められます。
一方、パスワードが長くなると、記憶や入力の手間が大変になります。このため、パスワード管理ツールなどの普及により、利用者が手軽に、長い安全なパスワードをつけられる未来が望ましいと筆者は考えます。