BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

まともなシステムはパスワードを預かったりしない

今やありとあらゆるWebサイトでパスワード認証が利用されています、Web開発者ならみんな1度や2度は実装した経験がありそうっていうか日常的に作っていそうなパスワード認証機能。

パスワード認証を実現するためには、パスワードそのものをサーバ上で保持する必要はありません。超基本的な話なんだけど、そのことを分かっていない開発者が少なからず存在するような気がします。

パスワード認証の仕組みを知らない人が、利用者目線で想像すると、

「ユーザー登録でパスワードを預けておいて、一致するかどうかで認証するんだよね?」

と考えるでしょう。でもハズレです。本当はこう↓

登録時に指定されたパスワードから、一定の計算で求めた「ハッシュ値」を預かります。認証時は入力されたパスワードから同じ計算でハッシュを求め、ハッシュ同士が一致するかどうかで認証します。

パスワードそのものを預かる必要はないのです。万が一ハッシュ値が漏洩してもパスワードは分かりません。いわゆる不可逆暗号です。逆に言うと正しいパスワード以外でも認証を通ってしまう可能性はあるのですが、一般的にはかなり一意性の高い演算アルゴリズムを使うので、まず大丈夫です。

不正アクセスを防ぐことも大事だけど、安全に100%はありません。万が一、情報流出した場合に被害が最小限になるように考えることも非常に大事です。パスワードは流失した場合のリスクが非常に高いので、そのままサーバ上に保持するようなことはあってはいけません。

これって、セキュアプログラミングの要素として、なぜか今まであまり触れられなかった部分じゃないですかね?

ユーザー認証も自前実装をやめて、フレームワークを使うべき時代なのかなあ。と思います。RailsだったらDeviseとか。

コメント

2011/11/13 10:12 from DSLR-A850

素晴らしい情報をありがとう!私はそうでなければこれを発見できなかったでしょう!