Ich möchte den Hash eines Passworts auf dem Telefon speichern, bin mir aber nicht sicher, wie ich das machen soll. Ich kann nur scheinbar Verschlüsselungsmethoden finden. Wie soll das Passwort richtig gehasht werden?
117
UPDATE : Diese Antwort ist ernsthaft veraltet . Bitte verwenden Sie stattdessen die Empfehlungen unter https://stackoverflow.com/a/10402129/251311 .
Sie können entweder verwenden
var md5 = new MD5CryptoServiceProvider();
var md5data = md5.ComputeHash(data);
oder
var sha1 = new SHA1CryptoServiceProvider();
var sha1data = sha1.ComputeHash(data);
Um data
als Byte-Array zu erhalten, könnten Sie verwenden
var data = Encoding.ASCII.GetBytes(password);
und um String von md5data
oder zurück zu bekommensha1data
var hashedPassword = ASCIIEncoding.GetString(md5data);
using
Anweisung einfügen oder aufrufenClear()
, wenn Sie mit der Implementierung fertig sind.md5
gut genug für fast alle Arten von Aufgaben. Seine Schwachstellen beziehen sich auch auf sehr spezifische Situationen und erfordern fast, dass der Angreifer viel über Kryptographie weiß.Die meisten anderen Antworten hier sind mit den heutigen Best Practices etwas veraltet. Als solches ist hier die Anwendung der Verwendung von PBKDF2 /
Rfc2898DeriveBytes
zum Speichern und Überprüfen von Passwörtern. Der folgende Code befindet sich in diesem Beitrag in einer eigenständigen Klasse: Ein weiteres Beispiel für das Speichern eines gesalzenen Kennwort-Hash . Die Grundlagen sind wirklich einfach, daher ist es hier aufgeschlüsselt:SCHRITT 1 Erstellen Sie den Salzwert mit einem kryptografischen PRNG:
SCHRITT 2 Erstellen Sie die Rfc2898DeriveBytes und erhalten Sie den Hashwert:
SCHRITT 3 Kombinieren Sie die Salt- und Passwortbytes für die spätere Verwendung:
SCHRITT 4 Verwandeln Sie das kombinierte Salz + Hasch in eine Zeichenfolge zur Lagerung
SCHRITT 5 Überprüfen Sie das vom Benutzer eingegebene Passwort anhand eines gespeicherten Passworts
Hinweis: Abhängig von den Leistungsanforderungen Ihrer spezifischen Anwendung kann der Wert
100000
reduziert werden. Ein Mindestwert sollte vorhanden sein10000
.quelle
Basierend auf der großartigen Antwort von csharptest.net habe ich eine Klasse dafür geschrieben:
Verwendung:
Ein Beispiel-Hash könnte sein:
Wie Sie sehen können, habe ich auch die Iterationen in den Hash aufgenommen, um die Verwendung zu vereinfachen und die Möglichkeit zu bieten, diese zu aktualisieren, falls ein Upgrade erforderlich ist.
Wenn Sie sich für .net Core interessieren, habe ich auch eine .net Core-Version für Code Review .
quelle
V1
undV2
welche Überprüfungsmethode Sie benötigen.Ich verwende einen Hash und ein Salt für meine Passwortverschlüsselung (es ist der gleiche Hash, den die Asp.Net-Mitgliedschaft verwendet):
quelle
quelle
Die Antworten von @ csharptest.net und Christian Gollhardt sind großartig, vielen Dank. Nachdem ich diesen Code in der Produktion mit Millionen von Datensätzen ausgeführt hatte, stellte ich fest, dass ein Speicherverlust vorliegt. Die Klassen RNGCryptoServiceProvider und Rfc2898DeriveBytes werden von IDisposable abgeleitet, aber wir verfügen nicht über sie. Ich werde meine Lösung als Antwort schreiben, wenn jemand eine entsorgte Version benötigt.
Verwendung:
quelle
Ich denke, KeyDerivation.Pbkdf2 ist besser als Rfc2898DeriveBytes.
Beispiel und Erklärung: Hash-Passwörter in ASP.NET Core
Dies ist ein Beispielcode aus dem Artikel. Und es ist eine Mindestsicherheitsstufe. Um es zu erhöhen, würde ich anstelle des Parameters KeyDerivationPrf.HMACSHA1 verwenden
KeyDerivationPrf.HMACSHA256 oder KeyDerivationPrf.HMACSHA512.
Gehen Sie beim Passwort-Hashing keine Kompromisse ein. Es gibt viele mathematisch fundierte Methoden, um das Hacken von Passwort-Hashs zu optimieren. Folgen könnten katastrophal sein. Sobald ein Übeltäter die Passwort-Hash-Tabelle Ihrer Benutzer in die Hände bekommen kann, ist es für ihn relativ einfach, Passwörter zu knacken, wenn der Algorithmus schwach oder die Implementierung falsch ist. Er hat viel Zeit (Zeit x Computerleistung), um Passwörter zu knacken. Das Passwort-Hashing sollte kryptografisch stark sein, um "viel Zeit" in " unangemessen viel Zeit " umzuwandeln .
Noch ein Punkt zum Hinzufügen
Die Hash-Überprüfung braucht Zeit (und es ist gut). Wenn der Benutzer einen falschen Benutzernamen eingibt, dauert es keine Zeit, um zu überprüfen, ob der Benutzername falsch ist. Wenn der Benutzername korrekt ist, starten wir die Passwortüberprüfung - es ist ein relativ langer Prozess.
Für einen Hacker wäre es sehr leicht zu verstehen, ob ein Benutzer existiert oder nicht.
Stellen Sie sicher, dass Sie keine sofortige Antwort zurückgeben, wenn der Benutzername falsch ist.
Unnötig zu sagen: Geben Sie niemals eine Antwort, was falsch ist. Nur allgemeine "Anmeldeinformationen sind falsch".
quelle