C# 如何在注册表中保存密码

C# 如何在注册表中保存密码,c#,winforms,security,password-protection,C#,Winforms,Security,Password Protection,我有一个带有远程接口的桌面应用程序。对远程接口的访问由用户名和密码保护 安全地保存这些密码(最好是在注册表中保存)的最佳方法是什么?您需要保存哈希密码(无论是在注册表中还是其他地方)。然后,当用户输入密码时,您将检查他们输入的密码的散列版本和存储的散列版本。如果这些密码匹配,则密码匹配,您可以让用户进入 这样,您就不会以纯文本形式存储密码,以供任何人(包括您自己)以其他人的身份访问 至于使用哪种哈希算法——我不知道。有很多选择,所以我不愿意推荐一个盲人。我建议你找几个来评估一下。有一篇文章似乎是

我有一个带有远程接口的桌面应用程序。对远程接口的访问由用户名和密码保护


安全地保存这些密码(最好是在注册表中保存)的最佳方法是什么?

您需要保存哈希密码(无论是在注册表中还是其他地方)。然后,当用户输入密码时,您将检查他们输入的密码的散列版本和存储的散列版本。如果这些密码匹配,则密码匹配,您可以让用户进入

这样,您就不会以纯文本形式存储密码,以供任何人(包括您自己)以其他人的身份访问


至于使用哪种哈希算法——我不知道。有很多选择,所以我不愿意推荐一个盲人。我建议你找几个来评估一下。有一篇文章似乎是一个很好的起点。

如果您确实需要存储未更改的密码,请查看使用。这就利用了,这是在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);
    }

}
公共静态类DataProtectionAPI包装器
{
/// 
///指定DPAPI的数据保护范围。
/// 
私有常量DataProtectionScope范围=DataProtectionScope.CurrentUser;
公共静态字符串加密(此字符串文本)
{
if(text==null)
{
抛出新的ArgumentNullException(“文本”);
}
//加密数据
var data=Encoding.Unicode.GetBytes(文本);
字节[]加密=ProtectedData.Protect(数据,空,范围);
//作为base64字符串返回
返回Convert.tobase64字符串(加密);
}
公共静态字符串解密(此字符串密码)
{
如果(密码==null)
{
抛出新的ArgumentNullException(“密码”);
}
//解析base64字符串
字节[]数据=Convert.FromBase64String(密码);
//解密数据
byte[]decrypted=ProtectedData.Unprotect(数据,null,作用域);
返回Encoding.Unicode.GetString(已解密);
}
}

我应该使用哪种哈希算法?不过,这个案例不是关于为用户存储密码,是吗?我以为它是某个外部服务的用户名和密码。@Svish,user/pass存储在应用程序本身(用于远程访问的内部web界面)如果我理解正确,在用户空间中运行的任何应用程序都可以解密此数据。我说得对吗?我相信是的。在调用Protect和Unprotect时,您可以通过传入自己的一些字节而不是null来限制这一点:我认为这些字节可以作为附加的、特定于应用程序的密钥。