C# - Sicher speichern ein Kennwort lokal
Ich bin erstellen einer C# - Anwendung, mit lock-out Funktion (Tastenkombinationen, windows task-bar, etc.) in einem Kiosk im Stil Umwelt. Eine der Anforderungen ist, dass einige Leute sollten noch in der Lage sein zu brechen, aus der Anwendung mit einer Tastenkombination und ein Passwort.
Die Anwendung selbst ist völlig fertig, aber ich habe nicht gefunden, eine gute Möglichkeit zum speichern und überprüfen Sie Sie gegen ein Passwort. Alles soll lokal gespeichert werden (es wird keine überprüfung gegen ein Netzwerk, Datenbank oder was auch immer). Wie kann ich definieren Sie ein Passwort für das entsperren meiner Anwendung, während so dass dies auch flexibel sind, die Möglichkeit, das Passwort zu ändern ohne Neukompilierung der Anwendung). Wie kann ich erreichen, dies in einer sicheren Art und Weise?
- Statt DIY, wie etwa die Einrichtung eines lokalen Admin-Konto? Ihre app wird nicht blockiert Strg+Alt+Entf trotzdem.
- Nein, es wird nicht. Aber die Voraussetzung ist, dass man in der Lage sein, um vollen Zugriff auf die aktuelle session. Ich kann das nicht ändern leider.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die standard-Methode zum speichern eines Kennworts in einer Konfigurationsdatei wird die Verwendung einer starken hash-Algorithmus. Lesen Sie die Antwort auf Wie die Speicherung der Passwörter in der Winforms-Anwendung? und vielleicht den wiki-Artikel an https://en.wikipedia.org/wiki/Cryptographic_hash_function
Store einen sicheren hash des Kennwortes, es muss nicht reversibel sein.
Wenn jemand in das Kennwort-hash, durch den gleichen Algorithmus, und überprüfen Sie es entspricht dem hash.
Da man nie speichern Sie das aktuelle Passwort ist es sicher.
Empfehle ich ein key-stretching-Algorithmus, wie PBKDF2. .Netto hat die Unterstützung für diese mit
Rfc2898DeriveBytes
oder verwenden SieSystem.Web.Helferinnen und Helfer.Crypto
.Können Sie speichern ein hash-Wert Ihrer Schlüssel und ein Kennwort irgendwo, zum Beispiel in einigen lokalen Datei. Wenn die person, die Eingabe-Taste und Passwort, die Sie erhalten hashes für die diese Werte und vergleichen Sie Sie mit den hashes in der Datei.
Da muss ich widersprechen, mit Brian, da ab jetzt die standard-Methode für die Speicherung der Passwörter in einer Datenbank zu "Salz" (siehe Wikipedia für eine ausführliche Erklärung) das Kennwort, mit einem zufällig generierten Wert und speichern Sie den Hashwert und das Salz in deine "Datenbank" (siehe Anmerkungen). Das Salz ist nicht ein Geheimnis, damit Sie speichern können es im Klartext. Wenn der Benutzer das Passwort, Lesen Sie das Salz von Ihrer Datei, es anwenden, um das eingegebene Passwort und wenden Sie dann Ihre gewählten hash-Algorithmus. Dann vergleichen Sie die Ergebnisse mit dem gespeicherten hash. Wenn Sie übereinstimmen, wird der Benutzer authentifiziert. Für eine gute (und unterhaltsam :)) Erklärung, warum "nur" das Hashen des Passworts ist nicht genug, finden Sie unter: Wie NICHT zum speichern von Passwörtern!
Für ein tutorial Umsetzung des salting und hashing-Prozess in C# finden Sie unter: C# Salzen & Hash-Passwörter
Finden Sie auch ein guter Weg, um dies hier tun: https://stackoverflow.com/a/12657970
Für eine schnelle Referenz, das Verfahren in pseudocode:
Erste Passwort-Speicher:
User-login:
Bemerkungen:
Benötigen Sie einen hash des Passworts und überprüfen mit Hilfe der Hash-text. Hinzufügen von Salz können Sie Ihr Passwort sicherer. In .Net, die Sie verwenden können,System.Sicherheit.Die Kryptographie.RNGCryptoServiceProvider .
Hier ist ein guter Artikel darüber reden, wie um Ihre Passwörter zu speichern, und ich benutze seinen Weg in meine web-Anwendung.
Ist relativ einfach mit
ProtectSection()
undUnprotectSection()
Methoden ausSectionInformation
Klasse. Finden Sie in diesem Artikel:http://www.davidgiard.com/2012/06/05/EncryptingAndDecryptingApplicationConfigSections.aspx
http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.protectsection.aspx