Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中使用预先散列的mysql密码对登录进行身份验证?_C#_Mysql_Authentication_Passwords - Fatal编程技术网

C# 如何在C中使用预先散列的mysql密码对登录进行身份验证?

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

所以,在我的mysql数据库中,我有一个完整的用户表,其中包含用密码散列的mysql函数密码。在C语言中,我编写了一个程序,可以将新记录插入数据库并显示现有记录

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

到目前为止,我尝试的是:

在我的用于数据库操作的类中: c.conn、c.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;
            }
        }
在我的痛苦中,我尝试用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哈希函数,并检查它是否返回任何行。现在很好用了,谢谢你,伙计!