2015-02-08 4 views
0

В настоящее время я работаю над BackupManager, отправив мне письмо после обработки всех задач. Это электронное письмо должно содержать журнал того, что было сделано.Защищенная электронная почта без запроса пароля

Проблема в том, что мой SMTP-сервер электронной почты (gmail) разрешает только шифрованные соединения с использованием SSL. Я знаю, как установить такое соединение, но поскольку программа работает от 2 до 8 утра или в одно и то же время, я не хочу каждый раз вводить пароль. Однако я также не хочу сохранять пароль как обычный текст на жестком диске. Поэтому я ищу способ сохранить пароль, зашифрованный и расшифровать его позже, без подсказки или подобного материала.

Спасибо за помощь,

Turakar

+0

Я думаю, что если вы не хотите его сохранять, вы можете сделать обертку для этой службы на своем сервере, которая будет хранить пароль и делать сеансы. Но это похоже на инженерную – Suhan

+1

, вы можете использовать этот код: http://stackoverflow.com/questions/1678555/password-encryption-decryption-code-in-net –

ответ

0

Я использовал ответ suggsted по Томер Klein с помощью ProtectedData. Просто используйте ProtectedData.Protect(data, salt, scope) для защиты вашего пароля в байтах и ​​ProtectedData.Unprotect(data, salt, scope), чтобы снять защиту. Не забудьте удалить свой пароль из памяти, как только вы закончите, иначе злоумышленник может извлечь его оттуда.

0

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; 
 
}

+0

Но ключ статический в этом случае, не Это? – Turakar

+0

Какой ключ? Шифрование является статическим, но вы можете сохранить зашифрованный пароль в свой app.config ... –

+0

Я использую это в некоторых своих приложениях в Интернете/Win, и он работает очень хорошо –

Смежные вопросы