そこで私は、人事部門が元従業員の記録を保存および検索するために必要とする補助的な Web ベースのシステムに取り組んでいます。私はこの要件に抵抗しましたが、最終的には、システムは完全な SSN による検索と、完全な SSN の取得の両方を可能にする必要があると言い渡されました。私の抗議はさておき、このデータを保護するためにいくつかの措置を講じることは、実際に彼らが現在行っていることよりも大幅に改善されます (知りたくありません)。
私は多くの調査を行っており、合理的な計画を思いついたと思いますが、暗号化/セキュリティ関連のすべてのものと同様に、非常に多くの複雑さがあり、間違いを犯しやすい. 私のおおまかな計画は次のとおりです。
- アプリケーションの初回実行時に、RijndaelManaged を使用して大きなランダム ソルトと 128 ビット AES キーを生成します。
- 緊急時の復旧のために、これらの両方をプレーンテキスト ファイルに書き出します。このファイルは、安全な物理的な場所にオフラインで保存されます。アプリケーションはファイルの存在をチェックし、ファイルがまだ存在する場合は警告を発します。
- ソルトと鍵はどこかに安全に保管してください。これは私が素晴らしい答えを持っていない部分です。私は DPAPI を使用することを計画していましたが、最終的にどれだけ安全かはわかりません。プレーンテキストのままにして、保存されているディレクトリへのファイルシステムアクセスを制限する方がよいでしょうか?
- データベースにレコードを書き込むときは、上記の大きなソルト値とともに SSN をハッシュして、検索可能なフィールドを生成します (ただし、可能性のあるすべての SSN をソルトおよびブルート フォースで取得しないと回復できません)。AES は生の SSN 値を新しい IV (一緒に保存) を使用して、(キー/iv を使用して) 取得可能であるが検索可能ではないフィールドを生成します (同じ SSN を 2 回暗号化すると、異なる出力が生成されるため)。
- 検索するときは、検索値を同じソルトでハッシュしてDBで検索するだけです
- 取得するときは、AESキー/ivを使用してDBから値を復号化します
鍵を比較的安全な方法 (上記の 3) で保管する必要があることを除けば、それで十分なようです。
私たちにとってうまくいかないこと:
- 「これをしないでください」という選択肢はありません。これを行う必要があり、それを行わないと、a) 私たちに腹を立て、b) 電子メールですべての数値をプレーンテキスト ドキュメントで渡すだけになります。
これは私たちのネットワークの内部でのみ行われるため、少なくともここで実装されているものの上にその保護レイヤーがあります. また、アプリケーション自体へのアクセスは Active Directory によって制御されます。
読んでくれてありがとう、そしてアドバイスをくれてありがとう。
更新 #1: コメントから、SSN 取得フィールドに非公開の IV を保持する意味がないことに気付きました。各レコードに対して新しい IV を適切に生成し、暗号化された値と一緒に保存するように計画を更新しました。
更新 #2: できないことのリストからハードウェアのことを削除します。少し調べてみたところ、思ったよりアクセスしやすいようです。これらの USB セキュリティ トークンの 1 つを利用することで、キー ストレージに意味のあるセキュリティが追加されますか?