如何在 C# 中使用预散列的 mysql 密码验证登录?



所以,在我的mysql数据库中,我有一个完整的用户表,其中包含散列(使用PASSWORD()mysql函数(密码。在 C# 中,我创建了一个程序,可以将新记录插入数据库并显示现有记录。

现在我正处于想要登录的阶段,它会检查输入的数据(用户名和密码(是否与用户表中的数据相等。(用户表包含 ID、用户名、密码列。

到目前为止我尝试过:

在我的类中,用于数据库操作: (c.connc.open()c.close()只是我在一个名为 Connect 的类中定义的函数。

public bool logIn(string usrName, string pswd)
{
bool success = false;
string dbusrname; string dbpswd;
c.open();
string hashedEnteredPswd = "PASSWORD(@password);";
cmd = new MySqlCommand(hashedEnteredPswd, c.conn);
cmd.Parameters.AddWithValue("@password", pswd);
cmd.ExecuteNonQuery();
c.close();
query = "SELECT * FROM admins;";
c.open();
cmd = new MySqlCommand(query, c.conn);
var reader=cmd.ExecuteReader();
while (reader.Read())
{
dbusrname = reader["users"].ToString();
dbpswd = reader["password"].ToString();
if (dbusrname == usrName && dbpswd == hashedEnteredPswd)
{
success = true;
}
else
{
success = false;
}
}
c.close();
return success;
}

在我的表单代码中:

private void Container_Load(object sender, EventArgs e)
{
c.open();
clearPanels();
panelLogIn.Visible = true;
}
private void buttonLogIn_Click(object sender, EventArgs e)
{
if (dbops.logIn(textBoxUID.Text, textBoxPSWD.Text))
{
clearPanels();
panelMain.Visible = true;
}
}

在我的痛苦中,我尝试使用 C# 中的 mysql 函数对输入的密码进行哈希处理(我知道,我知道......

Ofc 何时 如果我运行这个,我会得到以下异常:MySql.Data.MySqlClient.MySqlException: 'PROCEDURE test.PASSWORD does not exist'这是预期的,我明白为什么它不起作用。

但是,应该如何正确执行此操作?我到底该如何让它工作?

有人提到(虽然不是官方的(,mysql 密码函数执行以下操作

"*" + SHA1(SHA1(pass)) 

这是不值得依赖的。

不过,您可以尝试以下操作(不建议这样做,但它可能会解决您的问题(。

// remove the previous commands 
query = "SELECT * FROM admins Where password = PASSWORD(@password);

然后为查询创建参数。

不过,最好的方法是在将其插入数据库之前使用现代哈希算法自己对其进行哈希处理,并在检查之前对其进行重新哈希处理。完全忽略密码功能。

通过代码,您可以检查数据库中的每个用户并进行比较。 这效率不高。

执行此操作的"SQL方法"是准确查询所需的内容。

string query = "SELECT user FROM admins WHERE username = " + username + " AND password = " + password;

(请注意,此解决方案对SQL注入不安全,也不优雅,了解有关添加参数的更多信息(

关于您的错误,您尝试使用已在版本> 5.7.5 中弃用的 PASSWORD 函数进行哈希处理。 以下是一些其他散列密码的方法。

最新更新