2015-03-18 3 views
1

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

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

Вопрос заключается в том, что пароль приходит в зашифрованном формате только, Пример: -

3ab315c4b788dc6de20ff5f64574501f

Ниже мой код для отправки почты с именем пользователя и детали

DataSet ds = new DataSet(); 
     using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString)) 
     { 
      conn.Open(); 
      SqlCommand cmd = new SqlCommand("SELECT username,password FROM tbl_User Where email= '" + txtEmail.Text.Trim() + "'", conn); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(ds); 
      conn.Close(); 
      if (ds.Tables[0].Rows.Count > 0) 
      { 
       MailMessage Msg = new MailMessage(); 
       // Sender e-mail address. 
       Msg.From = new MailAddress(txtEmail.Text); 
       // Recipient e-mail address. 
       Msg.To.Add(txtEmail.Text); 
       Msg.Subject = "Password Details"; 
       Msg.Body = "Hi, <br/>Please check your Login Details<br/><br/>Your Username is: " + ds.Tables[0].Rows[0]["username"] + "<br/><br/>Your Password is: " + ds.Tables[0].Rows[0]["password"] + "<br/><br/>"; 
       Msg.IsBodyHtml = true; 
       // your remote SMTP server IP. 
       SmtpClient smtp = new SmtpClient(); 
       smtp.Host = "smtp.gmail.com"; 
       smtp.Port = 587; 
       smtp.Credentials = new System.Net.NetworkCredential("[email protected]", "********"); 
       smtp.EnableSsl = true; 
       smtp.Send(Msg); 
       Msg = null; 
       //lbltxt.Text = "Your Password Details Sent to your mail"; 
       ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('Your Password Details Sent to your mail');window.location ='Login.aspx';", true); 
       // Clear the textbox valuess 
       txtEmail.Text = ""; 
      } 
      else 
      { 
       Response.Write("<script>alert('Email Id you entered does not exist');</script>"); 
      } 
     } 

Также см. мой зашифрованный код при отправке пароля в зашифрованном формате. Это формат MD5

private string md5(string sPassword) 
    { 
     MD5CryptoServiceProvider x = new MD5CryptoServiceProvider(); 
     byte[] bs = System.Text.Encoding.UTF8.GetBytes(sPassword); 
     bs = x.ComputeHash(bs); 
     System.Text.StringBuilder s = new System.Text.StringBuilder(); 
     foreach (byte b in bs) 
     { 
      s.Append(b.ToString("x2").ToLower()); 
     } 
     return s.ToString(); 
    } 

Просим руководствоваться.

+2

MD5 является хэш-функция, а не функция шифрования. Хеш-функции не являются обратимыми, поэтому невозможно перевести хэш пароля пользователя обратно в свой пароль (игнорируя любые недостатки MD5 или общие атаки грубой силы или словаря). Любая попытка сохранить ваши пароли в восстанавливаемом формате (например, путем их хранения в обратимо зашифрованном виде или, что еще хуже, в виде открытого текста) ** нарушает безопасность ваших пользователей **. Возможность отправлять пользователю свой текущий пароль по электронной почте не является допустимым механизмом восстановления учетной записи и его следует избегать. – Iridium

+0

@Iridium: Итак, скажите, пожалуйста, лучший альтернативный путь. Будем рады реализовать это – BNN

ответ

2

Пара проблем здесь стоит выделить.

  1. Ваши пароли не зашифрованы, они хэшированы.

  2. Вы используете md5, который, как доказано, был сломан в течение некоторого времени.

Во-первых, вы должны understand the difference between hashing and encrypting

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

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

Кроме того, в идеальном мире вы не хотите отправлять пароли по электронной почте, но есть proper mechanism to recover password

+0

Итак, что я делаю, я сохраняю пароль как обычный текст в базе данных. Таким образом, конечный пользователь может легко получить его. Это нормально ?? – BNN

+2

Нет, вы никогда не хотите хранить пароль как обычный текст в базе данных, хеширование является правильным (просто используйте что-то еще, чем md5 для него). Я бы рекомендовал использовать правильный хэш + соль для хранения паролей и реализации чего-то вроде этого: http://stackoverflow.com/a/1102817/3012759. но если вам нужно быстрое и грязное решение, вы можете просто установить пароль пользователя на случайное создание и обновить запись базы данных с помощью нового хеша и отправить произвольно сгенерированный пароль пользователю (это не рекомендуется, хотя ....) – user3012759

Смежные вопросы