Warum kehrt BCrypt.net GenerateSalt (31) sofort zurück?
Stolperte ich über BCrypt.net nach der Lektüre Jeff Atwood Beitrag über die Speicherung von Passwörtern das führte mich zu Thomas Ptacek Empfehlung an verwenden Sie BCrypt zum speichern von Passwörtern. Das führte mich schließlich zu diese C# - Implementierung von BCrypt
In den Kommentaren zu dem letzten link oben jemand fragte: "Warum tun GenerateSalt(30) nehmen für immer, aber GenerateSalt(31) scheint keine Zeit nehmen?"
Lief ich BCrypt.HashPassword(Passwort, BCrypt.GenerateSalt(31)) und habe mein Ergebnis in 0 Millisekunden.
Ich habe seit BCrypt.HashPassword("Passwort", BCrypt.GenerateSalt(30)) für mehr als 5 Minuten jetzt und noch kein Ergebnis.
Merke ich, wir werden wahrscheinlich nicht brauchen, eine zufällig generierte, 30-Zeichen-salt, erstellen unsere Passwort-hashes (oder unumkehrbaren Verschlüsselung in BCrypt Fall) seit Jahren. BEARBEITEN ich gelesen haben sollten, den code ein wenig, logRounds hat nichts zu tun mit der Salz-Länge. Dank Aaronaught.
Also, warum GenerateSalt(31) einen Wert zurück fast sofort (wenn es sollte etwa doppelt so lang wie GenerateSalt(30)?
UPDATE
hier ist der fix:
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
//... snip ...
uint rounds = 1U << logRounds;
//... snip
}
InformationsquelleAutor der Frage user1 | 2010-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass der bug hier:
Wenn Sie angeben, 31 für die
logRounds
es berechnet, dass 2^32, die nicht passen in einemint
- und überläufe, so dass der hash ist eigentlich fertig... äh, null geht. Der Autor verwendetuint
statt. Einfach zu beheben!Wollte auch einen Kommentar auf dieser:
Beachten Sie, dass die
logRounds
parameter beziehen sich nicht auf die Anzahl der Zeichen/bytes in der Salz, das ist immer 16. Es bezieht sich auf die logarithmische Basis der Anzahl der Durchgänge, in denen der hash nehmen, um zu berechnen, in anderen Worten, es ist ein Weg, um bcrypt-Skala mit Moore ' s Gesetz, so dass die Funktion mehrere Größenordnungen teurer zu berechnen, wenn Computer immer schnell genug zu knacken vorhandenen hashes.InformationsquelleAutor der Antwort Aaronaught
Wenn Vermischung mit
GenerateSalt(31)
zurück fast sofort, das ist ein bug. Sie sollte der Bericht, der die vor (ich habe es zum jBCrypt). 🙂Standardmäßig werden die log-Runden ist 10. Dies bedeutet, dass (wenn ich mich richtig erinnere), 1024 Runden verwendet wird. Jedes mal, erhöhen Sie den log-Runden, die Anzahl der Runden ist verdoppelt.
Bei 30 log-Runden, du tust 1073741824 Runden. Das Recht lange dauert. Bei 31-Protokoll-Runden, 2147483648 Runden sollte sein getan, aber ich vermute, dass die spezielle Implementierung, die Sie verwenden überläufe statt. 🙁
InformationsquelleAutor der Antwort Chris Jester-Young