Постоянное хранение зашифрованных данных с использованием .Net - PullRequest
17 голосов
/ 30 сентября 2008

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

Я изучал RSACryptoServiceProvider и использовал PersistentKeyInCsp, но я не уверен, как он работает. Сохраняется ли контейнер ключей между запусками приложения или перезагрузкой компьютера? Если да, то это зависит от пользователя или машины. То есть если я храню свои зашифрованные данные в перемещаемом профиле пользователя, могу ли я расшифровать данные, если пользователь входит на другой компьютер?

Если вышеописанное не работает, какие у меня варианты (мне нужно иметь дело с перемещаемыми профилями).

Ответы [ 2 ]

38 голосов
/ 30 сентября 2008

API защиты данных (DPAPI) делает именно то, что вам нужно. Он обеспечивает симметричное шифрование произвольных данных, используя учетные данные компьютера или (лучше) пользователя, в качестве ключа шифрования. Вам не нужно беспокоиться об управлении ключами; Windows позаботится об этом за вас. Если пользователь изменяет свой пароль, Windows повторно зашифрует данные, используя новый пароль пользователя.

DPAPI предоставляется в .NET с помощью класса System.Security.Cryptography.ProtectedData:

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

Вторым параметром метода Protect является необязательный энтропийный байтовый массив, который можно использовать в качестве дополнительного специфического для приложения «секрета».

Чтобы расшифровать, используйте вызов ProtectedData.Unprotect:

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

DPAPI корректно работает с перемещаемыми профилями (как описано здесь ), хотя вам необходимо хранить зашифрованные данные в одном месте (общий сетевой ресурс, IsolatedStorage с IsolatedStorageScope.Roaming , и т. д.), что ваши различные машины могут получить доступ.

См. Класс ProtectedData в MSDN для получения дополнительной информации. Здесь есть официальный документ DPAPI здесь , содержащий больше информации, чем вы когда-либо хотели.

0 голосов
/ 01 октября 2008

Я хотел бы добавить к подходу DPAPI.

Несмотря на то, что я сам не реализовал подход с хранилищем пользователей, существует документация Microsoft для подхода с хранилищем пользователей, которая шифрует и дешифрует данные для конкретного пользователя.

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

В качестве примечания, DPAPI использует Triple-DES, который может быть немного слабее (чем AES), но тогда я не уверен, какой тип защиты вы ищете.

Защита данных Windows http://msdn.microsoft.com/en-us/library/ms995355.aspx

...