19

アプリケーションの実行間で暗号化されたデータ (いくつかの小さな文字列) を保存する必要があります。ユーザーがアプリケーションを起動するたびにパスフレーズを入力する必要はありません。つまり、結局のところ、暗号化キーを安全に保管することになります。

RSACryptoServiceProvider を調べて PersistentKeyInCsp を使用していましたが、どのように機能するのかわかりません。キー コンテナーは、アプリケーションの実行間またはマシンの再起動間で持続しますか? はいの場合、それはユーザー固有ですか、それともマシン固有ですか。つまり、暗号化されたデータをユーザーのローミング プロファイルに保存した場合、ユーザーが別のマシンにログオンした場合にデータを復号化できますか?

上記がうまくいかない場合、どのような選択肢がありますか (ローミング プロファイルを処理する必要があります)。

4

2 に答える 2

38

データ保護 API (DPAPI) はまさにあなたが望むことを行います。暗号化キーとして、マシンまたは (より良い) ユーザーの資格情報を使用して、任意のデータの対称暗号化を提供します。キーの管理について心配する必要はありません。Windows がそれを処理します。ユーザーがパスワードを変更すると、Windows はユーザーの新しいパスワードを使用してデータを再暗号化します。

DPAPI は、System.Security.Cryptography.ProtectedData クラスを使用して .NET で公開されます。

byte[] plaintextBytes = GetDataToProtect();
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser);

Protect メソッドの 2 番目のパラメーターは、オプションのエントロピー バイト配列で、追加のアプリケーション固有の "シークレット" として使用できます。

復号化するには、ProtectedData.Unprotect 呼び出しを使用します。

byte[] encodedBytes = GetDataToUnprotect();
byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser);

DPAPI はローミング プロファイル (ここで説明されているように) で正しく動作しますが、さまざまなマシンがアクセスできる場所 (ネットワーク共有、IsolatedStorageScope.Roaming を使用したIsolatedStorageなど) に暗号化されたデータを格納する必要があります。

詳細については、MSDN の ProtectedData クラスを参照してください。ここにDPAPI ホワイト ペーパーがあり、必要以上の情報が含まれています。

于 2008-09-30T19:53:41.763 に答える
0

DPAPI アプローチに追加したいと思います。

私自身はユーザー ストア アプローチを実装していませんが、特定のユーザーのデータを暗号化および復号化するユーザー ストア アプローチに関する Microsoft のドキュメントがあります。

マシン ストアを使用して DPAPI を使用しました。あなたが探しているものと一致する場合は、それについて説明します。Windows サービスを使用して Windows ユーザー プロファイルを読み込みましたが、そのユーザーのパスワードはデータの暗号化に使用されています。

補足として、DPAPI は (AES よりも) わずかに弱い可能性がある Triple-DES を使用しますが、どのタイプの保護を探しているのかわかりません。

Windows データ保護 http://msdn.microsoft.com/en-us/library/ms995355.aspx

于 2008-09-30T20:02:46.077 に答える