C# 如何在C代码中管理私有数据?

C# 如何在C代码中管理私有数据?,c#,wpf,security,cryptography,C#,Wpf,Security,Cryptography,我正在制作一个WPF C#应用程序,根据我在许多论坛的其他线程上读到的内容,C#应用程序的代码可以从.exe文件重建 现在,在我的代码中有一个包含数据库登录数据的字符串,我还考虑使用simmetric加密技术将加密密码发送到db,因此客户端的代码将包含simmetric密钥,但这个问题将使我为创建安全应用程序所做的所有努力付诸东流 如何解决这个安全问题,尤其是在我的情况下?解决方案是将密码散列在数据库中,而不是加密。哈希是字符串的单向转换,不能反转 然后散列用户提供的输入值,并将其与数据库中的值

我正在制作一个WPF C#应用程序,根据我在许多论坛的其他线程上读到的内容,C#应用程序的代码可以从.exe文件重建

现在,在我的代码中有一个包含数据库登录数据的字符串,我还考虑使用simmetric加密技术将加密密码发送到db,因此客户端的代码将包含simmetric密钥,但这个问题将使我为创建安全应用程序所做的所有努力付诸东流


如何解决这个安全问题,尤其是在我的情况下?

解决方案是将密码散列在数据库中,而不是加密。哈希是字符串的单向转换,不能反转

然后散列用户提供的输入值,并将其与数据库中的值进行比较。如果哈希匹配,则可以登录,否则将显示错误

 static string GetMd5Hash(MD5 md5Hash, string input)
    {

        // Convert the input string to a byte array and compute the hash. 
        byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

        // Create a new Stringbuilder to collect the bytes 
        // and create a string.
        StringBuilder sBuilder = new StringBuilder();

        // Loop through each byte of the hashed data  
        // and format each one as a hexadecimal string. 
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        // Return the hexadecimal string. 
        return sBuilder.ToString();
    }

    // Verify a hash against a string. 
    static bool VerifyMd5Hash(MD5 md5Hash, string input, string hash)
    {
        // Hash the input. 
        string hashOfInput = GetMd5Hash(md5Hash, input);

        // Create a StringComparer an compare the hashes.
        StringComparer comparer = StringComparer.OrdinalIgnoreCase;

        if (0 == comparer.Compare(hashOfInput, hash))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
静态字符串GetMd5Hash(MD5 md5Hash,字符串输入)
{
//将输入字符串转换为字节数组并计算哈希。
byte[]data=md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
//创建新的Stringbuilder以收集字节
//并创建一个字符串。
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i

从这里

可以重复:你知道答案,不是吗?它是:不要在代码中存储密码。于是问题变成了:我从哪里获得密码?你也知道这个问题的答案,不是吗?它是:询问用户。不要使用未加盐的MD5哈希-非常不安全。这只是一个演示,而不是端到端的解决方案。它旨在指出正确的做事方式。是的,散列应该被散列。