Как аутентифицировать логин с помощью предварительно хешированного пароля mysql в C#? - PullRequest
1 голос
/ 15 января 2020

Итак, в моей базе данных mysql есть целая таблица для пользователей, которая содержит хешированные (с функцией PASSWORD() mysql) пароли. В C# я создал программу, которая может вставлять новые записи в базу данных и отображать существующие.

Теперь я нахожусь на этапе, когда я хочу выполнить вход в систему, который проверяет, введены ли данные ( имя пользователя и пароль) равны тем, которые есть в таблице пользователей. (Таблица users содержит столбцы id, username, password.)

То, что я пробовал до сих пор:

В моем классе для операций с базами данных: (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;
            }
        }

В своем страдании я попытался хэшировать введенное пароль с функцией mysql в C# (я знаю, я знаю ...)

* c когда я запускаю это, я получаю следующее исключение: MySql.Data.MySqlClient.MySqlException: 'PROCEDURE test.PASSWORD does not exist', что ожидается и Я понимаю, почему это не работает.

Но тогда, как это сделать правильно? Как же я могу заставить это работать?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Есть упоминания (хотя ничего официального), что mysql Функция пароля выполняет следующие действия:

"*" + SHA1(SHA1(pass)) 

На это нельзя полагаться.

Вы можете попробовать следующее, хотя (это не рекомендуется, но это может решить вашу проблему).

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

Затем создайте параметр для запроса.

Хотя лучший способ сделать это - ha sh сделайте это самостоятельно с помощью современного алгоритма хеширования, прежде чем вставлять его в базу данных, и переделайте sh перед проверкой. Игнорировать функцию пароля в целом.

0 голосов
/ 15 января 2020

По вашему коду вы проверяете каждого пользователя в базе данных и сравниваете его. Это неэффективно.

"SQL способ" сделать это - запрос именно того, что вам нужно.

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

(Обратите внимание, что это решение не является безопасным. SQL Инъекции, а не элегенты, Узнайте больше о добавлении параметров )

Что касается вашей ошибки, вы попытались сделать sh с помощью функции ПАРОЛЬ, которая устарела для версии> 5.7. 0,5. Вот еще несколько способов sh ваших паролей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...