Elaine94 Ответов: 1

Как расшифровать зашифрованный пароль в базе данных для входа в систему?


Привет, я хочу войти в систему, используя имя пользователя и пароль. я хочу расшифровать пароль в базе данных, чтобы он соответствовал ключу пароля. если ключ пароля совпадает с базой данных паролей, он войдет в систему. но моя функция дешифрования не возвращала точный пароль, как ключ в пароле. например, мой пароль базы данных - " gZ+c6cHMVSz+HwCjIZOLpw==", который равен 1234, а мой ключ в пароле - "1234". я запускаю приложение, а затем пытаюсь ввести имя пользователя и пароль "1234", но функция расшифровки возвращает мне "찚 �\ufae2懸 ⋕ ṻ竛腄". можете ли вы помочь мне или исправить меня, что я ошибаюсь?

Что я уже пробовал:

вот что я сделал:

protected void Unnamed_Click(object sender, EventArgs e)
        {            
            using (MySqlConnection con = new MySqlConnection(connStr))
            {                
                using (MySqlCommand cmd = new MySqlCommand("SELECT user_id, username, password FROM users WHERE username = @username"))
                {
                    cmd.Parameters.AddWithValue("@username", txtUsername.Text.Trim());
                    cmd.Connection = con;

                    string pwd1 = txtPassword.Text;

                    MySqlDataReader dr;
                    con.Open();
                    dr = cmd.ExecuteReader();

                    if (dr.Read())
                    {
                        string id = dr["user_id"].ToString();
                        string dbUsername = dr["username"].ToString();
                        string dbPwd = dr["password"].ToString();

                        string pwd = Decrypt(dbPwd);
                        
                        if (pwd == pwd1)
                        {
                            Response.Redirect("~/dashboard.aspx");
                        }
                        else
                        {
                            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Invalid Username and Password.');", true);
                            Response.Redirect("login.aspx");
                        }
                    }
                    else
                    {
                        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Invalid Username and Password.');", true);
                        Response.Redirect("login.aspx");
                    }
                    con.Close();
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            Response.Redirect(Request.Url.AbsoluteUri);
        }


private string Decrypt(string cipherText)
        {
            string EncryptionKey = "MAKV2SPBNI99212";
            byte[] cipherBytes = Convert.FromBase64String(cipherText);
            using (Aes encryptor = Aes.Create())
            {
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                encryptor.Mode = CipherMode.CBC;
                encryptor.Padding = PaddingMode.Zeros;
                encryptor.FeedbackSize = 128;
                encryptor.Key = pdb.GetBytes(32);
                encryptor.IV = pdb.GetBytes(16);

                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(cipherBytes, 0, cipherBytes.Length);
                        cs.Close();
                    }
                    cipherText = Encoding.Unicode.GetString(ms.ToArray());
                }
            }
            return cipherText;
        }


Обновленный вопрос:

именно так я сравниваю хэши, но там написано "недопустимая соль".

using (MySqlConnection con = new MySqlConnection(connStr))
            {                
                using (MySqlCommand cmd = new MySqlCommand("SELECT user_id, username, password FROM users WHERE username = @username"))
                {
                    cmd.Parameters.AddWithValue("@username", txtUsername.Text.Trim());
                    cmd.Connection = con;

                    string pwd1 = txtPassword.Text;

                    MySqlDataReader dr;
                    con.Open();
                    dr = cmd.ExecuteReader();

                    if (dr.Read())
                    {
                        string id = dr["user_id"].ToString();
                        string dbUsername = dr["username"].ToString();
                        string dbPwd = dr["password"].ToString();

                        //string pwd = Decrypt(dbPwd);
                        
                        bool result = verifyPassword(dbPwd, pwd1);

                        if (result) //if the verifyPassword is true
                        {                            
                            Response.Redirect("~/dashboard.aspx");
                        }
                        else
                        {
                            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Invalid Username and Password.');", true);
                            Response.Redirect("login.aspx");
                        }
                    }
                    else
                    {
                        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Invalid Username and Password.');", true);
                        Response.Redirect("login.aspx");
                    }
                    con.Close();
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();


private bool verifyPassword(string dbPwd, string pwd1)
        {
            bool result = false;
            byte[] data = Encoding.Unicode.GetBytes(pwd1);

            string salt = dbPwd.Substring(0, 24);
            string hash_pwd = Crypter.Blowfish.Crypt(data, salt);

            if (dbPwd == hash_pwd)
            {
                result = true;
            }
            return result;
        }

F-ES Sitecore

Вам следует поискать в google статьи о хэшировании паролей, чтобы сначала понять эту концепцию, так как до тех пор, пока вы не поймете ее, вы не сможете заставить ее работать.

У каждого пользователя должен быть хэшированный пароль и сохраненная соль, и все, что вам нужно сделать, это использовать код хэширования (Crypter.Иглобрюх.Crypt), используя пароль, введенный пользователем, и соль, которую Вы читаете из базы данных для этого пользователя, и сравните результат с сохраненным паролем для этого пользователя.

Elaine94

так ли это?
private bool verifyPassword(строка dbPwd, строка pwd1)
{
bool result = false;

string salt = dbPwd.Substring(0, 24);
строка hash_pwd = криптер.Иглобрюх.Crypt(pwd1, salt); //ошибка здесь

if (dbPwd == hash_pwd)
{
результат = true;
}
возвращаемый результат;
}

я нашел это в google, но когда я пытаюсь, pwd1 имеет ошибку "не удается преобразовать из байта[] в строку".

F-ES Sitecore

"соль" будет строкой, которую вы откуда-то получили, как я уже сказал, Обычно она хранится вместе с записью пользователя, так что помимо получения имени пользователя и пароля для этого пользователя вы также получите соль. Ваш код обрабатывает сохраненный пароль как соль.

Проблема в том, что мы не знаем, как вы храните пароль в первую очередь, поэтому мы не можем дать точную помощь. То, как вы проверяете пароль, зависит от того, как вы храните пароль, и вы не объяснили, как это работает, если мы не знаем, как вы храните пароль, мы не можем сказать вам, как его проверить.

1 Ответов

Рейтинг:
0

Graeme_Grant

Ответ заключается в том, что вы не можете, это вычисленный хэш и не является обратимым. Читайте ответы на тот же вопрос, заданный здесь: Расшифровка зашифрованного пароля[^]


Elaine94

значит, мне нужно сравнить хэши?

Graeme_Grant

Это было бы "да".

Elaine94

не могли бы вы взглянуть на мой обновленный вопрос, пожалуйста.

Graeme_Grant

Вам нужно использовать тот же код/функцию в вашем методе сравнения, который был использован для создания зашифрованного пароля в первую очередь.

Elaine94

мне очень жаль. Я не понимаю. можете ли вы объяснить мне больше?

Graeme_Grant

Как вы создали зашифрованный пароль?

Elaine94

я создаю зашифрованный пароль вот так:

[код удален]

но зашифрованный пароль - это не то же самое, что в базе данных.

Graeme_Grant

Это был мой вопрос: как был создан пароль в базе данных? Вы должны использовать одни и те же ключи кодирования... Например: мой ключ от машины не откроет дверь вашего автомобиля.

Elaine94

ладно. я попробую первым