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

本文关键字:SmtpClient 密码 设置 何安全 安全 存储 | 更新日期: 2023-09-27 18:19:23

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

为方便起见,下面是我从上述问题的答案中修改的代码:

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。

我找到的最接近的解决方案是将应用程序配置加密作为安装步骤。这不能解决问题1,但如果有必要的话可以解决。

这种情况在生产应用程序中会出现吗?使用什么最佳实践来存储实例化c#类所需的密码?

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

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

这让我们可以为我们的秘密提交登台/测试值,但要知道生产构建将获得生产秘密。应用程序/网络。配置转换可以处理URL切换(dev/qa/stage/prod),所以我们只将构建服务器用于我们不希望包含在源代码控制中的部分。

它只接受纯文本,即

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

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