初学者哈希&盐

时间:2016-03-16 23:18:22

标签: c# hash md5

所以我对编程(C#)很新,尤其是密码学。我尝试通过使用MD5哈希算法复制几个函数并学习它是如何工作来学习一些。然后我连接到数据库并进行登录并重置密码功能。但是,当我尝试使用相同的密码时出现问题,我意识到无论是否在哈希值中添加随机生成的盐,哈希值都会变得相同。

    string MD5(string input)
    {
        MD5 md5 = new MD5CryptoServiceProvider();                                  
        byte[] bytes = md5.ComputeHash(Encoding.Unicode.GetBytes(input));          
        string result = BitConverter.ToString(bytes).Replace("-", String.Empty); 
        return result.ToLower();
    }
    public static byte[] GenerateSalt()
    {
        RNGCryptoServiceProvider saltGenerator = new RNGCryptoServiceProvider();
        byte[] salt = new byte[24];
        saltGenerator.GetBytes(salt);
        return salt;
    }

所以这是我生成salt和散列输入字符串的函数。这是通过在WinForms中填写两个文本框来重置密码的代码。

        private void HashNewPassword(out byte[] salt, out string hashedPassword)
    {
        string tempHash;
        salt = null;
        hashedPassword = null;

        if (txtPassword1.Text == txtPassword2.Text)
        {
            tempHash = txtPassword1.Text;
            salt = GenerateSalt();
            hashedPassword = MD5(MD5(tempHash + salt));
        }
        else
        {
            throw new Exception();
        }
    }

最后,点击偶数功能:

        private void btnFinished_Click(object sender, EventArgs e)
    {
        try
        {
            string hashedPassword;
            byte[] salt;

            HashNewPassword(out salt, out hashedPassword);
            AddPasswordToDB(salt, hashedPassword);
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message + "   :   " + error.GetType().ToString());
        }
    }

如下所示,哈希值相同,但盐不同。我是否应该以不应该的方式添加盐?

bec78d2acfd2eb4f5d7da2fd231bad1c     0x21B5F48096E31092FCCD20EE22EF9B3C307ADDC1C31B8D84          
bec78d2acfd2eb4f5d7da2fd231bad1c     0xC063774EBBD4FAED268811C84D70662F4DDB53BCA52A6720  

对此有合理的解释,或者代码有问题吗? 此外,我不熟悉哈希算法,只是我偶然发现并希望了解更多信息。有更简单的方法吗?我已经阅读过其他似乎很容易使用的算法,但正如我所说,我对此并不熟悉。散列算法之间的安全性差异无关紧要。我确实读过MD5已经过时了,而不是那个安全,但它对我的使用来说已经足够了。

提前致谢。

1 个答案:

答案 0 :(得分:4)

不进入安全方面,我相信你会得到相同的哈希值,因为你没有将盐连接成一个字符串:salt

+是一个字节数组,通过string使用ToString(),在连接之前调用它的System.Text.Encoding.Default.GetString(salt)方法。这将导致带有实际值的字符串。

尝试将数组转换为实际字符串:

byte[] salt = new byte[] {67,79,79,76}; Console.WriteLine(salt.ToString()); // prints System.Byte[] string saltAsString = System.Text.Encoding.Default.GetString(salt); Console.WriteLine(saltAsString); // prints COOL

一个小例子来进一步澄清行为:

SELECT count(id), lead_id 
FROM calls_leads
group by lead_id
having count(id) = (
Select touches_phone_c, id_c
from leads_cstm
where lead_id = id_c)