web-dev-qa-db-ja.com

IVとキーを一時的かつ安全に保存する方法

.NET 4.0を使用して、暗号化されたデータを一時的にデータベースに格納するWindowsサービスを開発しています。データは挿入時に暗号化され、復号化、処理、および処理後に削除されます。これはおそらくバッチプロセスとして実行されます(一度に数千行)。

MSDNで 暗号化と復号化のキーの生成 を確認しましたが、TripleDES対称暗号化を使用できるようです(RijndaelManagedクラスの使用を考えていました)。

ただし、データを暗号化して挿入しているときにサービスが失敗したり、データベース接続が失われたりした場合は、同じIVとキーで中断したところから再開できるようにしたいと考えています。

IVとキーをローカルコンピューターに保存するにはどうすればよいですか?データベースの暗号化されたコンテンツを復号化するために検出および使用されないようにします。

5
Husein Roncevic

少なくとも簡単に改善できることの1つは、暗号化されたデータの横にあるデータベースにIVを格納するだけです。 IV自体は 非公開ではない です。これは通常、ソルトとして機能し、2つの同一の平文レコードが同一の暗号文に暗号化される状況を回避します。各行のIVをデータベースに保存すると、このデータを失う心配がなくなります。理想的には、各行IVは一意でランダムですが、秘密ではありません。

それはあなたの問題を比較的小さな情報の断片に保存することを残します:key。セキュリティの観点から、すべてのレコードに同じキーを使用しても問題はありません。キー自体が強力である限り、別のキーを使用しても何の利点もありません(実際、管理するのは本当に頭痛の種になります)。したがって、通常は1つのキーで十分です。

キーを安全に保存するためのソリューションはおそらくたくさんありますが、それらは本当に必要なセキュリティのレベルに依存します。 .NET/Microsoft環境の場合、私はあなたが [〜#〜] dpapi [〜#〜] を見ているは​​ずだと思いますが、もっと良いオプションがあるかもしれません。極端な場合は、 [〜#〜] hsm [〜#〜] またはスマートカードが必要ですが、それほど厳格ではない環境では、適切な権限でファイルシステムにキーを保存するだけで十分な場合があります。それはすべて、リスクプロファイルと脅威に依存します。

19
Yoav Aner

私があなたの状況を正しく理解している場合:

  1. IVは、暗号化されたデータ(同じフィールドに連結されるか、同じ行の別のフィールドにある)とともにデータベースに格納する必要があります。これはプレーンテキストとして保存でき、その機密性には価値がありません。
  2. 暗号化キーは、リモートアクセスできない限り、任意のファイルまたはレジストリキーに保存する必要があります。2つの制約があります。強力なACL、アプリケーション(および管理者)のみによるこのファイルへのアクセスの制限。保存する前に、それ自体を暗号化する必要があります。

最後の点については、KEK(キー暗号化キー)を引き続き保護する必要があることに注意してください...このため、DPAPI(データ保護API)は、ほとんどの状況で理想的に適しています(一部の形式を検討する必要がある場合もあります)。ハードウェアモジュール)、おそらくUSER_MODEにあります。
。NETは、ProtectedMemoryおよびProtectedDataクラスを介して簡単にアクセスできます。

8
AviD