不提示输入密码的安全电子邮件
Secure email without prompting for password
我目前正在使用 BackupManager,在处理完所有任务后向我发送电子邮件。此电子邮件应包含已完成操作的日志。
问题是,我的电子邮件 SMTP 服务器 (gmail) 只允许使用 SSL 的加密连接。我知道如何建立这样的连接,但由于程序运行时间是凌晨 2 点到 8 点或类似的时间,我不想每次都必须输入密码。但是,我也不想将密码以纯文本形式保存在硬盘上。所以我正在寻找一种方法来保存加密的密码并在以后解密而不需要提示或类似的东西。
感谢您的帮助,
图拉卡尔
private string Encrypt(string clearText)
{
string EncryptionKey = "MAKV2SPBNI99212";
byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
clearText = Convert.ToBase64String(ms.ToArray());
}
}
return clearText;
}
private string Decrypt(string cipherText)
{
string EncryptionKey = "MAKV2SPBNI99212";
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
我使用了 Tomer Klein 使用 ProtectedData 建议的答案。只需使用 ProtectedData.Protect(data, salt, scope)
以字节为单位保护您的密码,并使用 ProtectedData.Unprotect(data, salt, scope)
取消保护。请记得在完成后从内存中删除密码,否则攻击者可以从那里取回密码。
我目前正在使用 BackupManager,在处理完所有任务后向我发送电子邮件。此电子邮件应包含已完成操作的日志。
问题是,我的电子邮件 SMTP 服务器 (gmail) 只允许使用 SSL 的加密连接。我知道如何建立这样的连接,但由于程序运行时间是凌晨 2 点到 8 点或类似的时间,我不想每次都必须输入密码。但是,我也不想将密码以纯文本形式保存在硬盘上。所以我正在寻找一种方法来保存加密的密码并在以后解密而不需要提示或类似的东西。
感谢您的帮助,
图拉卡尔
private string Encrypt(string clearText)
{
string EncryptionKey = "MAKV2SPBNI99212";
byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
clearText = Convert.ToBase64String(ms.ToArray());
}
}
return clearText;
}
private string Decrypt(string cipherText)
{
string EncryptionKey = "MAKV2SPBNI99212";
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
我使用了 Tomer Klein 使用 ProtectedData 建议的答案。只需使用 ProtectedData.Protect(data, salt, scope)
以字节为单位保护您的密码,并使用 ProtectedData.Unprotect(data, salt, scope)
取消保护。请记得在完成后从内存中删除密码,否则攻击者可以从那里取回密码。