目的
こんどモブプログラミング会で認証部分を作るので、知っていることを棚卸してみます。
パスワードの保存
IPAの安全なパスワードの作り方でも紹介されてます。salt付ハッシュ値の形でパスワードは保管しておきます。
なぜsalt付ハッシュ値?
大前提として、データは盗まれる可能性があります。プログラムをちゃんと作っていても、標的型攻撃や、内部犯には対抗できません。それに、完璧なプログラムなんてないと思います。
そうすると「盗まれても大丈夫」な方法でパスワードを保存しておく必要があります。(大丈夫、は言い過ぎかな。。)
暗号化すればいいじゃん
確かに、暗号化すれば読み取れません。しかし、復号方法がばれてしまえばパスワードがすべて読み取られてしまいます。別途復号方法を盗まれるなりすれば一大事です。生パスワードを保存しているよりははるかにいいですが。
ではハッシュ化すれば十分か
一方向ハッシュ化すれば復号できません(一応できるけどとても時間がかかる)。しかし、復号できなければOKかといったらそうではありません。あらかじめ同じハッシュ関数をつかってありそうなパスワードからハッシュ値の辞書を作っておくこともできます(レインボーテーブルと呼ぶそうです)。その辞書から逆引きすれば、パスワードがばれてしまいます(すべてのユーザが複雑なパスワードを設定しているとは限りませんので)。
だからsalt付ハッシュ値
salt
と呼ばれるユーザ毎に異なる文字列をくっつけてハッシュ化します。辞書を作ってパスワードを割り出そうにも、作らなければならないパターンが膨大になり、解読は現実的でなくなります。とはいっても時間をかければ解読できないくもないので、
パスワードデータが漏洩したことが発覚したら、ユーザーに対してパスワード変更の依頼を迅速に出すことも大事そうです。不正なアクセスがないかどうか、監視の目は光らせる必要がありそうです。