验证散列密码

Verifying Hashed password

大家好,

我有一个问题。我已经能够使用 user_ID、用户名和密码字段创建用户帐户。

密码经过散列和加盐处理,工作正常。 现在我想创建一个登录表单,用户需要使用用户名和密码进行身份验证。

我想验证提供的密码和用户名是否正确。此密码必须先进行哈希处理,然后再与数据库中的内容进行比较。

下面是我的代码,但它总是报错密码。

try
        {

            string connString = CommonVariables.ConnectionString;
            // Hashing the password field first for it to be 



            string sql = "SELECT * FROM tbl_Users WHERE (Username = @Username) ";
            using (SqlConnection cnn = new SqlConnection(connString))
            {
                cnn.Open();
                using (SqlCommand cmd = new SqlCommand(sql, cnn))
                {
                    //cmd.Parameters.AddWithValue("@Password", SqlDbType.NVarChar).Value = txt_Password.Text.Trim();
                    cmd.Parameters.AddWithValue("@Username", SqlDbType.NVarChar).Value = txt_Username.Text.Trim();





                    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    if (reader.HasRows)
                    {

                        while (reader.Read())
                        {
                            //  string vsibility = reader["Visibility"].ToString(); //Getting the  value of the visibility to determine if the user can logon or not
                            // string user_role = reader["User_Role"].ToString(); // Getting the User_role of the person login on
                            string mypassword = reader["password"].ToString();
                            var hash = PasswordHashing.SecurePasswordHasher.Hash(mypassword);
                            var hashverify = PasswordHashing.SecurePasswordHasher.Verify(txt_Password.Text.Trim(), hash);

                            if (hashverify == true)
                            {
                                this.Hide();
                                new Mainmenu().Show(); ;

                            }
                            else
                            {
                                MessageBox.Show("incorrect password" + mypassword);
                            }
                        }





                    }
                    else
                    {
                        MessageBox.Show("Invalid Username, Please Confirm", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txt_Username.Focus();
                        return;

                    }

                }
            }
        }
        catch (Exception c)
        {
            MessageBox.Show(c.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }

假设您将密码的哈希值存储在数据库中,您似乎在对其进行双重哈希处理。特别是行

var hash = PasswordHashing.SecurePasswordHasher.Hash(mypassword);

似乎在计算一个已经散列过的密码的散列值。将其更改为 var hash = mypassword; 有助于比较密码。