我创建了一个使用远程MySQL数据库设置的程序。数据库存储该程序的登录信息,并使用SHA256对密码进行哈希处理。如果用户在登录表单中输入正确的信息,则他们将进入GUI。
我的问题是验证事物用户端的哈希值。我怎么会这样?我读过的大多数教程都过分解释,让我感到困惑。
这是我的登录按钮的代码。
try
{
string strConnect = "Server=***;Port=***;Database=***;Uid=***;Pwd=***;";
MySqlConnection myConn = new MySqlConnection(strConnect);
MySqlCommand selectCmd = new MySqlCommand("select * from ***.*** where username='" + txtUsername.Text + "' and password='" + txtPassword.Text + "' ;", myConn);
MySqlDataReader myReader;
myConn.Open();
int count = 0;
myReader = selectCmd.ExecuteReader();
while (myReader.Read())
{
count = count + 1;
}
if (count == 1)
{
this.Close(); form2.Show();
}
else if (count > 1)
{
MessageBox.Show("Theres 2 Users with that username Please contact administrator ...Access Denied");
}
else
MessageBox.Show("Username or Password is Not correct .. Please try Again!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
您只需要使用与存储密码时相同的方式对用户键入的内容进行哈希处理。然后,如果数据库中的哈希密码与用户刚刚输入的哈希密码匹配,则他们输入了正确的密码。
通常情况下会涉及一些随机因素,因此,如果多个人使用密码“ password”,则散列密码在数据库中看起来将不会相同。这与您当前的问题无关,但是在您认为“存储密码”解决方案完整之前,绝对应该先进行研究。
这是您可能使用的一些代码的示例:
byte[] passwordBytes = Encoding.Unicode.GetBytes(userTypedPassword);
//
// This is where you'd normally append or prepend the salt bytes
//
var hasher = System.Security.CryptographySHA256.Create();
byte[] hashedBytes = hasher.ComputeHash(passwordBytes);
现在,它取决于哈希在数据库中的存储方式,如果它只是二进制数据,则可以比较字节数组。如果将其存储为base64字符串,则可以转换字节:
var hashedString = Convert.ToBase64String(hashedBytes);
...然后在存储的字符串和hashedString
之间进行字符串比较。
@ itsme86,我如何取消对密码进行哈希处理的方式?