web-dev-qa-db-ja.com

単一のキーでアイテムを暗号化するか、KDF + Saltを使用して各アイテムを暗号化しますか?

現在、個人ユーザー向けの非常に機密性の高い情報が保存されるシステムの開発を計画しています。現在議論されている2つのアプローチがあります。より具体的にするために、各ユーザーの社会保障番号(SSN)を暗号化するとします。

  1. 一度、グローバル暗号化キーを生成します/ iv。データベース内の各SSNを同じ暗号化キーで暗号化する/ iv。
  2. 一度、グローバルシークレットを生成します。グローバルシークレットとKDF(ユーザーごとのソルトを使用したPBKDF2など)を使用して、各ユーザーのSSNを暗号化するための一意のキー、ivペアを生成します。

どちらの方法を主張するのにも十分な知識がありません。(1)よりも(2)に利点はありますか?

編集:私は主に、各アプローチの一般的な長所と短所を比較検討する助けを探しています。つまり、(2)は共有のグローバルシークレットに依存しているため、(1)よりもセキュリティが強化されていますか?

5
Eric Scrivner

SSNの特性を考えると、すべてが異なることが保証されているため、使用された 動作モード (非公開)がIVを許可する場合、2番目のアプローチを使用したセキュリティの観点からはそれほど追加されません再利用。

しかし、3つ目のオプションを提案させてください。これには ハードウェアセキュリティモジュール(HSM) を使用する必要があります。

あなたの質問は、あなたがこれをプログラムで解決しようとしているという印象を私に残していますが、それには大きな問題があります:

アプリケーションがSSNを使用する場合、どこかにアクセス可能なキーが必要です。 SSNの暗号化は、ハードドライブの1つまたは格納されているデータが漏洩した場合に備えて、データを安全に保つために展開する必要があります。

これが発生し、キーをデータと共に保持する場合、データを保護するものはもうありません。 HSMが使用されない限り、データダンプには最も確実にキーも含まれます。

4
Tobi Nary

このデータを使用するアプリケーションのJOIN句またはGROUP BY句でこの値を使用するかどうかを検討する必要があります。たとえば、アプリケーションがSSNに基づいて信用履歴を組み立てる必要がある場合、その値をすべてのデータベーステーブルでdeterministically暗号化しておく必要があります。別の方法としては、すべてのレコードを復号化し、その復号化された値をJOIN基準として使用することになります。

0
Dave Mulligan