C# 如何在C中使用预先散列的mysql密码对登录进行身份验证?
所以,在我的mysql数据库中,我有一个完整的用户表,其中包含用密码散列的mysql函数密码。在C语言中,我编写了一个程序,可以将新记录插入数据库并显示现有记录 现在我正处于登录的阶段,它检查输入的数据用户名和密码是否与users表中的相同。users表包含id、用户名、密码列 到目前为止,我尝试的是: 在我的用于数据库操作的类中: c.conn、c.open、c.close只是我在一个名为Connect的类中定义的函数C# 如何在C中使用预先散列的mysql密码对登录进行身份验证?,c#,mysql,authentication,passwords,C#,Mysql,Authentication,Passwords,所以,在我的mysql数据库中,我有一个完整的用户表,其中包含用密码散列的mysql函数密码。在C语言中,我编写了一个程序,可以将新记录插入数据库并显示现有记录 现在我正处于登录的阶段,它检查输入的数据用户名和密码是否与users表中的相同。users表包含id、用户名、密码列 到目前为止,我尝试的是: 在我的用于数据库操作的类中: c.conn、c.open、c.close只是我在一个名为Connect的类中定义的函数 public bool logIn(string usrName, str
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;
}
}
在我的痛苦中,我尝试用CI know中的mysql函数对输入的密码进行哈希运算,我知道
Ofc如果我运行这个,我会得到以下异常:MySql.Data.MySqlClient.MySqlException:“过程测试.密码不存在”,这是预期的,我理解为什么它不工作
但是,我们应该如何正确地做到这一点呢?我到底是如何让它工作的?通过您的代码,您可以检查数据库中的每个用户并进行比较。 那是没有效率的 SQL实现这一点的方法就是准确地查询您需要的内容 字符串查询=从管理员中选择用户,其中用户名=+用户名+和密码=+密码; 请注意,此解决方案对于SQL注入和elegent都不安全 关于您的错误,您已尝试使用PASSWORD函数进行散列,该函数在版本>5.7.5时已被弃用。
通过您的代码,您可以检查数据库中的每个用户并进行比较。 那是没有效率的 SQL实现这一点的方法就是准确地查询您需要的内容 字符串查询=从管理员中选择用户,其中用户名=+用户名+和密码=+密码; 请注意,此解决方案对于SQL注入和elegent都不安全 关于您的错误,您已尝试使用PASSWORD函数进行散列,该函数在版本>5.7.5时已被弃用。
有人提到mysql密码函数的作用如下,尽管没有官方消息
"*" + SHA1(SHA1(pass))
这是不可信赖的
虽然不建议您尝试以下方法,但它可能会解决您的问题
// remove the previous commands
query = "SELECT * FROM admins Where password = PASSWORD(@password);
然后为查询创建参数
不过,最好的方法是在将其插入数据库之前,自己使用现代哈希算法对其进行哈希,并在检查之前对其进行重新哈希。完全忽略密码函数 虽然没有官方消息,但有人提到mysql密码函数有以下功能
"*" + SHA1(SHA1(pass))
这是不可信赖的
虽然不建议您尝试以下方法,但它可能会解决您的问题
// remove the previous commands
query = "SELECT * FROM admins Where password = PASSWORD(@password);
然后为查询创建参数
不过,最好的方法是在将其插入数据库之前,自己使用现代哈希算法对其进行哈希,并在检查之前对其进行重新哈希。完全忽略密码函数 您是否不需要进行选择PASSWORD@password;? 此外,还需要存储查询中的值,否则hashedEnteredPswd实际上等于PASSWORD@password;您是否不需要进行选择PASSWORD@password;? 此外,还需要存储查询中的值,否则hashedEnteredPswd实际上等于PASSWORD@password;这是一种比我的简单得多的方法。我只需要向查询中添加一个mysql哈希函数,并检查它是否返回任何行。现在很好用了,谢谢你,伙计!这是一种比我的简单得多的方法。我只需要向查询中添加一个mysql哈希函数,并检查它是否返回任何行。现在很好用了,谢谢你,伙计!