Frage:
Was ist der spezifische Grund, bcrypt oder PBKDF2 in Passwort-Hashes SHA256-crypt vorzuziehen?
ilkkachu
2016-08-08 17:21:17 UTC
view on stackexchange narkive permalink

Wir wissen, dass Passwörter nur in einem Hash-Format gespeichert werden sollten, um das Knacken von Passwörtern bei einem Leck in der Passwortdatenbank zu verlangsamen. Und nicht nur das, sondern auch eine starke und langsame Funktion mit der Möglichkeit, die Anzahl der Runden zu variieren.

Oft Algorithmen wie PBKDF2, bcrypt und scrypt werden hierfür empfohlen, wobei bcrypt anscheinend die lautesten Stimmen erhält, z hier, hier und hier.

Aber was ist mit den SHA256- und SHA512-basierten Hashes, die mindestens in glibc ( description, specation) implementiert sind und zumindest bei einigen Linux-Distributionen standardmäßig verwendet werden für reguläre Login-Konten? Gibt es einen Grund, sie nicht zu verwenden oder bcrypt gegenüber SHA-2-basierten Hashes zu bevorzugen?

Natürlich ist bcrypt deutlich älter (1999) und damit etablierter, aber die SHA-2-Hashes sind bereits neun Jahre alt (2007), und scrypt ist noch ein bisschen jünger (2009). scheint aber immer noch öfter erwähnt zu werden. Ist es nur eine akzeptierte Praxis oder gibt es einen anderen Grund? Gibt es bekannte Schwachstellen in den SHA-2-basierten Hashes oder hat jemand nachgesehen?

Hinweis: Ich speziell bedeuten die durch die verknüpften Dokumente beschriebenen und mit den Codes $ 5 $ und $ 6 $ in crypt gekennzeichneten mehrrunden Passwort-Hashes Code> Hashes, keine einzige Runde der einfachen SHA256- oder SHA512-Hash-Funktionen .

Ich habe die Frage gesehen, dass dies als mögliches Duplikat von markiert ist. In den Antworten dort werden die SHA256-Krypta / SHA512-Krypta-Hashes nicht erwähnt, wonach ich suche.

