同じドメイン内の別のユーザー アカウントで実行されている別の asp.net アプリケーションによって復号化される機密データを暗号化する asp.net アプリケーションを作成しています。
DPAPI を使用してキー管理を OS レベルに渡すという記事をたくさん読みました。
このシナリオで DPAPI を使用するにはどうすればよいですか? 暗号鍵をファイルやデータベースに保存したくありません。
同じドメイン内の別のユーザー アカウントで実行されている別の asp.net アプリケーションによって復号化される機密データを暗号化する asp.net アプリケーションを作成しています。
DPAPI を使用してキー管理を OS レベルに渡すという記事をたくさん読みました。
このシナリオで DPAPI を使用するにはどうすればよいですか? 暗号鍵をファイルやデータベースに保存したくありません。
System.Security を参照する必要があり、次のようなコードが必要です (これは VB.NET ですが、簡単に C# に移植されています)。
Imports System.Security.Cryptography
' ....
Dim sensitiveDataBytes() As Byte = Encoding.Unicode.GetBytes(sensitiveData)
Dim entropy As Byte() = Guid.NewGuid().ToByteArray()
Dim encryptedSensitiveDataBytes() As Byte = ProtectedData.Protect(sensitiveDataBytes, entropy, DataProtectionScope.LocalMachine)
Dim entropyPlusSensitiveData As Byte() = entropy.Concat(encryptedSensitiveDataBytes).ToArray()
Return entropyPlusSensitiveData
ここで行っているのはSystem.Security.Cryptography.ProtectedData
、「ローカル マシン」スコープでデータを保護するために DPAPI を使用し、暗号化されたデータの先頭に追加するランダムな 16 バイトのエントロピーを作成することです。次に、16 + (暗号化されたデータの長さ) サイズの配列を安全に渡すことができます。
復号化側でも同様のトリックを行います。16 エントロピー バイトを取り除き、DPAPI を使用して復号化します。
Dim entropyPlusSensitiveData As Byte() = data ' the byte array created previously
Dim entropy() As Byte = entropyPlusSensitiveData.Take(16).ToArray()
Dim encryptedSensitiveDataBytes() As Byte = entropyPlusSensitiveData.Skip(16).ToArray()
Dim sensitiveDataBytes() As Byte = ProtectedData.Unprotect(encryptedSensitiveDataBytes, entropy, DataProtectionScope.LocalMachine)
エントロピーは厳密には必須ではありませんが、強くお勧めします。