如何安全地存储和设置密码以供SmtpClient类使用?

时间:2013-06-22 01:08:14

标签: c# tfs passwords smtpclient azure-devops

我正在编写一个需要发送SMTP电子邮件的C#类。我在这个问题中找到了代码,它给了我发送电子邮件所需的内容(SO Question)

为方便起见,以下是我正在修改的代码answer到上述问题:

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

var fromAddress = new MailAddress("from@gmail.com", "From Name");
var toAddress = new MailAddress("to@example.com", "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#源文件中。问题一是,此代码将签入团队基础服务,因此整个团队必须/了解凭据。问题二是混淆是可能的,但它不能解决问题1.

最接近我发现的解决方案是将app config加密为安装步骤。这不能解决问题1,但如果有必要可以做到。

生产应用程序中是否出现这种情况,以及使用哪些最佳实践来存储实例化C#类所需的密码?

2 个答案:

答案 0 :(得分:1)

我们使用构建服务器TeamCity解决了这个问题。构建系统包含生产机密(密码,API密钥等),只能由少数可信任的人员设置。然后,我们的构建系统负责使用脚本和/或密码构建参数在编译之前/之后更改配置(和其他敏感)文件。

这使我们能够为我们的秘密提交登台/测试值,但是知道生产版本会获得生产秘密。 App / Web.Config转换可以处理URL切换(dev / qa / stage / prod),因此我们只使用构建服务器来处理源控件中不包含的部分。

答案 1 :(得分:-1)

它只接受纯文本,即

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

部署项目时,没有人能够看到您的密码。如果将其保存为文本文件,则可以使用加密方法来防止其他人查看您的密码,但如果您将其解析为凭据的参数,则必须将其解析为纯文本。这是我们专业的常用方式。如果您不愿意提供邮件密码,请创建另一个用于测试的电子邮件帐户并将其凭据放在那里。