验证散列密码
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;
有助于比较密码。
大家好,
我有一个问题。我已经能够使用 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;
有助于比较密码。