Ich frage mich, ob der im UserManager , der mit MVC 5 und ASP.NET Identity Framework geliefert wird, standardmäßig implementierte Password Hasher sicher genug ist. Und wenn ja, könnten Sie mir erklären, wie es funktioniert?
Die IPasswordHasher-Schnittstelle sieht folgendermaßen aus:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Wie Sie sehen können, braucht es kein Salz, aber es wird in diesem Thread erwähnt: " Asp.net Identity Password Hashing ", dass es Salz hinter den Kulissen infiziert. Also frage ich mich, wie es das macht? Und woher kommt dieses Salz?
Ich mache mir Sorgen, dass das Salz statisch ist, was es ziemlich unsicher macht.
securiry.stackexchange.com
. Und danke für den Tipp!Antworten:
So funktioniert die Standardimplementierung ( ASP.NET Framework oder ASP.NET Core ). Es verwendet eine Schlüsselableitungsfunktion mit zufälligem Salz, um den Hash zu erzeugen. Das Salz ist Teil der Ausgabe des KDF. Jedes Mal, wenn Sie dasselbe Passwort "hashen", erhalten Sie unterschiedliche Hashes. Um den Hash zu überprüfen, wird die Ausgabe auf das Salt und den Rest aufgeteilt, und das KDF wird erneut mit dem Kennwort mit dem angegebenen Salt ausgeführt. Wenn das Ergebnis mit dem Rest der ursprünglichen Ausgabe übereinstimmt, wird der Hash überprüft.
Hashing:
Überprüfen:
quelle
HashPassword
Funktion beide in derselben Zeichenfolge zurück? Und wenn Sie es überprüfen, teilt es es erneut auf und hasht das eingehende Klartext-Passwort mit dem Salz aus der Aufteilung und vergleicht es mit dem ursprünglichen Hash?var hashedPassword = HashPassword(password); var result = VerifyHashedPassword(hashedPassword, password);
- ist das, was Sie tun müssen. danachresult
enthält wahr.Da ASP.NET heutzutage Open Source ist, finden Sie es auf GitHub: AspNet.Identity 3.0 und AspNet.Identity 2.0 .
Aus den Kommentaren:
quelle
Ich verstehe die akzeptierte Antwort und habe sie hochgestimmt, dachte aber, ich würde die Antwort meiner Laien hier ablegen ...
Einen Hash erstellen
Überprüfen eines Passworts gegen einen Hash
So überprüfen Sie ein Kennwort, das ein Benutzer eingibt.
Der Hash
Unter dem Deckmantel wird der Hash mit der SHA1-Hash-Funktion ( https://en.wikipedia.org/wiki/SHA-1 ) generiert . Diese Funktion wird iterativ 1000 Mal aufgerufen (in der Standardimplementierung von Identity).
Warum ist das sicher?
quelle
Für diejenigen wie mich, die diesbezüglich brandneu sind, gibt es hier Code mit const und eine tatsächliche Möglichkeit, die Bytes [] zu vergleichen. Ich habe den gesamten Code von stackoverflow erhalten, aber consts definiert, damit Werte geändert werden können und auch
In Ihrem benutzerdefinierten ApplicationUserManager legen Sie für die PasswordHasher-Eigenschaft den Namen der Klasse fest, die den obigen Code enthält.
quelle
_passwordHashBytes = bytes.GetBytes(SaltByteSize);
ich denke du hast das gemeint_passwordHashBytes = bytes.GetBytes(HashByteSize);
... spielt in deinem Szenario keine Rolle, da beide gleich groß sind, aber im Allgemeinen ...