病みつきエンジニアブログ

機械学習、Python、Scala、JavaScript、などなど

女子高生でもわかるパスワードの話

導入

日本の情報教育ではパスワードについてちゃんと知る機会がないので、語ってみようかと思います。目次は

  • なぜパスワードをつけるのか?
  • 攻撃方法 #1
  • 攻撃方法 #2
  • 安全なパスワードまとめ

となってます。攻撃方法を知って安全なパスワードを知る、というコンセプトで、誰にでもわかるようにお話ししたいと思います。

なぜパスワードをつけるのか?

 私たちの人生でパスワードのルーツをたどろうとすると、家の鍵とか、日記の鍵とか、「鍵」になるんじゃないかと思います。
 では、なぜ鍵をつけるのか?
 答えは簡単で、「自分以外に見られたくないから」です。だから、鍵は自分だけ知ってるところに保存します。
 しかし理由はそれだけではありません。鍵をかけることによって、「法的に私以外が解錠してはいけません」と宣言することが出来ます。そしてコンピュータにおける鍵=パスワードを関係ない人が勝手に開けると、それは犯罪です。そう不正アクセス禁止法が規定してくれているのです。つまり、どんなに貧弱な鍵・パスワードであっても、設置することに意味があると言えます(1文字のパスワードや、無線LAN暗号方式のWEPに該当します)。
 そうは言っても、自分がパスワードをかけたものは見られたくないのが当然です。そこで、どういったパスワードが解除されないのか、考えていきましょう。

攻撃方法 #1

 まず、攻撃方法として、総当たり方式というのがあります。英語でいうとブルートフォースアタックです。名前かっこいー!
 例えば、恋人の携帯電話を盗み見たいとします。しかし恋人は携帯電話に暗証番号をつけていました(iPhoneガラケーの暗証番号だとしてください。1234とか5678とか)。ロックを解除するのは簡単で、ひたすら番号を入力していけばいいです。0001、0002、0003、0004、・・・・9999までやれば、必ず暗証番号がわかるでしょう。
 数字の暗証番号じゃなくて、誰かのtwitterのパスワードを知りたいとします。そしたら、a、b、c、d、・・・・とずーーーーっとやっていけば、死ぬまでにはパスワードがわかるでしょう。
 少々非現実的ですが、コンピューターにやらせてしまえば、そのうちパスワードがわかってしまいます

 そうは言っても非現実的なので、この方法の亜種である、辞書攻撃というものが使われます。
 使われるパスワードはだいたい辞書に乗っている言葉なので「love」とか「you」とか、それを組み合わせた「loveyou」とか、意味のある言葉で総当たり攻撃を仕掛けます。
 もし辞書に乗っている言葉がパスワードだったら、ブルートフォースアタックよりもはるかに短い時間で解除されてしまいます

 これらの解決策は簡単で、予測されやすいような言葉を使わないということに尽きます。
 もしくは、言葉を組み合わせたものもダメです。
 逆に、数字とアルファベット、もしくは記号などを組み合わせるといいでしょう。

攻撃方法 #2

 ここから話が難しくなります。なので結論まで飛ばしていただいても。。。笑

 例えばtwitterにかけられたパスワードは、twitter社(のサーバー)で照合して、正しいか正しくないかを判断します。しかし、これがたまに流出してしまうことがあります(最近だとSONYがやらかしました)。パスワードが流出してしまうのは嫌なので、たいていは何重もの対策をします。
 その一つの例が、会社に保存しておくパスワードを、不可逆的に暗号化することです。つまり、パスワードは暗号化された状態で流出します。安全でしょ?
 この暗号化の面白いところが、不可逆的で一方通行であるという点です。例えば、

パスワードがaならca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
パスワードがbなら3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d

 として保存されています。流出するときは

2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6

 みたいなものが流出するのですが、それが「c」であるとは誰も知りません。

 で、SONYとかから盗ってきたけど暗号化されているパスワードを、どうやって元のパスワードにするのか? つまり、「2e7d2c0・・・cを暗号化したものである」と、どうやって知るのか?
 一つの答えは、先程のブルートフォースアタックです。aならca97811・・・bなら3e23e81・・・cなら2e7d2c0・・・、、、、というのを、手当り次第に調べていきます。

 そうは言っても非現実的なので、レインボーテーブルというものを使います。あんまり名前かっこ良くないですね。
 先程のパスワードの暗号化ですが、暗号方法は(ほぼ)世界共通です(sha-2)。世界中で手当り次第に同じことを調べるというのもアホらしいので、調べた結果をデータベースとして保存して、再利用します。データベースがわかんなくても、メモ帳とかにひたすら書いて、保存してしまえばいいです。もっと言えば、保存されたものを誰かから購入すればいいです。
 そしたら、その調べた結果から2e7d2c0・・・を検索すれば、それがcだとわかります。はるかに時間が短縮できます。時短テクです。冷凍食品みたいなもんです。

 このレインボーテーブルには欠点があります。例えば9文字のパスワードで、アルファベット+数字の62文字の文字種であれば、15633814156853823(1.6京)通りあります。一つの暗号化ペアあたり64文字ぐらいなので、だいたい1000564106038644672バイトあります。100万TB(テラバイト)です。非現実的ですね。冷凍食品が入る冷凍庫には限度があります。ちなみに、9文字以上のレインボーテーブルは一般的には無理らしいです(wikipedia:レインボーテーブル)。
 8文字で試算すると150TB程なので、結構現実的だったりします。

 なので、長い文字数のパスワードにすることが大事です。10文字以上がいいんじゃないでしょうか。
 もっと安全にするならば、記号も使うといいでしょう。

安全なパスワードまとめ

 以上をまとめます。
 まずは、パスワードをつけるようにしましょう。無線LANとか。パスワードを解除するのは犯罪なのです。
 そして、長くて、辞書に乗ってない言葉を使ったパスワードにしましょう。数字や記号を入れたり(a1u!eo!)、10文字以上にしたり(sfaklsfjlkj)、しましょう。
 めんどくさいよーうという方は、いつものパスワードに、プラス3文字、好きな記号を入れてみてください。
 これからも安全なパスワードライフを送っていただければ幸いです。