Mögliches Duplikat von [Wie werden Passwörter sicher gehasht?] (Http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords)
Die "Schwäche" in Hashes, die keine signifikanten Runden haben und nicht speicherintensiv sind, ist ihre Geschwindigkeit oder einfache Implementierung in eine GPU / spezielle Hardware.Hast du die Antworten gelesen, die du verlinkt hast?Sie sind besser als jede Antwort, die ich dir geben könnte.
@Oasiscircle, gut, die Spezifikation, die ich verknüpft habe, besagt "Die Standardanzahl von Runden für beide Algorithmen ist 5.000."und "Maximum für N = 999.999.999".Wenn das im Vergleich zu bcrypt nicht signifikant genug ist, würde ich das gerne als Antwort sehen.
SHA-Funktionen sind nicht so speicherintensiv wie Blowfish (mit dem bcrypt erstellt wurde) und können daher einfacher in einer GPU / speziellen Hardware parallelisiert werden.Das ist der Grund, warum mehr Runden mit SHA weitaus weniger wichtig sind als mehr Runden mit bcrypt.Nebenbei bemerkt, ich kann Ihr Spezifikationsdokument nicht von meinem aktuellen Standort aus anzeigen.
@ilkkachu Nein, iteriertes Hashing ist nicht gut genug.Angreifer können SHA parallel auf einer GPU ausführen und eine erhebliche Beschleunigung erzielen.SHA wird auch im Bitcoin-Mining verwendet, daher gibt es viele ASICs, die es brutal erzwingen können.
@Navin, und noch PBKDF2, das wahrscheinlich auf der SHA1- oder SHA2-Familie basiert, werden normalerweise als erste in der Liste der guten Kennwort-Hashing-Funktionen aufgeführt, wie in [hier] (http://security.stackexchange.com/a/31846/).118457), also noch einmal, die Frage ist, was ist der Unterschied hier?
@ilkkachu PBKDF2 kann mit jedem HMAC mit Schlüssel verwendet werden.Sie können mit SHA einen verschlüsselten HMAC erstellen, dies sollten Sie jedoch nicht in neuer Software tun!
@Navin, interessanter Hinweis zur Verwendung von SHA für das Bitcoin-Mining, aber meines Wissens sind die meisten ASICs für die Ausführung von "sha256 (sha256 (x))" ausgelegt, sodass ein Bitcoin-Mining-ASIC möglicherweise nicht allzu hilfreich ist.Es kann hilfreich sein, wenn mehrere Iterationen verwendet werden.(Wenn die Anzahl der Iterationen gerade ist, führen Sie alle Iterationen auf dem ASIC aus. Andernfalls führen Sie Floor-Iterationen (iterationCount / 2) auf dem ASIC und eine Iteration auf der GPU / CPU durch.) Dieser ASIC-Vorteil wird jedoch zunichte gemacht, wenn das Hashing-Schema etwas istwie `sha256 (sha256 (x) + Salt)`, da ein Mining-ASIC dem Digest zwischen der ersten und der zweiten Berechnung keine Daten hinzufügen kann.
@ilkkachu - Ich hatte das Gefühl, eine gute Antwort zu haben, aber andere sind anderer Meinung, das ist in Ordnung.Ich stimme einfach den 2 Kommentaren zu, die Seth oben am 8. August 16 gemacht hat.
Fünf antworten:
Thomas Pornin
2016-08-08 19:55:08 UTC
view on stackexchange narkive permalink

Der Hauptgrund für die Verwendung einer bestimmten Passwort-Hashing-Funktion besteht darin, Angreifern das Leben zu erschweren oder genauer zu verhindern, dass sie ihr eigenes Leben leichter machen (im Vergleich zu dem des Verteidigers). Insbesondere möchte der Angreifer möglicherweise mehr Hashes pro Sekunde (dh versuchen Sie mehr Kennwörter pro Sekunde) mit einem bestimmten Budget mithilfe einer GPU berechnen.

Insbesondere SHA-256 profitiert stark von der Implementierung auf einer GPU. Wenn Sie also SHA-256-crypt verwenden, sind Angreifer im Vorteil als wenn Sie bcrypt verwenden, das in einer GPU nur schwer effizient zu implementieren ist.

Siehe diese Antwort für eine Diskussion von bcrypt vs PBKDF2. Obwohl SHA-256-crypt nicht PBKDF2 ist, ist es in seinem Leistungsverhalten auf der GPU ähnlich genug, sodass die gleichen Schlussfolgerungen gelten.

Der Fall für SHA-512 ist etwas weniger klar, da vorhandene GPUs viel besser sind Bei Verwendung von 32-Bit-Ganzzahlen als 64-Bit verwendet SHA-512 hauptsächlich 64-Bit-Operationen. Es wird weiterhin erwartet, dass moderne GPUs mit SHA-512-crypt mehr Hashes pro Sekunde als CPU (für ein bestimmtes Budget) zulassen, was wiederum auf bcrypt als die bessere Wahl hinweist.

"Obwohl SHA-256-crypt nicht PBKDF2 ist, ist es in seinem Leistungsverhalten auf der GPU ähnlich genug, sodass die gleichen Schlussfolgerungen gelten."- genau das habe ich gesucht.
Bei Brute-Force-Angriffen kann dies durch Hinzufügen eines einzigen Zeichens zum Kennwort ausgeglichen werden.Und bereits durch zwei Charaktere überkompensiert.
Bryan Field
2016-08-08 19:50:49 UTC
view on stackexchange narkive permalink

Die SHA-2-Familie von Hashes wurde so konzipiert, dass sie schnell ist. BCrypt wurde entwickelt, um langsam zu sein. Beide gelten als robust. Mit genügend Runden oder Arbeitsfaktor kann eine länger dauern als die andere, aber ich würde mich zu der neigen, die so konzipiert wurde, dass sie langsam ist. (Wenn die Serverlast ein Problem darstellt, ist der Arbeitsfaktor anpassbar.)

Außerdem würde ich mich zu BCrypt neigen, da es sich normalerweise um eine kompilierte Implementierung (C oder C ++) handelt.

Das Multi -round SHA kann leicht in einer höheren Sprache implementiert werden, zumindest für die Iteration, wenn nicht auch für den Hash selbst. Hochsprachen sind für grundlegende mathematische Operationen weniger effizient und reduzieren die Anzahl der Runden, die Ihre Produktionshardware pro Millisekunde ausführen kann.

Beide Algorithmen können entweder in Hoch- oder Niedrigsprachen oder in einem Hybrid implementiert werden. In BCrypt schreiben die verfügbaren Optionen vor, dass Sie eher auf eine effiziente Implementierung stoßen . (bringt Sie mit dem Angreifer auf ein ausgeglicheneres Spielfeld)

In Bezug auf Ihr spezielles Beispiel aus der Datei / etc / shadow befinden Sie sich wahrscheinlich nur auf niedriger Ebene ( effiziente) Algorithmen so oder so. (SHA oder BCrypt) In diesem Beispiel würde ich vorschlagen, dass Sie die Dokumentation des Betriebssystems konsultieren, um die Runden (Arbeitsfaktor) basierend auf der Geschwindigkeit der Hardware zu optimieren - vs- wie stark der Hash sein soll

Verschlüsselung (mit einem ausreichend großen Arbeitsfaktor) bietet den zusätzlichen Vorteil, dass zusätzliche RAM- / Speicheranforderungen (nicht nur CPU) erforderlich sind, wodurch die GPU-Beständigkeit erhöht wird als SHA, BCrypt oder PBKDF2.

Bearbeiten: Vielen Dank an Thomas für den Hinweis, dass BCrypt GPU-resistenter als SHA-2 ist und dass SHA-2 und PBKDF2 praktisch sind gleichwertig in dieser Hinsicht.

Es ist zu beachten, dass bei der Verschlüsselung eine konfigurierbare Speichermenge verwendet wird, die davon abhängt, wie schnell sie abgeschlossen sein muss.Wenn Sie scrypt auf einem ausgelasteten Authentifizierungsserver verwenden und innerhalb von weniger als 5 ms einen Kennwort-Hash berechnen müssen, kann scrypt nicht viel RAM verwenden und erweist sich als _less_ GPU-resistent als bcrypt.Scrypt war eigentlich für die Festplattenverschlüsselung gedacht (also 1 bis 5 Sekunden Rechenzeit);es ist nicht unbedingt für alle anderen Situationen geeignet.Dies war in der Tat der Grund für den [Password Hashing Competition] (https://password-hashing.net/).
Ich denke, Implementierungsdetails sind eine etwas andere Frage als die Frage nach den relativen Vorzügen der Algorithmen, und sie wären auch systemabhängig.z.B.Unter OpenBSD wird sehr wahrscheinlich "$ 2y $" von der libc des Systems unterstützt, aber nicht unter allen Linux-Systemen.Was die Bibliotheken der gängigen Programmiersprachen betrifft, so hoffe ich, dass sie C-Implementierungen von _jedem_ (Passwort-) Hashes haben, die sie unterstützen, aber ich kann nicht sicher sein, ohne dies zu überprüfen.
Ein Teil Ihrer Frage * "Gibt es einen Grund, sie nicht zu verwenden" * hängt sehr davon ab, wie gut sie implementiert wurde.SHA-256 wurde nicht als "Passwort-Hash" konzipiert, daher sind sprachspezifische Bibliotheken möglicherweise nicht so stark gezwungen, es in nativem C zu implementieren. Dies erleichtert auch die Installation für bestimmte Benutzer, für die nicht die richtigen Compiler eingerichtet sind.Außerdem ist es für Entwickler verlockend, eine eigene Iteration für Runden zu schreiben.Ich möchte Implementierungsdetails in eine Antwort aufnehmen, um zu verhindern, dass zukünftige Besucher zu einer Schlussfolgerung gelangen.
Luis Casillas
2016-08-09 03:50:33 UTC
view on stackexchange narkive permalink

Hinweis: Ich betrachte diese Frage nach dieser Bearbeitung und berücksichtige sie:

Hinweis: Ich meine speziell die Mehrrunden-Passwort-Hashes, die in den verknüpften Dokumenten beschrieben und in Krypto-Hashes mit den Codes $ 5 $ und $ 6 $ gekennzeichnet sind, nicht eine einzige Runde der einfachen SHA256- oder SHA512-Hash-Funktionen.


Wenn Sie sich den langen 22-Schritte-Algorithmus in diesem Link ansehen, den Sie bereitgestellt haben, möchte ich lieber eine Frage umdrehen: Warum sollten Sie diesen Algorithmus lieber anstelle von PBKDF2 mit HMAC-SHA2? Zumindest wie dargestellt:

  • Die Definition von PBKDF2 sieht viel einfacher aus. Dies liegt daran, dass es modularer ist - es verschiebt den größten Teil seiner Arbeit auf ein externes gelieferte Pseudozufallsfunktion. Dies wird normalerweise mit HMAC instanziiert, was wiederum den größten Teil seiner Arbeit auf eine externe Hash-Funktion wie SHA-1 oder SHA-2 verschiebt.
  • Dies bedeutet, dass die Sicherheit von PBKDF2 sollte einfacher zu analysieren sein.

Im Gegensatz dazu listet der Algorithmus in dem von Ihnen bereitgestellten Dokument eine Menge Schritte auf, deren Motivation schwerer zu verstehen ist. Zum Beispiel:

  11. Für jedes Bit der binären Darstellung der Länge der Kennwortzeichenfolge bis einschließlich der höchsten 1-stelligen Zahl, beginnend mit der niedrigsten Bitposition (numerischer Wert 1): a) Fügen Sie für eine 1-stellige Zusammenfassung Digest B zu Digest A b hinzu ) Fügen Sie für eine 0-stellige Kennwortzeichenfolge hinzu. Hinweis: Dieser Schritt unterscheidet sich erheblich vom MD5-Algorithmus. Es fügt mehr Zufälligkeit hinzu.  

