Подтвердить что ты не робот

Постоянное хранение зашифрованных данных с использованием .Net

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

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

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

4b9b3361

Ответ 1

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 здесь с дополнительной информацией, чем вы когда-либо хотели.

Ответ 2

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

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

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

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

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