Wenn Sie nur den eingegebenen Benutzernamen und das eingegebene Kennwort überprüfen / validieren möchten , verwenden Sie die Klasse Rfc2898DerivedBytes (auch als kennwortbasierte Schlüsselableitungsfunktion 2 oder PBKDF2 bezeichnet). Dies ist sicherer als die Verwendung von Verschlüsselung wie Triple DES oder AES, da es keinen praktischen Weg gibt, vom Ergebnis von RFC2898DerivedBytes zum Kennwort zurückzukehren. Sie können nur von einem Passwort zum Ergebnis wechseln. Siehe Ist es in Ordnung, den SHA1-Passwort-Hash als Salt zu verwenden, wenn Verschlüsselungsschlüssel und IV aus der Passwortzeichenfolge abgeleitet werden? Ein Beispiel und eine Diskussion für .Net oder String zum Ver- und Entschlüsseln mit dem Kennwort c # Metro Style für WinRT / Metro.
Wenn Sie das Kennwort zur Wiederverwendung speichern, z. B. zur Weitergabe an Dritte, verwenden Sie die Windows-Datenschutz-API (DPAPI) . Hierbei werden vom Betriebssystem generierte und geschützte Schlüssel sowie der Triple DES- Verschlüsselungsalgorithmus zum Ver- und Entschlüsseln von Informationen verwendet. Dies bedeutet, dass sich Ihre Anwendung nicht um das Generieren und Schützen der Verschlüsselungsschlüssel kümmern muss. Dies ist ein wichtiges Anliegen bei der Verwendung von Kryptografie.
Verwenden Sie in C # die Klasse System.Security.Cryptography.ProtectedData . Verwenden Sie zum Verschlüsseln von Daten beispielsweise Folgendes 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);
Speichern Sie die Entropie und den Chiffretext sicher, z. B. in einer Datei oder einem Registrierungsschlüssel mit festgelegten Berechtigungen, sodass nur der aktuelle Benutzer sie lesen kann. Verwenden Sie Folgendes, um Zugriff auf die Originaldaten zu erhalten ProtectedData.Unprotect()
:
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
DataProtectionScope.CurrentUser);
Beachten Sie, dass es zusätzliche Sicherheitsaspekte gibt. Vermeiden Sie beispielsweise das Speichern von Geheimnissen wie Passwörtern als string
. Zeichenfolgen sind unveränderlich, da sie im Speicher nicht benachrichtigt werden können, sodass jemand, der sich den Speicher der Anwendung oder einen Speicherauszug ansieht, möglicherweise das Kennwort sieht. Verwenden Sie stattdessen SecureString oder ein Byte [] und denken Sie daran, diese zu entsorgen oder auf Null zu setzen, sobald das Kennwort nicht mehr benötigt wird.