2012-09-30 12 views
72

Ich mache eine Windows-Anwendung, die Sie zuerst anmelden müssen.
Die Kontodaten bestehen aus Benutzername und Passwort und müssen lokal gespeichert werden.
Es ist nur eine Frage der Sicherheit, damit andere Personen, die denselben Computer verwenden, nicht alle persönlichen Daten sehen können.
Was ist der beste/sicherste Weg, um diese Daten zu speichern? Wie sicher Benutzername/Passwort (lokal) zu speichern?

Ich will nicht, um eine Datenbank verwenden, so habe ich versucht, einige Dinge mit Ressourcendateien.
Aber da ich damit etwas neu bin, bin ich mir nicht ganz sicher, was ich mache und wo ich nach einer Lösung suchen sollte.

+4

Zuallererst, speichern Sie das Passwort nicht. Hash es (möglicherweise mit einem Salz-Wert), und speichern Sie stattdessen. – carlosfigueira

+0

"Benutzer" meinen Sie normale Windows-Benutzer oder etwas anderes? (Ich denke du meinst einige von euch eigenen "Benutzern", da normale Windows-Benutzer ihre Daten gegenseitig nicht sehen können ...) –

+0

Ich habe deinen Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

Antwort

120

Wenn Sie nur den eingegebenen Benutzernamen und das Kennwort bestätigen/bestätigen möchten, verwenden Sie die Klasse Rfc2898DerivedBytes (auch bekannt als passwortbasierte Schlüsselableitungsfunktion 2 oder PBKDF2). Dies ist sicherer als eine Verschlüsselung wie Triple DES oder AES, da es keinen praktischen Weg gibt, vom Ergebnis von RFC2898DerivedBytes zurück zum Passwort zu gelangen. Sie können nur von einem Passwort zum Ergebnis gehen. Ein Beispiel und eine Diskussion für .Net oder String encrypt/decrypt with password c# Metro Style für WinRT/Metro finden Sie unter Is it ok to use SHA1 hash of password as a salt when deriving encryption key and IV from password string?.

Wenn Sie das Passwort für die Wiederverwendung speichern, z. B. für die Weitergabe an Dritte, verwenden Sie . Dies verwendet vom Betriebssystem generierte und geschützte Schlüssel und den Verschlüsselungsalgorithmus Triple DES zum Verschlüsseln und Entschlüsseln von Informationen. Das bedeutet, dass Ihre Anwendung sich nicht darum kümmern muss, die Verschlüsselungsschlüssel zu generieren und zu schützen, was bei der Verwendung von Kryptografie eine wichtige Rolle spielt.

Verwenden Sie in C# die Klasse System.Security.Cryptography.ProtectedData. Um zum Beispiel ein Stück von Daten zu verschlüsseln, verwenden 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); 

Shop die Entropie und verschlüsselten Text sicher, wie in einer Datei oder einen Registrierungsschlüssel mit Berechtigungen festgelegt, so dass nur der aktuelle Benutzer sie lesen kann. Um den Zugriff auf die Originaldaten zu erhalten, verwenden ProtectedData.Unprotect():

byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy, 
    DataProtectionScope.CurrentUser); 

Hinweis, dass es zusätzliche Sicherheitsüberlegungen. Vermeiden Sie z. B. das Speichern von geheimen Passwörtern wie string.Zeichenfolgen sind unveränderlich, da sie nicht im Speicher gemeldet werden können, sodass jemand, der den Speicher der Anwendung oder einen Speicherauszug betrachtet, das Kennwort sehen kann. Verwenden Sie stattdessen SecureString oder ein Byte [] und denken Sie daran, sie zu entsorgen oder auf Null zu setzen, sobald das Passwort nicht mehr benötigt wird.

+0

Hallo, ich habe das versucht, aber ich habe einen Fehler bei Entropy = Rng.GetBytes (20) sagen: Kann nicht von Int in Byte konvertieren [] – Robin

+0

@CrispyGMR Ich habe diesen Teil des Codes in der Antwort behoben. Guter Fang. – akton

+0

Vielen Dank. Ich habe zuerst md5 zum Hashing benutzt, aber ich war skeptisch. Dies scheint viel sicherer. Eine weitere Frage. Ich möchte einige Daten in einer Textdatei speichern. Ich sehe, dass es nur eine Reihe zufälliger Zeichen ist, wenn ich meine Datei öffne, aber ist es sicher genug, dies zu tun? Oder empfehlen Sie eine andere Möglichkeit, die Daten zu speichern? – Robin

6

Ich habe dies genutzt, bevor und ich denke, um fortbestehen sicher Berechtigungsnachweis zu machen und in einer am besten sicheren Art und Weise ist

  1. Sie sie an die App-Konfigurationsdatei mit der ConfigurationManager Klasse
  2. schreiben Sichern des Passworts mit der SecureString Klasse
  3. dann Verschlüsselung mit Hilfe von Tools im Cryptography Namensraum.

Dieser Link eine große Hilfe sein wird, hoffe ich: Click here

3

DPAPI nur für diesen Zweck ist. Verwenden Sie DPAPI, um das Kennwort zu verschlüsseln, wenn der Benutzer das erste Mal eingibt, und speichern Sie es an einem sicheren Ort (die Registrierung des Benutzers, das Anwendungsdatenverzeichnis des Benutzers, gibt einige Auswahlmöglichkeiten). Wenn die App gestartet wird, überprüfen Sie den Speicherort, um festzustellen, ob Ihr Schlüssel vorhanden ist, wenn DPAPI zum Entschlüsseln und Zulassen des Zugriffs verwendet wird, andernfalls verweigern Sie ihn.

Verwandte Themen