如何使用salt进行哈希,然后在asp.net C中unhash#

时间:2014-06-12 10:11:06

标签: c# asp.net hash salt

我有这个asp.net项目,我需要哈希密码(最好用盐)并将其保存在sql数据库中然后取消它以便与登录密码进行比较或者......就像那样.... 问题是我不确定以最安全的方式做到这一点的最佳方法是什么?如何用C#编写代码?

2 个答案:

答案 0 :(得分:4)

你不要吵架。这就是散列的重点:它无法逆转。

你查找盐,然后将他们输入的密码与盐一起哈希。如果散列与数据库中的散列相同,则它是有效的登录。

也许看看这里: Salted password hashing

答案 1 :(得分:3)

首先you cannot recover the hashed data。它的one way process。但是您可以匹配散列数据。为此,请检查以下代码:

在按钮点击事件

中执行此操作
string salt = GetSalt(10); // 10 is the size of Salt 
string hashedPass = HashPassword(salt, Password.Text);

这些功能可以帮助您散列密码

const string alphanumeric = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

     public static string GetSalt(int saltSize)
            {
                Random r = new Random();
                StringBuilder strB = new StringBuilder("");

                while ((saltSize--) > 0)
                    strB.Append(alphanumeric[(int)(r.NextDouble() * alphanumeric.Length)]);
                return strB.ToString();
            }

    public static string HashPassword(string salt, string password)
            {
                string mergedPass = string.Concat(salt, password);
                return EncryptUsingMD5(mergedPass);
            }

    public static string EncryptUsingMD5(string inputStr)
            {
                using (MD5 md5Hash = MD5.Create())
                {
                    // Convert the input string to a byte array and compute the hash.
                    byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(inputStr));

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

同样,当您尝试匹配密码以验证用户身份时,执行相同的方法只需从数据库中获取散列密码并进行比较。如果输入的散列密码与数据库哈希密码匹配,则为其授权用户。

已更新:

  
      
  1. 首次散列用户密码,然后在同一个表中存储到数据库中时,存储该用户的salt。

  2.   
  3. 下次尝试比较密码时,从数据库中获取用户的盐并使用哈希值进行比较   数据库中的哈希密码。

  4.   

希望能回答你的问题。