web-dev-qa-db-ja.com

暗号化キーを.NET C#に保​​存する最良の方法

このアプリケーションには、多くの機密性の高い構成設定があり、これは再び暗号化されるxmlファイルに保存されます。

この安全なファイルは実行時に復号化され、設定値が読み込まれます。ただし、キーと初期化ベクトルがコードにハードコーディングされているため、誰でもReflectorを使用して読み取ることができるという問題が発生します。

.NETに暗号化キーを保存して、誰もReflectorを使用してそれらを読み取れないようにする最良の方法は何ですか?

61
ganeshran

他のユーザーからデータを保護する場合。 ProtectedData クラスを見てください。

(免責事項:コピー保護スキームを作成するためのデータの保護は、この回答ではカバーされていません)。

このクラスは、WindowsのDPAPIを使用して、ユーザーレベルまたはマシンレベルでデータを暗号化および復号化します。

ProtectedData/DPAPIを使用すると、キーを処理したりデータを自分で保護したりする必要がなくなります。また、現在のユーザーのデータを保護することもできます。同じドメインユーザーが別のコンピューターからデータを読み取ることができます。

独自のキーを作成する場合。ユーザー/マシンごとにキーを作成し、このキーをレジストリに保存できます。レジストリを保護できるため、現在のユーザーのみがキーを読み取ることができます。レジストリには悪いカルマがあることは知っていますが、実際にはこのようなデータの保存には非常に優れています。

PS:コードにIVを入れないでください。毎回新しいIVを作成し、データの前に配置します。

19
GvS

あなたがリフレクターでそれらを読むことができない場合、あなたはプログラムがそれらをどのように読むと期待しますか?それらを分割してその場所全体に保存することでそれらを難読化することができますが、(知る限り)プログラムがそれらを読むことができるようになったら、コードにアクセスできる人は誰でも読むことができます。

メモリ内の値にもアクセスできることを忘れないでください(cough SecureString)。

10
Massif

Machine Keystoreを使用する必要があります。これは特にこの目的のための安全なストレージです。例えば:

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

KEYNAMEは、後でキーを取得するために使用できるカスタム文字列です。

その他の例については、次の質問を参照してください。 公開鍵をマシンレベルのRSAキーコンテナに保存する方法

8
Muis

一般に、新しいキーとIVはセッションごとに作成する必要があり、キーもIVも後のセッションで使用するために保存しないでください。

対称キーとIVをリモートパーティと通信するには、通常、非対称暗号化を使用して対称キーとIVを暗号化します。これらの値を暗号化せずに安全でないネットワークを介して送信することは非常に安全ではありません。これらの値をインターセプトするとだれでもデータを復号化できるからです。キーとIVの暗号化と転送のこのプロセスの詳細については、「 暗号化スキームの作成 」を参照してください。

4
apros

アプリケーションをインストールするときに、RSAキーの新しいセットを作成し、秘密キーをパスワードとして使用してAESでデータを暗号化します。 WindowsはRSA秘密鍵を作成したPCに安全に保存するため、データはcreatedのコンピューターによってのみ復号化できます。これは、そのコンピューターのみが必要な鍵を持つためです。

3
DividedByZero

ファイル暗号化/復号化キーをリモートサーバーに保存し、httpsを介してアプリケーションに転送するWebサービスを介して取得するのはどうでしょうか。この方法では、キーはコンピューターのメモリに残りますが、ソースコードファイルには含まれません。

ただし、これには、アプリケーションを実行するユーザーがキーサーバーに接続する必要があります。

1
user1892410

キーをハードウェアに保存することについてはどうですか、ここではハードウェアセキュリティモジュールについて説明しています!キーを隠すベストプラクティスとして使用できますか?キーを構成ファイルに保存してから、構成ファイルを暗号化できますか?私の場合、スタンドアロンの.Netアプリケーションについて話しています。

0
iamjayp