如何验证用户

时间:2014-08-23 07:13:26

标签: hash md5 salt

我在输入密码使用Salt MD5方法。以下是我的代码

  protected string GenerateSalt()
{
    byte[] data = new byte[0x10];
    new RNGCryptoServiceProvider().GetBytes(data);
    return Convert.ToBase64String(data);
}
 private string HashPassword(string password, string salt)
 {
     // Create an MD5 hash of the supplied password using the supplied salt as well.
     string sourceText = salt + password;
     ASCIIEncoding asciiEnc = new ASCIIEncoding();
     string hash = null;
     byte[] byteSourceText = asciiEnc.GetBytes(sourceText);
     MD5CryptoServiceProvider md5Hash = new MD5CryptoServiceProvider();
     byte[] byteHash = md5Hash.ComputeHash(byteSourceText);
     foreach (byte b in byteHash)
     {
         hash += b.ToString("x2");
     }

     // Return the hashed password
     return hash;
 }

这里我用来创建密码。

 string salt = GenerateSalt();

  string password = HashPassword(txtpassword.Text, salt);

它工作正常并将密码保存在数据库中。

但是当我尝试登录时,密码并不匹配。

下面是我匹配密码和用户ID的代码

 string password = FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Text, "md5").ToString();
            SqlCommand com11 = new SqlCommand("For_Login1", con);
            com11.CommandType = CommandType.StoredProcedure;
            com11.Parameters.AddWithValue("@User_Id", ddl.SelectedItem.Text);
            com11.Parameters.AddWithValue("@Password", password);

但是密码与原因不符?

1 个答案:

答案 0 :(得分:1)

salt是一个最终的静态字符串(不会更改),通常保存在附加到散列密码的数据库中。一种惯例是将其保存为hash(pwd+salt):salt

每次拨打generate()时,您都会生成新的盐,原因如下:

new RNGCryptoServiceProvider().GetBytes(data);

这意味着您永远无法进行身份验证。