Es fügt mehr Zufälligkeit hinzu? Wie macht es das? Warum gibt es diesen Schritt überhaupt - fügt SHA-2 nicht genügend Zufälligkeit hinzu? Wenn SHA-2 nicht zufällig genug ist, warum sollte es überhaupt verwendet werden? Und führt dieser Schritt nicht geheime abhängige Verzweigung in den Algorithmus ein und wirft die Frage nach möglichen Timing-Angriffen gegen ihn auf?

Ich sage keineswegs, dass die von Ihnen verknüpften Algorithmen unsicher sind. Es ist nur so:

  • Der von ihnen eingeführte Arbeitsfaktor hängt von der gleichen Funktion ab, die PBDKF2 - HMAC-SHA2 ausführen würde (eine große Anzahl von SHA2-Iterationen).
  • Sie ähneln weitgehend dem, was Sie hätten Wenn Sie eine PBKDF2-HMAC-SHA2-Implementierung abgewickelt haben, aber mit zusätzlicher Komplexität, deren Zweck ich nicht verstehe;
  • Also zumindest wie in diesen Dokumenten dargestellt, fällt es mir schwerer Vertrauen in ihr Design zu gewinnen als ich für PBKDF2.
hr>

BEARBEITEN: Nachdem ich das alles geschrieben hatte, ging ich ein bisschen in diesen Algorithmus, um ihn besser zu verstehen. Zunächst erfahren wir aus den Links "Beschreibung" und "Spezifikation" der Frage, dass der Algorithmus durch relativ geringfügige Änderungen von einem älteren MD5-basierten abgeleitet wurde / p>

