2013-06-22 95 views
2

我在寫一個需要發送SMTP電子郵件的C#類。我發現代碼在這太問題這給了我什麼,我需要發送電子郵件(SO Question)如何安全存儲和設置SmtpClient類使用的密碼?

爲方便起見,這裏是我從一個answer修改對上述問題的代碼:

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#源文件中。問題一是這個代碼將被簽入團隊基礎服務,所以整個團隊都必須/瞭解憑證。問題二是混淆是可能的,但它不能解決問題1.

最接近我找到的解決方案是應用程序配置的加密作爲安裝步驟。這並沒有解決問題1,但如果需要的話可以完成。

這種情況是否出現在生產應用程序中,以及哪些最佳實踐用於存儲實例化C#類所需的密碼?

回答

1

我們使用我們的構建服務器TeamCity解決了這個問題。構建系統包含生產機密(密碼,API密鑰等),只能由少數可信個人設置。然後,我們的構建系統負責在使用腳本和/或密碼構建參數進行編譯之前/之後更改配置(以及其他敏感)文件。

這使我們能夠爲我們的祕密提供階段/測試值,但知道生產構建會獲得生產祕密。 App/Web.Config轉換可以處理URL切換(dev/qa/stage/prod),所以我們只使用構建服務器來處理我們不希望包含在源代碼控制中的部分。

-1

只接受純文本,即

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

在部署項目中,沒有一個人能看到你的密碼。如果將其保存爲文本文件,則可以使用加密方法來防止他人查看您的密碼,但是如果將其解析爲憑證的參數,則必須將其解析爲純文本。這是我們專業做的常用方式。如果您不願意提供您的郵件密碼,請創建另一個電子郵件帳戶進行測試,並將其憑據放在那裏。