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

StackOverflow https://stackoverflow.com/questions/154430

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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 корректно работает с перемещаемыми профилями (как описано здесь), хотя вам придется хранить зашифрованные данные в определенном месте (сетевой ресурс, ИзолированныеStorage с ИзолированныеStorageScope.Роуминг, и т. д.), к которым имеют доступ ваши различные машины.

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top