Dieser ältere MD5-basierte Algorithmus scheint der zu sein, den Poul-Henning Kamp 1994 für FreeBSD-2.0 geschrieben hat, den er nicht mehr für sicher hält. Im ersten Link (wo er die Geschichte der Funktion erzählt) erwähnt er, dass glibc auch seine Funktion übernommen hat. Er verweist auch auf das Papier von Provos und Mazières aus dem Jahr 1999 über bcrypt und erwähnt, dass es etwas Missbilligung ausdrückt, und komischerweise haben sie denselben Schritt hervorgehoben, der meine Aufmerksamkeit oben erregt hat:

MD5 crypt hascht das Kennwort und das Salt in verschiedenen Kombinationen, um die Auswertungsgeschwindigkeit zu verlangsamen. Einige Schritte im Algorithmus lassen Zweifel daran aufkommen, dass das Schema unter kryptografischen Gesichtspunkten entworfen wurde. Beispielsweise bestimmt die binäre Darstellung der Kennwortlänge zu einem bestimmten Zeitpunkt, welche Daten gehasht werden, für jedes Nullbit das erste Byte des Kennworts und für jedes gesetzte Bit das erste Byte einer vorherigen Hash-Berechnung.

Aber ich denke, dies erklärt die Motivation der neueren Funktionen, nach denen Sie fragen: Sie sind eine sehr minimale Modifikation einer älteren Funktion, die älter ist als die meisten modernen Passwort-Hash-Funktionen, deren Design in Frage gestellt wurde, aber wahrscheinlich nicht grundlegend gebrochen, nur sinnlos komplex.

