我创建了一个使用远程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);
}
答案 0 :(得分:0)
您只需要对用户输入的内容进行哈希处理,就像存储密码时使用密码的方式完全相同。然后,如果来自数据库的散列密码与用户刚输入的散列密码匹配,则会输入正确的密码。
通常会有随机盐,所以如果多人使用密码"密码"哈希密码在数据库中看起来不一样。这与你当前的问题无关,但在考虑你的#34;存储密码之前,肯定应该考虑一下这个问题。解决方案完成。
以下是您可能使用的一些代码的示例:
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
之间进行字符串比较。