Расшифровать пароль с помощью функции забытого пароля

У меня есть функция хэш-пароля на моем веб-сайте, где при регистрации пользователя пароль хешируется в базе данных. Мне также удалось войти через этот хешированный пароль. Однако я добавил функцию забытого пароля. он работает нормально (отправляет пароль на электронную почту пользователя), но пароль все еще хэшируется? какие-нибудь хитрости, которыми вы можете поделиться?

Вот мой забытый код пароля:

protected void SendEmail(object sender, EventArgs e)
    {
        string username = string.Empty;
        string password = string.Empty;
        string constr = ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT Username, [Password] FROM UserData WHERE Email = @Email"))
            {
                cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    if (sdr.Read())
                    {
                        username = sdr["Username"].ToString();
                        password = BusinessLayer.ShoppingCart.CreateSHAHash("Password").ToString();
                    }
                }
                con.Close();
            }
        }
        if (!string.IsNullOrEmpty(password))
        {
            MailMessage mm = new MailMessage("[email protected]", txtEmail.Text.Trim());
            mm.Subject = "Password Recovery";
            mm.Body = string.Format("Hi {0},<br /><br />Your password is {1}.<br /><br />Thank You.<br/><br/>IslandGas Team", username, password);
            mm.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "smtp.gmail.com";
            smtp.EnableSsl = true;
            NetworkCredential NetworkCred = new NetworkCredential();
            NetworkCred.UserName = ConfigurationManager.AppSettings["UserName"];
            NetworkCred.Password = ConfigurationManager.AppSettings["Password"];
            smtp.UseDefaultCredentials = true;
            smtp.Credentials = NetworkCred;
            smtp.Port = 587;
            smtp.Send(mm);
            lblMessage.ForeColor = Color.Green;
            lblMessage.Text = "Password has been sent to your email address.";
        }
        else
        {
            lblMessage.ForeColor = Color.Red;
            lblMessage.Text = "This email address does not match our records.";
        }
    }

я пытался заставить его работать по этому коду:

using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    if (sdr.Read())
                    {
                        username = sdr["Username"].ToString();
                        password = BusinessLayer.ShoppingCart.CreateSHAHash("Password").ToString();
                    }
                }

но в электронной почте он все еще хэшируется.

кстати, вот мой код hashpassword на бизнес-уровне:

public static string CreateSHAHash(string Phrase)
    {
        SHA512Managed HashTool = new SHA512Managed();
        Byte[] PhraseAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(Phrase));
        Byte[] EncryptedBytes = HashTool.ComputeHash(PhraseAsByte);
        HashTool.Clear();
        return Convert.ToBase64String(EncryptedBytes);
    }

person Paolo Duhaylungsod    schedule 19.07.2015    source источник


Ответы (3)


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

Мне также удалось войти через этот хешированный пароль.

Это также противоречит цели хеширования, потому что получение доступа к списку хэшей дает злоумышленнику возможность войти в систему «легально», не зная пароля. Кроме того, похоже, что ваша система использует "несоленые" пароли для создания хэша, который серьезная проблема с безопасностью.

работает нормально (отправка пароля на электронную почту пользователя)

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

любые трюки, которыми вы можете поделиться [чтобы расшифровать пароль]

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

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

person Sergey Kalinichenko    schedule 19.07.2015

Как уже упоминали gordon и dasblinkenlight, важно учитывать, что хеш-функции являются односторонними функциями и необратимы. (И что также важно посолить ваши сохраненные пароли!)

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

Существуют существующие решения для облегчения этих действий. Вы можете воспользоваться этим обширным Пример удостоверения ASP.NET в качестве отправной точки.

person khlr    schedule 19.07.2015

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

Вместо этого вы должны сохранить простой пароль в своей базе данных или зашифрованное (не хешированное) значение пароля.

ты Гордон

person gordon    schedule 19.07.2015
comment
Поощрять кого-либо хранить пароли в виде простого текста — абсолютный запрет. - person khlr; 19.07.2015