Kurzversion
Die Anzahl der Iterationen, die mindestens 250 ms für die Berechnung zur Verfügung stellen.
Langversion
Als BCrypt 1999 zum ersten Mal veröffentlicht wurde, wurden sie verwendet listete die Standardkostenfaktoren ihrer Implementierung auf:
- normaler Benutzer: 6
- Superuser: 8
Ein Verschlüsselungspreis von 6 bedeutet 64 Runden (2 6 sup> = 64).
Sie stellen außerdem fest:
Natürlich sollten die von den Menschen gewählten Kosten von Zeit zu Zeit neu bewertet werden.
- Zum Zeitpunkt des Einsatzes 1976 Krypta kann weniger als 4 Passwörter pro Sekunde hashen. (250 ms pro Passwort)
- 1977 konnte auf einem VAX-11/780 die Krypta (MD5) etwa 3,6 Mal pro Sekunde ausgewertet werden. (277 ms pro Passwort)
Dies gibt Ihnen einen Eindruck von den Verzögerungen, die die ursprünglichen Implementierer beim Schreiben berücksichtigt haben:
- ~ 250 ms für normale Benutzer
- ~ 1 Sekunde für Superuser.
Aber je länger Sie stehen können, desto besser. Bei jeder BCrypt-Implementierung, die ich gesehen habe, wurden 10
als Standardkosten verwendet. Und meine Implementierung hat das genutzt. Ich glaube, es ist Zeit für mich, die Standardkosten auf 12 zu erhöhen.
Wir haben beschlossen, nicht weniger als 250 ms pro Hash anzuvisieren.
Mein Desktop-PC ist ein Intel Core i7-2700K CPU bei 3,50 GHz. Ich habe ursprünglich am 23.01.2014 eine BCrypt-Implementierung getestet:
23.01.2014 Intel Core i7-2700K CPU bei 3,50 GHz | Kosten | Iterationen | Dauer || ------ | ------------------- | ------------- || 8 | 256 Iterationen | 38,2 ms | <-- Minimum von BCrypt | erlaubt 9 | 512 Iterationen | 74,8 ms || 10 | 1.024 Iterationen | 152,4 ms | <-- aktueller Standard (BCRYPT_COST = 10) | 11 | 2.048 Iterationen | 296,6 ms || 12 | 4.096 Iterationen | 594,3 ms || 13 | 8.192 Iterationen | 1.169,5 ms || 14 | 16.384 Iterationen | 2.338,8 ms || 15 | 32.768 Iterationen | 4.656,0 ms |
| 16 | 65.536 Iterationen | 9.302,2 ms |
Zukunftssicherheit
Anstatt eine feste Konstante zu haben, sollte dies der Fall sein ein festes Minimum .
Anstatt Ihre Passwort-Hash-Funktion zu haben, lautet:
String HashPassword (String-Passwort) {return BCrypt.HashPassword (Passwort) , BCRYPT_DEFAULT_COST);}
Es sollte ungefähr so aussehen:
String HashPassword (String password) {/ * Anstatt feste Standardkosten zu verwenden, führen Sie es aus Ein Mikro-Benchmark, um herauszufinden, wie schnell die CPU ist. Verwenden Sie dies, um sicherzustellen, dass die Berechnung des Hash * / Int32 costFactor = this.CalculateIdealCost () ** mindestens ** 250 ms dauert; // Verwenden Sie niemals niedrigere Kosten als die fest codierten Standardkosten, wenn (costFactor < BCRYPT_DEFAULT_COST) costFactor = BCRYPT_DEFAULT_COST; return BCrypt.HashPassword (password, costFactor);} Int32 CalculateIdealCost () {// Benchmark mit Kosten von 5 (die zweitniedrigste zulässige) Int32 cost = 5; var sw = neue Stoppuhr (); sw.Start (); this.HashPassword ("microbenchmark", Kosten); sw.Stop (); Doppelte DauerMS = sw.Elapsed.TotalMilliseconds; // Eine Erhöhung der Kosten um 1 würde die Laufzeit verdoppeln. // Steige die Kosten weiter an, bis die geschätzte Dauer mehr als 250 ms beträgt, während (durationMS < 250) {cost + = 1; DauerMS * = 2; } Rückgabekosten;}
Und im Idealfall ist dies Teil der BCrypt-Bibliothek aller Benutzer. Anstatt sich darauf zu verlassen, dass Benutzer der Bibliothek die Kosten regelmäßig erhöhen, erhöhen sich die Kosten regelmäßig von selbst.