Ich habe mich auch über die leicht verwickelte Struktur gewundert, obwohl wir den Autor danach fragen müssten.Vielen Dank, dass Sie sich tatsächlich mit der Funktion befasst haben, auf die ich mich bezog. Ich bin der Meinung, dass sie unbekannter ist, als ich angenommen habe.Wie gesagt, es ist der Standard-Passwort-Hash für einige Linux-Systeme, daher habe ich mich nicht dafür entschieden, ihn per se zu verwenden, aber es macht es etwas interessant, mehr darüber zu erfahren.(Die von Ihnen zitierte Notiz war aus einem bestimmten Grund von Anfang an in der Frage.)
@ilkkachu: Ich habe meine Antwort mit zusätzlichem Material aktualisiert, das Sie vielleicht lesen möchten.
Spencer D
2016-08-08 23:41:35 UTC
view on stackexchange narkive permalink

Die SHA-2-Familie selbst ist nicht unbedingt schlecht. Von Natur aus gibt es keine wirklichen Sicherheitslücken, die bcrypt oder scrypt vorzuziehen machen. Das Problem, das viele Sicherheitsexperten mit SHA haben, ist jedoch, dass es zu schnell ist und nicht viel Speicher benötigt. Im Vergleich dazu ist eine Hashing-Funktion wie das Verschlüsseln sozusagen viel langsamer und teurer.

Das Verschlüsseln erfordert eine angemessene Menge an Speicher, um berechnet zu werden. Zusätzlich zu all diesem Speicher und vor allem aufgrund des Bedarfs an Speicher benötigt Scrypt im Vergleich zu SHA viel Rechenzeit. Diese Antwort von der BitCoin Stack Exchange-Site fasst die Vorteile von scrypt recht gut zusammen: Welche Funktionen von scrypt () machen Tenebrix GPU-resistent? Im Wesentlichen ist scrypt so konzipiert, dass es langsam und speicherintensiv ist. GPUs mögen das nicht. GPUs verfügen im Allgemeinen nicht über die Speicherkapazität, um den gesamten für die Verschlüsselungsberechnung erforderlichen Speicher zu speichern, ohne auf Ausführungsblockierungsmethoden zurückgreifen zu müssen ( wobei die GPU alle Threads blockiert, da sie nur Werte aus dem gemeinsam genutzten Speicher abrufen kann Zeit ), und daher können GPUs in Bezug auf die Verarbeitungszeit keinen großen Vorteil gegenüber CPUs bieten. Bcrypt ist ähnlich.

