Постоянное хранение зашифрованных данных с использованием .Net
Мне нужно хранить зашифрованные данные (несколько небольших строк) между запусками приложений. Я не хочу, чтобы пользователь предоставлял кодовую фразу каждый раз, когда он запускает приложение. То есть в конце концов, он переходит к безопасному хранению ключа (ов) шифрования.
Я искал RSACryptoServiceProvider и использовал PersistentKeyInCsp, но я не уверен, как это работает. Является ли контейнер контейнера постоянным между запусками приложений или перезагрузкой компьютера? Если да, то это зависит от пользователя или для конкретной машины. То есть если я храню свои зашифрованные данные в профиле перемещаемого пользователя, могу ли я расшифровать данные, если пользователь регистрируется на другой машине?
Если приведенное выше не работает, каковы мои параметры (мне нужно иметь дело с перемещаемыми профилями).
Ответы
Ответ 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