it-swarm.com.ru

Лучшие практики для сохранения конфиденциальных данных в Windows 8

Каков наилучший способ сохранения конфиденциальных данных в локальный файл в Windows 8? Я занимаюсь разработкой приложения на C #, которое должно хранить oAuth-токены/пароли. Я слышал, что в .NET было обычным делом шифровать/дешифровать данные, но у меня нет никакого опыта работы с этой механикой. Шифрование все еще рекомендуется/необходимо, учитывая, что приложения Windows 8 имеют свою собственную личную/защищенную область хранения, подобную Windows Phone?

Кроме того, не вызывает ли шифрование/дешифрование каждый раз, когда вы запрашиваете данные, проблемы с производительностью? (было бы лучше написать собственный/облегченный алгоритм?)

29
Nick

UPDATE: Имейте в виду, что, хотя современные/metro-приложения запрещают соваться друг с другом, desktop приложения будут иметь неограниченный доступ ко всем данным, хранящимся через эти API. Смотрите http://www.hanselman.com/blog/SavingAndRetrievingBrowserAndOtherPasswords.aspx , который включает в себя код, демонстрирующий это.


В Win8 появился новый API под названием PasswordVault , предназначенный для решения всех этих трудных для вас проблем. Действительно прост в использовании, безопасен и может быть настроен пользователями на роуминг между своими компьютерами, поэтому им нужно вводить учетные данные только один раз. Я успешно использовал это для токенов OAuth

Получение учетных данных (обратите внимание на глупое исключение, которое вызывает WinRT ... они действительно должны просто возвращать ноль):

const string VAULT_RESOURCE = "[My App] Credentials";
string UserName { get; set; };
string Password { get; set; };
var vault = new PasswordVault();

try
{
   var creds = vault.FindAllByResource(VAULT_RESOURCE).FirstOrDefault();
   if (creds != null)
   {
      UserName = creds.UserName;
      Password = vault.Retrieve(VAULT_RESOURCE, UserName).Password;
   }
}
catch(COMException) 
{
   // this exception likely means that no credentials have been stored
}

Хранение учетных данных:

vault.Add(new PasswordCredential(VAULT_RESOURCE, UserName, Password));

Удаление учетных данных (когда пользователь нажимает кнопку выхода из приложения):

vault.Remove(_vault.Retrieve(VAULT_RESOURCE, UserName));
48
Robert Levy

Это зависит от того, что вам нужно, если вам действительно нужно хранить пароли, вы должны использовать алгоритм двустороннего шифрования, такой как 3DES/RC2/Rijndael и т.д.

Однако, если вам нужно только проверить правильность пароля, рекомендуется использовать одностороннюю функцию для хранения хэша. 

При работе с конфиденциальными данными я действительно рекомендую шифровать/хэшировать их, даже если вы используете Windows 8. Шифрование означает дополнительные издержки, но в большинстве случаев вы не заметите разницу в скорости.

Было бы лучше написать свой собственный алгоритм Custom/Lite? Как охранник, я советую против этого. Люди проводят годы, тестируя, совершенствуясь и пытаясь найти дыры в существующих алгоритмах. Те, которые выжили, поэтому довольно хороши.

0
HansPolders