Bcrypt hat sich beim Passwort-Hashing bewährt. Es gibt es seit 17 Jahren und es erledigt immer noch die Arbeit. Eines Tages wird die GPU-Technologie jedoch so weit fortgeschritten sein, dass sie bcrypt schneller und effizienter berechnen kann als eine CPU. Die Technologie entwickelt sich ständig weiter und wird sich irgendwann weiterentwickeln. Wenn dieser Tag kommt, wird bcrypt keine gute Wahl mehr für das Hashing von Passwörtern sein, und Kryptographen und Sicherheitsexperten müssen bcrypt durch einen ähnlichen Algorithmus ersetzen, der langsamer und speicherintensiver als der vorhandene bcrypt ist. Vielleicht wird das verschlüsselt, aber wer soll das sagen? Warum ist SHA verpönt?

SHA wird im Allgemeinen nicht aufgrund von Sicherheitslücken, sondern aufgrund der Geschwindigkeit und der Fähigkeit, auf einer GPU implementiert zu werden, nicht empfohlen. Jemand mit unbegrenzter Maschinen- / Rechenleistung könnte jede Art von Hashing-Algorithmus knacken, sei es SHA, bcrypt oder scrypt, aber das ist theoretisch. In der Praxis verfügt ein Angreifer nicht über eine unbegrenzte Anzahl von Computern, auf denen er versuchen kann, Hashes zu knacken. Je mehr Sie diesen Angreifer verlangsamen können, desto schwieriger wird es für ihn, ein Kennwort zu knacken. Es gibt ein Budgetlimit für alles und das Knacken von Passwörtern ist keine Ausnahme. Der Angreifer kann Passwörter nur so schnell knacken, wie es sein Budget zulässt. ( Die beste Technologie, die sie innerhalb ihres Budgets erwerben können, die Kosten für den Betrieb dieser Technologie (z. B. Stromkosten) usw. ) Natürlich können Sie mehrere SHA-Runden implementieren, um einen Angreifer erheblich zu verlangsamen , aber warum nicht einfach an diesem Punkt bcrypt verwenden? Mit dem Fortschritt der GPU-Technologie in naher Zukunft müssen Sie Ihren SHA-Berechnungen unter anderem immer mehr Runden / Iterationen hinzufügen, um sie so langsam zu machen, dass sie langsamer als bcrypt ist. Mit dem Fortschritt der GPU-Technologie bleibt bcrypt jedoch unphasiert, bis zu dem Punkt, an dem die GPU-Technologie eine effiziente Berechnung von bcrypt ermöglicht. Daher ist bcrypt nach Möglichkeit die bevorzugte Wahl, nicht weil SHA unsicher ist, sondern weil SHA zu recheneffizient ist.

`scrypt` und` sha256crypt` sind völlig getrennte Dinge.
Und sha56crypt und (iteriertes) sha256 sind ebenfalls sehr unterschiedlich.sha256crypt, wie es von libc verwendet wird, ist ein Chaos
Serge Ballesta
2016-08-08 18:29:05 UTC
view on stackexchange narkive permalink

Nun, eines der Merkmale von bcrypt ist, dass es sich um einen sehr langsamen Algorithmus handelt. Diese Langsamkeit bietet eine zusätzliche Sicherheit für Brute-Force-Angriffe. Aus dem gleichen Grund ist es möglicherweise nicht die beste Lösung, zum Beispiel für stark genutzte Webserver, da hier ein hoch aufgeladener Computer diese schwere Berechnung bei jedem Login durchführen muss.

Aber solange Ihr System kann akzeptieren, dass zusätzliche Zeit Brute-Force-Angreifer tatsächlich stört.

`sha256crypt` ist auch ein langsamer Hash.
Warum sollte jemand einen Chiffrieralgorithmus langsam entwerfen (Blowfish)?
@eckes Es ist der Schlüsselplan von Blowfish, der langsam ist, nicht der Rest der Chiffre.Der Schlüsselzeitplan ist ein einmaliger Einrichtungsaufwand, der bei jeder Verwendung eines neuen Schlüssels anfällt und etwa 521 Verschlüsselungen entspricht.Bcrypt extrahiert diesen Schlüsselplan und ändert ihn ein wenig, um ihn als KDF nützlicher zu machen.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...