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

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

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

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

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ:. Помните, что в то время как современные приложения/приложения для метро запрещены от подталкивания друг к другу, настольные приложения будут иметь неограниченный доступ ко всем данным, хранящимся в этих API. Смотрите http://www.hanselman.com/blog/SavingAndRetrievingBrowserAndOtherPasswords.aspx, который включает в себя код, демонстрирующий это.


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

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

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));

Ответ 2

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

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

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

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

Ответ 3

вы можете зашифровать так:

    public static string EncodePassword(string password)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(password);
        byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(bytes);
        return Convert.ToBase64String(inArray);
    }

И при проверке ввода пользователя вы также вставляете его в этот метод и проверяете его соответствие.

В случае данных, которые вы помещаете в xml (например), которые вы хотите зашифровать/расшифровать, вы можете использовать RijndaelManaged.

-Edit1 -

Пример: если у вас есть маленький экран входа в систему (ShowDialog), вы можете сделать это как это snip-it:

private void settings_Click(object sender, RoutedEventArgs e)
{
    Login log = new Login();    //login window
    log.ShowDialog();           //show the login window
    string un = log.userName.Text;  //the user input from the username field
    string pw = log.passWord.Password; //the userinput from the password input
    if (EncodePassword(un) == Properties.Settings.Default.adminUsername && EncodePassword(pw) == Properties.Settings.Default.adminPassword) //in my case, i stored it in the app settings, but this could also be somewhere else.
    {
        //login was correct
        //do something
    }
    else
    {
        //login was not correct
    }
}