ゴール:
カスタムWebアプリ(ショアホスティング環境ではPHP / MySQL)でユーザーが質問を作成し、他のユーザーから情報を収集できるようにし、収集したデータを保護したいと思います。
バックグラウンド:
すべてのユーザーが回答するデフォルトの質問は一般的であるため、個人を特定できる情報(PII)として解釈できないため、保護する責任が制限されますが、独自の質問を作成するユーザーはPIIを要求する可能性が高く、これが責任になります。
私がやりたいのは、ホスティングアカウントまたはデータベースのいずれか(または両方!)が侵害された場合に、かなりの量の作業がなければPIIを回復できないように、そしてそれでも、理論的には、ごく一部が回復可能です。
提案された解決策:
MySQLの組み込みAES_ENCRYPT()/AES_DECRYPT()
関数を使用してPIIテーブルを暗号化すると仮定すると、パスフレーズをホスティングアカウントに保存する必要があるため、ホスティングアカウントが侵害された場合でも、データを簡単に読み取ることができます。
ユーザーのパスワードは十分に保護されている(ソルトでハッシュ化されている)ため、認証中にプレーンテキストのパスワードをキャプチャして暗号化し、ユーザーがログアウトするまでPHPセッションに保存することを考えています。
公開鍵と秘密鍵の組み合わせがユーザーごとに作成され、秘密鍵はユーザーのパスワード+ソルトでパスワード保護されます。
次に、そのユーザーのカスタム質問に基づくPIIデータがDBに追加されると、ユーザーの公開鍵を使用して、アプリを通じて収集したPIIが暗号化されます。データが読み取られると(ユーザーがログインしている場合のみ)、データはユーザーの秘密鍵(パスワードとソルトでロック解除されます)で暗号化されません。
私が見る利点は次のとおりです。
- サーバーが完全に侵害された最悪のシナリオでは、暗号化キーを見つけるためにアプリコードが読み取られ、ユーザーのパスワードを見つけるためにPHPセッションファイルが復号化され、次にそのユーザーに関連付けられたPIIテーブルのエントリが復号化され、質問からPIIのみが収集されます。現在ログインしているユーザーの数を回復できます。ログインしていないユーザーは安全です。
- DBAなどでさえPIIを読み取ることができません。
私が見る欠点は次のとおりです。
- ユーザーパスワードは、ログインしている間、回復可能な形式で保存されます。
- パスワードを忘れたユーザーは、データにアクセスできなくなります。
- 暗号化により、データの各比較的小さなビットがDB内ではるかに多くのスペースを占有します。
私の質問:これを行うためのより良い方法はありますか?