Как сохранить пароль в реестре - PullRequest
2 голосов
/ 17 ноября 2009

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

Каков наилучший способ безопасного сохранения этого пароля, желательно в реестре?

Ответы [ 2 ]

7 голосов
/ 17 ноября 2009

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

Вот небольшой класс, который упаковывает ProtectedData и предоставляет два метода расширения для String to Encrypt и Decrypt data:

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

}
4 голосов
/ 17 ноября 2009

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

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

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

...