2009-11-17 2 views
2

У меня есть настольное приложение с удаленным интерфейсом. Доступ к удаленному интерфейсу обеспечивается с помощью имени пользователя и пароля.Как сохранить пароль в реестре

Что было бы лучшим способом безопасно сохранить этот пароль, желательно в реестре?

ответ

4

Вам нужно будет сохранить хешированный пароль (будь то в реестре или где-то еще). Затем, когда пользователь вводит свой пароль, вы проверяете хешированную версию того, что они вводят с хешированной версией, как хранятся. Если они совпадают, то пароли совпадают, и вы можете ввести пользователя.

Таким образом, вы не храните пароль в виде обычного текста для всех (включая себя), чтобы получить доступ и получить доступ как кто-то еще.

Что касается используемого алгоритма хэша - я не знаю. Есть много вариантов, поэтому я неохотно рекомендую один шторм. Я предлагаю вам найти несколько и оценить их. CSharpFriends есть статья, которая выглядит как хорошая отправная точка.

+0

Какой алгоритм хеширования я должен использовать? – Amirshk

+0

Дело не в том, чтобы хранить пароль для пользователя, правда? Я думал, что это имя пользователя и пароль для некоторых внешних сервисов. – Svish

+0

@Svish, пользователь/пропуск хранится в самом приложении (внутренний веб-интерфейс для удаленного доступа) – Amirshk

7

Если вам нужно сохранить неуправляемый пароль, посмотрите на использование ProtectedData class. Это использует Data Protection API (DPAPI), который является лучшим способом обеспечения безопасности данных в Windows.

Вот маленький класс, который оборачивает ProtectedData и предоставляет методы два расширения на строки для шифрования и дешифрования данных:

public static class DataProtectionApiWrapper 
{ 
    /// <summary> 
    /// Specifies the data protection scope of the DPAPI. 
    /// </summary> 
    private const DataProtectionScope Scope = DataProtectionScope.CurrentUser; 

    public static string Encrypt(this string text) 
    { 
     if (text == null) 
     { 
      throw new ArgumentNullException("text"); 
     } 

     //encrypt data 
     var data = Encoding.Unicode.GetBytes(text); 
     byte[] encrypted = ProtectedData.Protect(data, null, Scope); 

     //return as base64 string 
     return Convert.ToBase64String(encrypted); 
    } 

    public static string Decrypt(this string cipher) 
    { 
     if (cipher == null) 
     { 
      throw new ArgumentNullException("cipher"); 
     } 

     //parse base64 string 
     byte[] data = Convert.FromBase64String(cipher); 

     //decrypt data 
     byte[] decrypted = ProtectedData.Unprotect(data, null, Scope); 
     return Encoding.Unicode.GetString(decrypted); 
    } 

} 
+0

Если я правильно понимаю, любое приложение, работающее в пространстве пользователя, может расшифровать эти данные. Я прав? – Amirshk

+0

Я так считаю. Вы можете ограничить это, передав в некоторых байтах свой собственный вместо null при вызове Protect и Unprotect: я думаю, что они действуют как дополнительный, специфичный для приложения ключ. –

Смежные вопросы