C# 在C中验证MySQL数据库中的SHA256哈希
我创建了一个使用远程MySQL数据库设置的程序。数据库存储该程序的登录信息,密码使用SHA256散列。如果用户在登录表单中输入了正确的信息,那么他们将进入GUI 我的问题是验证东西的用户端的散列。我怎么知道这件事?我读过的大多数教程解释得太多,让我感到困惑 这是我的登录按钮的代码C# 在C中验证MySQL数据库中的SHA256哈希,c#,mysql,hash,sha256,C#,Mysql,Hash,Sha256,我创建了一个使用远程MySQL数据库设置的程序。数据库存储该程序的登录信息,密码使用SHA256散列。如果用户在登录表单中输入了正确的信息,那么他们将进入GUI 我的问题是验证东西的用户端的散列。我怎么知道这件事?我读过的大多数教程解释得太多,让我感到困惑 这是我的登录按钮的代码 try { string strConnect = "Server=***;Port=***;Database=***;Uid=***;Pwd=***;";
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);
}
您只需按照存储密码时对密码进行散列的方式对用户键入的内容进行散列。然后,如果数据库中的散列密码与用户刚刚输入的散列密码匹配,则输入正确的密码 通常会涉及随机salt,因此如果多人使用密码,哈希密码在数据库中的外观将不一样。这与你目前的问题无关,但是在你认为你的存储密码解决方案完成之前,肯定是你要考虑的问题。 下面是您可能使用的一些代码的示例:
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之间进行字符串比较。我有些理解,我将其命名为var hashedPW=System.Security.Cryptography.SHA256.CreatetxtPassword.Text;然后修改命令字符串,例如从*******中修改MySqlCommand selectCmd=new MySqlCommandselect*,其中username='+txtexsername.Text+'和password='+hashedPW+';,麦肯@TobyCook散列如何存储在数据库中?作为二进制数据还是base64字符串?@TobyBook同样,请再次查看我的代码。您不想将密码传递给Create方法。这完全是另一回事。密码存储为varchar64。如何将输入文本框的文本与服务器上的密码值进行比较?@TobyBook好吧,您只需要记录中的密码字段和匹配的用户名。类似于var stored=myReader[password].ToString;的内容;。然后,如果hashedString==存储