Se si intende solo verificare / convalidare il nome utente e la password immessi, utilizzare la classe Rfc2898DerivedBytes (nota anche come funzione di derivazione della 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 tornare dal risultato di RFC2898DerivedBytes alla password. Puoi solo passare da una password al risultato. Vedere È consentito utilizzare l'hash SHA1 della password come salt quando si ricava la chiave di crittografia e IV dalla stringa della password? per un esempio e una discussione per. Net o String crittografare / decrittografare con password c # Metro Style per WinRT / Metro.
Se si memorizza la password per il riutilizzo, ad esempio per fornirla a una terza parte, utilizzare l' API di protezione dei dati di Windows (DPAPI) . 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 la tua applicazione non deve preoccuparsi di generare e proteggere le chiavi di crittografia, una delle principali preoccupazioni quando si utilizza la crittografia.
In C #, usa la classe System.Security.Cryptography.ProtectedData . Ad esempio, per crittografare un dato, usa 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);
Memorizza l'entropia e il testo cifrato in modo sicuro, ad esempio in un file o in una chiave di registro con le autorizzazioni impostate in modo che solo l'utente corrente possa leggerli. Per accedere ai dati originali, utilizzare ProtectedData.Unprotect()
:
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
DataProtectionScope.CurrentUser);
Notare che esistono ulteriori considerazioni sulla sicurezza. Ad esempio, evita di memorizzare segreti come password come file string
. Le stringhe sono immutabili, poiché 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 ricordarsi di eliminarli o azzerarli non appena la password non è più necessaria.