Ich mache eine Windows-Anwendung, bei der Sie sich zuerst anmelden müssen.
Die Kontodaten bestehen aus Benutzername und Passwort und müssen lokal gespeichert werden.
Es ist nur eine Frage der Sicherheit, sodass 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?
Ich möchte keine Datenbank verwenden, deshalb habe ich einige Dinge mit Ressourcendateien versucht.
Aber da ich damit ein bisschen neu bin, bin ich mir nicht ganz sicher, was ich tue und wo ich nach einer Lösung suchen sollte.
Antworten:
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()
: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()
: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.quelle
ProtectedData
besteht darin, dass ich mir keine Sorgen machen muss, ob die Entropie und der Chiffretext sicher gespeichert werden sollen, sodass nur der aktuelle Benutzer sie lesen kann . Ich denke, es bietet Einfachheit, indem ich sie speichern kann, aber es ist bequem und trotzdem kann nur der CurrentUser es entschlüsseln. Derentropy
Parameter ist ebenfalls optional und ähnelt einer IV, bei der die Eindeutigkeit wichtiger ist als die Geheimhaltung. Daher könnte der Wert in Situationen, in denen die Variation und Aktualisierung von Klartext selten vorkommt, wahrscheinlich weggelassen oder fest im Programm codiert werden.Ich habe dies schon einmal verwendet und denke, um sicherzustellen, dass die Anmeldeinformationen bestehen bleiben und dies auf die sicherste Art und Weise ist
ConfigurationManager
Klasse in die App-Konfigurationsdatei schreibenSecureString
KlasseCryptography
Namespace.Dieser Link wird hoffentlich eine große Hilfe sein: Klicken Sie hier
quelle
DPAPI ist nur für diesen Zweck. Verwenden Sie DPAPI, um das Kennwort zu verschlüsseln, wenn der Benutzer es zum ersten Mal eingibt, und speichern Sie es an einem sicheren Ort (die Registrierung des Benutzers, das Anwendungsdatenverzeichnis des Benutzers, sind einige Optionen). Überprüfen Sie bei jedem Start der App den Speicherort, um festzustellen, ob Ihr Schlüssel vorhanden ist. Wenn DPAPI zum Entschlüsseln und Zulassen des Zugriffs verwendet wird, verweigern Sie ihn andernfalls.
quelle
Dies funktioniert nur unter Windows. Wenn Sie also die plattformübergreifende Verwendung des Dotnet-Kerns planen, müssen Sie sich anderswo umsehen. Siehe https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md
quelle
Ich wollte die Zeichenfolge als lesbare Zeichenfolge verschlüsseln und entschlüsseln.
Hier ist ein sehr einfaches Beispiel in C # Visual Studio 2019 WinForms basierend auf der Antwort von
@Pradip
.Klicken Sie mit der rechten Maustaste auf Projekt> Eigenschaften> Einstellungen> Erstellen
username
undpassword
Einstellung.Jetzt können Sie die soeben erstellten Einstellungen nutzen. Hier speichere ich das
username
undpassword
verschlüssele aber nur daspassword
in seinem respektablen Wertfeld in deruser.config
Datei.Beispiel für die verschlüsselte Zeichenfolge in der
user.config
Datei.Vollständiger Code
quelle