忘れたパスワードを問い合わせられるシステムなんて作っちゃいけない
今日は、ちょっとしたシステム構築を発注するときに重要なポイントとなる、顧客情報管理の話題を。テーマは「お客さんのパスワードをどう保存するか」です。
御社には、たとえばECサイトの会員や顧客向けSNSなどの、お客さんがユーザー登録をしてパスワードでログインするようなシステムがありますか?
あるとしたら、そのシステム内で、お客さんそれぞれのパスワードはどんな風に管理されているか把握していますか? または、システム構築の発注時に、どんな風にパスワードを管理するような仕様にしましたか?
クレジットカード情報や個人情報の管理には注意していても、パスワードの保存方法は、あまり気にしていないのではないでしょうか。しかし、それではまずいのです。システム構築時に正しい仕様で発注しないと、何かセキュリティ問題が発生したときに、思いがけぬ大きな範囲に影響する問題になってしまいかねないのです。
結論からいうと、お客さんが指定したパスワードをそのままデータベースに保存するようなシステムは、間違っても作ってはいけません。
「それではログインできないじゃないか」と思うかもしれませんが、大丈夫です。少し技術的なのでシステム会社に一任したくなるような話ですが、ひとつ間違えるとビジネス側のWeb担当者さんの首を絞めることになる大切な話ですので、解説しておきましょう。
先日、某大手出版社のパスポートシステムのログイン用のパスワードがわからなくなったのですが、「パスワードを忘れた」リンクを利用すると、アカウント作成時に指定していたパスワードがメールで送られてきました。
パスワードがメールで送られてくるということは、以前に指定したパスワードそのものがデータベースに保存されているということです。問い合わせれば、以前に指定したパスワードを教えてもらえるのは良いことのように思われるかもしれませんが、これは大きな問題なのです。
何が問題かというと、万が一、悪意のある第三者が御社のシステムに侵入してデータベース内の情報を盗んでしまった場合に、被害の範囲があなたのサイト内では収まらなくなってしまう可能性があるのです。
生パスワードがデータベースにそのまま保存されているということは、情報漏洩があった場合にパスワードまで漏洩してしまうことを意味します。昨今では、ユーザーはさまざまなサービスを利用していて、同じメールアドレスとパスワードの組み合わせを複数のサービスで使っているユーザーもいますよね。ということは、御社のシステムから漏洩したメールアドレスとパスワードの組み合わせで、Gmailなどのメールシステムや、Amazonなどのショッピングサービスにログインできる可能性があるのです。
そうなると、あなたのサイトのセキュリティ問題が原因で、ユーザーはさらに他のサービスでも被害を受けてしまうことになります。作ったのがシステム会社でも、ユーザーに対して責任を負うのはWeb担当者のあなたですから、抱えるユーザー数が多ければ多いほど漏洩時の二次被害が増え、対応が複雑になってしまいます。
また、第三者による侵入がなくても、システム管理者がお客さんのパスワードをのぞき見できる状態になっている点も問題です。
では、どうすればいいのでしょうか。システム発注時に、次のような仕様を含めておくことです。
ユーザーが指定したパスワードは生の値としてデータベースに保存せず、ソルト付きで生成した不可逆のハッシュ値(メッセージダイジェスト)として保存し、その情報で認証する仕組みにすること(可逆形式の暗号化も禁止)
まっとうな技術者ならば、この指示だけで意味を理解するはずです。逆に言うと、この指示で意味がわからない場合は、そこには発注しないほうがいいと判断してください。
これはどういう指示かというと、登録時にユーザーが指定したパスワード(A)を、ある特殊なハッシュ化という処理(B)を行って得られるハッシュ値(C)をデータベースに保存するのです。その後、ユーザーがログインする際には、ユーザーがパスワード(A')を入力したら、同様にハッシュ化の処理(B)を行って入力されたパスワードのハッシュ値(C')を作り、それがデータベースに保存されているハッシュ値(C)と同じならば正しいパスワードが指定されたと認めるのです。
生パスワード(A) | pass |
---|---|
ハッシュ値(C) | 6348a784ad75ed8687d0368a6ac5b885afa28e7c |
ハッシュ化というのは特別な処理で、Bの処理内容がわかったとしても、CからAはへは変換できません。ですから、万が一システムに侵入されても、侵入者には元のパスワードはわかりませんし、Cのハッシュ値は御社のシステム専用ですのでこれを利用して他のサービスにログインすることはできません。
こうすることで、データベース内には生パスワードを保存せず、ユーザーの指定したパスワードでログインできる仕組みができます。
ただ、この方法にも難点が1つあります。「パスワードを忘れたから、私が以前に使っていたパスワードを教えてくれ」というお客さんのリクエストに応えられないことです。どうやっても元のパスワードがわからないためのシステムですから当然ですね。ですので、パスワードを忘れたお客さんに対しては、新しいパスワードを設定し直してもらう仕組みになります。
御社のシステムでは、「パスワードを忘れた」とすると、指定したパスワードをそのまま教えてくれる仕組みになっていませんか? もしなっていたら、対応を考えるほうがいいでしょう。
ソーシャルもやってます!