在C#中从MySQL数据库验证SHA256哈希

时间:2014-12-08 23:07:56

标签: c# mysql hash sha256

我创建了一个使用远程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);
        }

1 个答案:

答案 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之间进行字符串比较。