Безопасные ключи шифрования с использованием DPAPI - PullRequest
0 голосов
/ 11 февраля 2011

Я пишу приложение asp.net, которое шифрует конфиденциальные данные, которые расшифровываются другим приложением asp.net, работающим на разных учетных записях пользователей в одном домене.

Я прочитал множество статей, в которых говорится об использованииDPAPI для передачи управления ключами на уровень операционной системы.

Как я могу использовать DPAPI в этом сценарии?я не хочу хранить ключ шифрования в файле или базе данных.

1 Ответ

0 голосов
/ 11 февраля 2011

Вам нужно сослаться на 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)

Энтропия не обязательна, но настоятельно рекомендуется.

...