Как расшифровать зашифрованный пароль в базе данных для входа в систему?
Привет, я хочу войти в систему, используя имя пользователя и пароль. я хочу расшифровать пароль в базе данных, чтобы он соответствовал ключу пароля. если ключ пароля совпадает с базой данных паролей, он войдет в систему. но моя функция дешифрования не возвращала точный пароль, как ключ в пароле. например, мой пароль базы данных - " 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
"соль" будет строкой, которую вы откуда-то получили, как я уже сказал, Обычно она хранится вместе с записью пользователя, так что помимо получения имени пользователя и пароля для этого пользователя вы также получите соль. Ваш код обрабатывает сохраненный пароль как соль.
Проблема в том, что мы не знаем, как вы храните пароль в первую очередь, поэтому мы не можем дать точную помощь. То, как вы проверяете пароль, зависит от того, как вы храните пароль, и вы не объяснили, как это работает, если мы не знаем, как вы храните пароль, мы не можем сказать вам, как его проверить.