いまいちに感じるセキュリティの解説

Webアプリケーションセキュリティの基本として以下のような解説文をみかけることがある。

ログイン画面で誤ったパスワードが入力された場合に「パスワードが違います。」と表示してはいけない。「存在するユーザID」が分かることで、セキュリティの強度が下がるからだ。ユーザIDが違う場合でも、パスワードが違う場合でも、「ユーザ名またはパスワードが違います。」と表示すべきである。

一見分かりやすく要点が述べられているように思えるが、実は実際にシステム開発を行う時に矛盾を感じる解説であったりする。
ログイン画面があるアプリケーションには、新規登録用の画面が通常存在する。その際、存在するユーザIDを登録しようとすると、「指定されたユーザIDは既に存在します。」などのメッセージが返される。この流れは一般的であるが、「存在するユーザID」が分かってしまうことがセキュリティの強度低下に繋がるのならば、「指定されたユーザIDは既に存在します。」というメッセージも表示してはいけないのでは?と思う人もいるだろう。
表示してはいけないとしたらどうすればよいか?といくら考えても答えは出てこない。重複を許さないユーザIDはキー項目として扱われるので、そのIDを登録することは出来ない。登録出来ないものは登録出来ないとユーザに通知する義務がアプリケーションにはあるからだ。従って「指定されたユーザIDは既に存在します。」というメッセージは表示してもよいことになる。
そうすると、ログイン画面での解説と矛盾が発生する訳だが、矛盾の原因はどこにあるのだろう?答えは「ユーザIDとパスワードの組み合わせ」でセキュリティ強度を考えたことにある。
セキュリティの強度は「ユーザIDとパスワードの組み合わせ」で考えるのではなく、「パスワード」だけで考えなくてはならない。単体でも推測するのが現実的に難しい強度を持たなければならない項目がパスワードであって、ユーザIDが存在することを隠す必要は本来無いはずである。

じゃあ、ログイン画面では「パスワードが違います。」と表示してもよいのか?と言われたら、ユーザがID項目の入力ミスをしたのか、パスワード項目の入力ミスをしたのか、アプリケーションには分からないから「ユーザ名またはパスワードが違います。」と表示した方がよいでしょう。と答えることになるので、結果的には同じ事になるのだけれど^^;