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

Я пишу класс С#, которому нужно отправлять электронные письма SMTP. Я нашел код в этом вопросе SO, который дал мне то, что мне нужно для отправки электронной почты (SO Question )

Для удобства вот код, который я изменяю из ответа на вопрос выше:

using System.Net;
using System.Net.Mail;

var fromAddress = new MailAddress("[email protected]", "From Name");
var toAddress = new MailAddress("[email protected]", "To Name");
const string fromPassword = "fromPassword";
const string subject = "Subject";
const string body = "Body";

var smtp = new SmtpClient
           {
               Host = "smtp.gmail.com",
               Port = 587,
               EnableSsl = true,
               DeliveryMethod = SmtpDeliveryMethod.Network,
               UseDefaultCredentials = false,
               Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
           };
using (var message = new MailMessage(fromAddress, toAddress)
                     {
                         Subject = subject,
                         Body = body
                     })
{
    smtp.Send(message);
}

У меня проблема в том, что код в этом вопросе требует, чтобы пароль smtp хранился в исходном файле C# в виде обычного текста. Первая проблема заключается в том, что этот код будет зарегистрирован в службе Team Foundation, поэтому вся команда должна будет узнать учетные данные. Вторая проблема заключается в том, что запутывание возможно, но не устраняет проблему 1.

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

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


person Steven Magana-Zook    schedule 22.06.2013    source источник


Ответы (2)


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

Это освобождает нас для фиксации промежуточных/тестовых значений для наших секретов, но знайте, что производственные сборки получат производственные секреты. Преобразования App/Web.Config могут позаботиться о переключении URL-адресов (dev/qa/stage/prod), поэтому мы используем сервер сборки только для тех частей, которые мы никогда не хотим включать в систему управления версиями.

person ckittel    schedule 23.12.2013

Он принимает только обычный текст, т.е.

Credentials = new NetworkCredential(fromAddress.Address, "MY Password" )

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

person Kas    schedule 22.06.2013