7.8. 秘密にしたい情報は隠す

秘密にしたい情報は、詮索好きな目から見えないようにすべきです。入力であっても 出力であっても、システムに保存されている時にはそうすべきです。 秘密にしたい情報には、クレジットカードの番号や貯金の残高、自宅の住所等 が必ず含まれます。また、アプリケーションは名前や電子メールのアドレス他の プライベートな情報をたくさん扱っています。

Web ベースのアプリケーションは、ユーザとの通信に秘密にしたい情報があるなら、 すべて暗号化する必要があります。 普通は、「https」プロトコル(HTTP を SSL や TLS にのせている)を使います。 HTTP 1.1 の規格書(IETF RFC 2616 セクション 15.1.3)によれば、HTTP プロトコルを 使ってサービスを提供している著者は、GET をベースにしたフォームを秘密にしたい データの登録に使用すべきではないとしています。そうすると、 このデータがリクエストした URI に符号化して入ってしまうからです。 既存のサーバやプロクシ、ユーザ側のエージェントの多くは、リクエストした URI をどこかに記録し、この記録が第三者から見えてしまうかもしれません。 GET のかわりに、この目的に向いている POST ベースで登録を使ってください。

秘密扱いのデータを扱うデータベースでは、記憶装置(ディスク上のファイル等) も暗号化しておくべきです。 そのような暗号化をしても、攻撃者が安全が必要なアプリケーションを破壊する行為を 防げませんし、当然ながらアプリケーションは、暗号化したデータにアクセスする 何らかの手段も用意しなければなりません。 しかし、データが入ったバックアップ用のディスクをどうにか得ようとする攻撃者 に対しては、防御になります。しかしデータの復号に使用 する鍵を得ようとする攻撃に対しては、効果がありません。 また、攻撃者がアプリケーションにまんまと侵入できなければ防御になります。 しかし、関連しているシステムの一部に侵入できれば、保管してあるデータを見る のには十分です。この場合も、攻撃者は暗号化アルゴリズムを破らなければ、データ を取得できません。 データが不用意に移動してしまうケースがたくさんあります(たとえば core ファイル) が、これも防げます。 しかし注目すべきなのは、思ったほどこれが強力な防御にはならない点です。サーバ 自身がやられてしまう可能性があるからです。