Se si sta solo verificando/convalidando il nome utente e la password immessi, utilizzare la classe Rfc2898DerivedBytes (nota anche come funzione di derivazione chiave basata su password 2 o PBKDF2). Questo è più sicuro rispetto all'utilizzo di crittografia come Triple DES o AES perché non esiste un modo pratico per passare dal risultato di RFC2898DerivedBytes alla password. Puoi passare da una password al risultato. Vedi Is it ok to use SHA1 hash of password as a salt when deriving encryption key and IV from password string? per un esempio e discussione per .Net o String encrypt/decrypt with password c# Metro Style per WinRT/Metro.
Se si sta memorizzando la password per il riutilizzo, ad esempio fornendola a terzi, utilizzare Windows Data Protection API (DPAPI). Questo utilizza le chiavi generate e protette dal sistema operativo e l'algoritmo di crittografia Triple DES per crittografare e decrittografare le informazioni. Ciò significa che l'applicazione non deve preoccuparsi di generare e proteggere le chiavi di crittografia, una delle principali preoccupazioni quando si utilizza la crittografia.
In C#, utilizzare la classe System.Security.Cryptography.ProtectedData. Ad esempio, per cifrare un pezzo di dati, utilizzare ProtectedData.Protect()
:
// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext;
// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(entropy);
}
byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
DataProtectionScope.CurrentUser);
Conservare l'entropia e testo cifrato in modo sicuro, come ad esempio in una chiave di file o Registro di sistema con permessi impostati in modo che solo l'utente corrente in grado di leggerlo. Per ottenere l'accesso ai dati originali, utilizzare ProtectedData.Unprotect()
:
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
DataProtectionScope.CurrentUser);
Nota che ci sono considerazioni di sicurezza aggiuntive. Ad esempio, evitare di memorizzare segreti come password come string
.Le stringhe sono immutabili, in quanto non possono essere notificate in memoria, quindi qualcuno che guarda la memoria dell'applicazione o un dump della memoria potrebbe vedere la password. Utilizzare invece SecureString o un byte [] e ricordare di eliminarli o azzerarli non appena la password non è più necessaria.
Prima di tutto, non salvare la password. Hash (possibilmente con un valore salt) e salvalo. – carlosfigueira
"Utenti" intendi normali utenti Windows o qualcos'altro? (Penso che tu voglia dire che alcuni di voi posseggono "utenti" come normali utenti Windows già non possono vedere i reciproci dati ...) –
Ho modificato il tuo titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –