ブログが続かないわけ

この日記のはてなブックマーク数
Webエンジニアが思うこと by junichiro on Facebook

パスワードを平文で管理するのはダメだ

このエントリーを含むはてなブックマーク hateb
最近の入門書はとにかくセキュリティ面がおろそか

今日の話は既知の人に取っては当たり前のことばかりなんだけど、こういうことって最近の入門書には書かれていないし、受託案件でクライアントから出てくる要件に含まれていることがほとんどないから、もしかしたら普通にプログラミングの勉強をしているだけでは知らないままになってしまうかもしれないと思って書いてみた。

大手プロバイダで学んだセキュリティの意識

社会人1年目は大手プロバイダで働くことになった。まだ、僕がプログラミングの世界に入る前のことだ。そこでは、お客様からのお問い合わせに対応するというのが僕の仕事だった。当時、お客様を納得させるのがとても大変だった問い合わせが、パスワード忘れに関するものだ。

お客様は、問い合わせさえすればすぐにでもパスワードを教えて頂けるものと思っているのだが、ことはそう簡単には運ばない。
パスワードの伝達手段や、問い合わせしてきている方の本人確認などの問題も大きいのだが、そもそも大前提として、こちらではお客様のパスワードがわからないのだ。
(正確に言うと初期発行のパスワードのままであればこちらでもわかるのだが、そういう細かいとこは今は関係ないので無視)

結局パスワード忘れへの対応は、再発行しかなかったのだ。再発行手数料は300円で、しかも1週間くらいかかる。当然、お客様は自分が忘れたという事実も棚に上げて、こちらを罵るわけだ。
僕自身、これはとにかく不便で困っていたので、システム担当者に掛け合ってみた。

だって、IDとパスワードの組み合わせでログインできるかどうかを判定しているのだから、当然こちらには判定の根拠であるパスワードを保持していると思っていたので、ちょっとDBとかを覗いてみてもらえないかと思ったのだ。

ところが、DBの中をのぞいてもわからないという。
「パスワードは暗号化してるからわからないよ。」って。
「そこをなんとか復号してよ」ってお願いしたところ、それもできないとのこと。しかも、ルール上のことではなく技術的にできないらしい。

ここで、パスワードを暗号化して保持することのセキュリティ的な意味合いを考えてみよう。
1. 万が一DBに格納されているパスワードが盗まれた場合にも、なりすましログインが防げる。
2. 内部の人間がパスワードを見ても、なりすましログインができない。
3. 2.により内部の人間もなりすましログインができないことを世間に証明できる。

復号ができる暗号では2と3が成り立たない。復号のロジックを知ることのできる内部の悪用を防げないからだ。
あらぬ嫌疑をかけられるだけで信頼の喪失につながる大手プロバイダーでは、3が一番大きな理由だったのかもしれない。

ちなみに、暗号化されたパスワードをどのように認証に使っているかというと、ユーザーが入力したデータを同じロジック(MD5などの復号できない暗号化)で暗号化し、DBに格納されている暗号化されたデータと文字列比較を行うのだ。

※Yappoさんのご指摘により2007/10/23に追記
正確には「復号するアルゴリズムがない暗号化」というべきで、復号する方法はある。
詳細は、別エントリー(MD5は復号できる!?)を参照のこと。

僕はここで2つのことを学んだ。
1. セキュリティに対する意識(とその高さ)
2. セキュリティと利便性はトレードオフだということ

受託の仕事をするようになって

それから、僕はプログラミングの仕事をするようになって、いろいろなアプリケーションの開発に取り組んだ。しかし、パスワードを暗号化して保持することに反対するお客さんを多数見てきた。セキュリティの意識が低い時代は、利便性を下げてしまう僕の案が却下されることも多かった(前の会社での話)。お客様のパスワード忘れに対して、そんな対応しかできないんじゃダメだと。僕なんかはパスワードを簡単に教えてくれる方がよっぽど嫌なのだが、これは世の中一般より僕のセキュリティ意識が高いことが問題ということに落ち着くケースが多かった。結局世の中の一般的なセキュリティの意識に合わせるのが一番合理的なのだという結論に達し、嫌々平文のパスワードを保持したことも何度もあった。

「僕のセキュリティ意識が高い」というのは皮肉ではなく、セキュリティと利便性がトレードオフである限り、過剰なセキュリティ対策は単なる利便性の低下でしかないのだから、ある意味正当な論理という意味だ。

危険を回避する

世の中のセキュリティに対する意識が高まるにつれて、だんだんとそういう危ない管理をするサイトも少なくなってきているはずだと思うが、あきらかに平文で保持しているサイトもまだ少なくない。パスワードリマインダなどを使うと、平気で平文のパスワードがメールで送られてきたりするアレだ。これを利用することで、パスワードリマインダを使って、そのサイトの安全性を、簡易的にではあるが測ることができる。

1. 平文で自分が設定したパスワードが送られてくる。
これは最低のパターン。パスワードが平文(または復号可能な暗号化)で管理されている上に、それをメールでネット上にも平文で流してしまっている。
2. パスワードが再設定され、新しく設定されたパスワードがメールで送られてくる。
さらに、そのパスワードで通常通りログインができて、サイトも自由に使える。
1よりはマシだが、パスワードをメールで流すというところに問題がある。メールは平文だから。
3. パスワードが再設定され、新しく設定されたパスワードがメールで送られてくる。
しかし、そのパスワードには有効期限が設定されていて、有効期限内に自分でパスワードを変更しなければならない。
こうなっていれば一時的に平文で流れたパスワードも、ユーザー自身の手で暗号化することができる。

以上、2と3については、登録画面などがSSLで暗号化されていることが前提である。1に関しては論外。サイトがSSLで暗号化されているのに、1.のようなパターンのサイトがあるとしたら、それは本当にお金の無駄遣いだと思う。

僕の場合、1のサイトは利用を避ける。2.の場合は再設定された後に必ず自分の手で管理画面からパスワードを変更するようにしている。

これはあくまでもパスワードの平文管理の話だけなのだけれども、こういう部分を見れば、サイト全体のセキュリティコンセプトなどもある程度推し量れるというものである。
この記事のトラックバックURL
トラックバック機能は終了しました。
トラックバック
MD5は復号できる!?
前回のエントリ(パスワードを平文で管理するのはダメだ)のブクマコメントでYappoさんから貴重な情報を頂いた。 MD5が復号できるというのだ。 しかも、それができるDigest::MD5::ReverseというCPANモジュールがあるという。 これには驚いた。いろいろな情報を当たっ
| ブログが続かないわけ | 2007/10/23 12:29 PM |
[PHP]オープンソースのパスワードハッシュ化状況調査
こないだ書いた下記のエントリでいろいろなコメントを頂いた。 ■パスワードを平文で管理するのはダメだ ■MD5は復号できる!? で、結局どんな風にハッシュ化すれば安全なのか僕なりに理解した。 まず、平文は問題外。 次にハッシュ化の方法だけどMD5やSHA1の場合
| ブログが続かないわけ | 2007/11/06 12:40 PM |
[PHP]パスワードのハッシュ化にはcrypt が便利
パスワードをDBに保管するとき、プレーンテキストのままじゃダメってのはもういいよね。 (参考)ブログが続かないわけ | パスワードを平文で管理するのはダメだ で、そのときどうやってハッシュ化するかというお話。 まず、大前提として復号可能な暗号は避けた方
| ブログが続かないわけ | 2009/01/22 8:12 PM |
コメント









関連情報