標題有點繞,請原諒。這里解釋一下…
背景:
公司經常要發出一些Enewsletter,里面含有一些特定的鏈接,當用戶點擊的郵件內鏈接的時候,會根據用戶的信息帶客戶到不同的頁面,對一些客戶會讓他們填寫表格,而這些表格一開始已經提前放置了客戶的基本信息。
客戶的來源可能是從公司站點的原有注冊用戶,也有可能來自公司從其他地方收集的信息。-- 補充一句,這不同于一般的垃圾郵件,而是針對特定群體的邀請信。
問題:
實現的需求的速度是越快越好,所以取巧直接用了客戶的電子郵件放置在鏈接當中,但是如何不讓客戶或其他人看到甚至修改呢?
實現:
哈!好在asp.net有個國度叫System.Security.Cryptography.
在此國度內居住的一類群體專管加密解密…
來創建一個針對本次需求的類:

public static class SimpleSecurity
{
private const string MyKey = "uptoyou";
static public string Decrypt(string myString, bool urlDecode)
{
TripleDESCryptoServiceProvider cryptDES3 = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider cryptMD5Hash = new MD5CryptoServiceProvider();
cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(MyKey));
cryptDES3.Mode = CipherMode.ECB;
ICryptoTransform desdencrypt = cryptDES3.CreateDecryptor();
byte[] buff = Convert.FromBase64String(myString);
return ASCIIEncoding.ASCII.GetString(desdencrypt.TransformFinalBlock(buff, 0, buff.Length));
}
static public string Encrypt(string myString)
{
TripleDESCryptoServiceProvider cryptDES3 = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider cryptMD5Hash = new MD5CryptoServiceProvider();
cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(MyKey));
cryptDES3.Mode = CipherMode.ECB;
ICryptoTransform desdencrypt = cryptDES3.CreateEncryptor();
byte[] buff = ASCIIEncoding.ASCII.GetBytes(myString);
return s = Convert.ToBase64String(desdencrypt.TransformFinalBlock(buff, 0, buff.Length));
}
}
要想加密客戶的郵件生成所要的url地址,你可以:

SimpleSecurity.Encrypt(email);
生成的字符串可能類似于:6OpKSqWe57SAHBhmJJsF7Q%3d%3dccc, 因為Key在你的手上,別人要解密可能性很低。
接下來如果你想從客戶頁面請求的地址中解密得到他的郵件,只需要:

if (Request.QueryString["u"] != null)
email = SimpleSecurity.Decrypt(Request.QueryString["u"]);
簡單且安全,有什么不足之處希望大家海涵,歡迎回帖討論,歡迎關注,歡迎大家提出不同觀點。