Google App Engineアプリは、ユーザーを識別するためにかなりの量の個人識別情報(メール、社会保障番号など)を保存します。そのデータを保護する方法についてのアドバイスを探しています。
私の現在の戦略
機密データを次の2つの形式で保存します。
- ハッシュ-SHA-2とソルトを使用
- 暗号化-公開/秘密鍵RSAを使用
ルックアップを行う必要がある場合:
- ハッシュされたデータを検索します(クエリでPIIをハッシュし、データストアでハッシュされたPIIと比較します)。
データを再ハッシュする必要がある場合、またはその他の方法で生の形式で処理する必要がある場合:
- 暗号化されたバージョンを秘密鍵で復号化します。生の形式で保存することは絶対に避けてください。処理してから、再ハッシュして再暗号化してください。
私の懸念
ハッシュソルトを秘密にしておく
攻撃者がデータストア内のデータとハッシュソルトを入手した場合、機密データをブルートフォース攻撃する可能性があるのではないかと心配しています。一部(SSN、9桁の数字など)には大きなキースペースがないため、最新のハッシュアルゴリズムを使用しても、攻撃者がソルトを知っていれば実行できると思います。
私の現在の考えは、ソルトをソース管理から外し、独自のファイルに保存することです。そのファイルはデプロイ中にGAEにロードされ、アプリは着信データをハッシュする必要があるときにファイルを読み取ります。
展開の合間に、ソルトファイルは怒っているクマ(または貸金庫)で保護されたUSBキー上に存在します。
塩は2か所にしか住んでいない
- USBキー
- Googleアプリにデプロイ
コードのダウンロードが完全に無効になっているため、誰かがそのUSBキーを盗むことなくソルトを入手する方法を考えることはできません。私は何かが足りないのですか?
プライベートRSAキーの秘密を守る
これについてはあまり心配していません。暗号化されたバージョンを復号化する必要があることはめったにありません(ハッシュアルゴリズムまたはデータ形式を変更した場合のみ)。
秘密鍵はGAEサーバーに触れる必要はありません。暗号化されたデータをプルダウンし、ローカルで復号化して処理し、暗号化/ハッシュ化されたバージョンを再アップロードできます。
RSA秘密鍵は、クマとトラで保護されたUSBスティックに保持し、必要なときにだけ取り出すことができます。
この質問はGoogleアプリに固有のものではないことは承知していますが、GAEによって状況がやや独特になると思います。
完全に制御できる場合は、展開アクセスをロックダウンしたり、2要素認証を使用してデータストアビューアにアクセスしたりしますが、現時点ではこれらのオプションは利用できません(GAE固有のパスワードを設定することは適切ですが、気に入っていますRSAトークンが含まれている)。
私もGAEの専門家でもセキュリティの専門家でもないので、足りない穴やプラットフォームに固有のことを考えていないことがあれば、ぜひ聞いてみたいと思います。