SHA512 vs. Blowfish und Bcrypt [geschlossen]

222

Ich schaue mir Hashing-Algorithmen an, konnte aber keine Antwort finden.

  • Bcrypt verwendet Blowfish
  • Blowfish ist besser als MD5
  • F: Aber ist Blowfish besser als SHA512?

Vielen Dank..

Aktualisieren:

Ich möchte klarstellen, dass ich den Unterschied zwischen Hashing und Verschlüsselung verstehe. Was mich dazu veranlasst hat, die Frage auf diese Weise zu stellen, ist dieser Artikel , in dem der Autor bcrypt als "adaptives Hashing" bezeichnet.

Da bcrypt auf Blowfish basiert, wurde ich zu der Annahme gebracht, dass Blowfish ein Hashing-Algorithmus ist. Wenn es sich um eine Verschlüsselung handelt, wie die Antworten gezeigt haben, scheint es mir, dass sie keinen Platz in diesem Artikel haben sollte. Schlimmer ist, dass er zu dem Schluss kommt, dass bcrypt das Beste ist. Was mich jetzt auch verwirrt, ist, dass die Phpass-Klasse (die meiner Meinung nach für das Hashing von Passwörtern verwendet wird) bcrypt verwendet (dh Blowfish, dh Verschlüsselung). Basierend auf diesen neuen Informationen, die ihr mir erzählt (Blowfish ist Verschlüsselung), klingt diese Klasse falsch. Vermisse ich etwas

Chris
quelle
2
Es ist nicht falsch; In den Aktualisierungen meiner Antwort finden Sie eine Erklärung, wie bcrypt funktioniert und warum es denselben Zweck erfüllt wie ein Hash-basierter "Einweg" -Algorithmus.
Erickson
3
bcrypthat einfach standardmäßig einen höheren "Arbeitsfaktor". Es wird davon ausgegangen, dass SHA nicht ... es sei denn, Sie verwenden passhash9, das entweder zusammen mit einem Arbeitsfaktor verwendet werden kann. Warum ist diese Frage geschlossen? es ist alles andere als beantwortet, aber sehr wichtig.
1
Link in Frage ist unten ...............
Pacerier

Antworten:

320

Es sollte genügen zu sagen, ob bcrypt oder SHA-512 (im Kontext eines geeigneten Algorithmus wie PBKDF2) gut genug ist . Und die Antwort lautet: Ja, jeder Algorithmus ist sicher genug, dass ein Verstoß durch einen Implementierungsfehler und nicht durch eine Kryptoanalyse auftritt.

Wenn Sie darauf bestehen zu wissen, was "besser" ist, hat SHA-512 eingehende Überprüfungen durch NIST und andere erhalten. Es ist gut, aber es wurden Fehler erkannt, die, obwohl sie jetzt nicht ausnutzbar sind, zum SHA-3-Wettbewerb um neue Hash-Algorithmen geführt haben. Denken Sie auch daran, dass das Studium von Hash-Algorithmen "neuer" ist als das von Chiffren, und Kryptografen noch etwas über sie lernen.

Obwohl bcrypt als Ganzes nicht so genau unter die Lupe genommen wurde wie Blowfish selbst, glaube ich, dass die Verwendung einer Verschlüsselung mit einer gut verstandenen Struktur eine gewisse Sicherheit bietet, die der Hash-basierten Authentifizierung fehlt. Es ist auch einfacher, gängige GPUs als Werkzeug für den Angriff auf SHA-2-basierte Hashes zu verwenden. Aufgrund des Speicherbedarfs erfordert die Optimierung von bcrypt speziellere Hardware wie FPGA mit etwas integriertem RAM.


Hinweis: bcrypt ist ein Algorithmus, der Blowfish intern verwendet. Es ist selbst kein Verschlüsselungsalgorithmus. Es wird verwendet, um Passwörter irreversibel zu verschleiern, genauso wie Hash-Funktionen verwendet werden, um einen "Einweg-Hash" durchzuführen.

Kryptografische Hash-Algorithmen sind so konzipiert, dass sie nicht rückgängig gemacht werden können. Mit anderen Worten, wenn nur die Ausgabe einer Hash-Funktion gegeben ist, sollte es "ewig" dauern, bis eine Nachricht gefunden wird, die dieselbe Hash-Ausgabe erzeugt. Tatsächlich sollte es rechnerisch unmöglich sein, zwei beliebige Nachrichten zu finden, die denselben Hashwert erzeugen. Im Gegensatz zu einer Chiffre werden Hash-Funktionen nicht mit einem Schlüssel parametrisiert. Der gleiche Eingang erzeugt immer den gleichen Ausgang.

Wenn jemand ein Kennwort bereitstellt, das mit dem in der Kennworttabelle gespeicherten Wert übereinstimmt, wird er authentifiziert. Insbesondere aufgrund der Irreversibilität der Hash-Funktion wird angenommen, dass der Benutzer kein Angreifer ist, der den Hash ergriffen und umgekehrt hat, um ein funktionierendes Passwort zu finden.

Betrachten Sie nun bcrypt. Es verwendet Blowfish, um eine magische Zeichenfolge mit einem vom Kennwort "abgeleiteten" Schlüssel zu verschlüsseln. Wenn ein Benutzer später ein Kennwort eingibt, wird der Schlüssel erneut abgeleitet. Wenn der durch Verschlüsselung mit diesem Schlüssel erzeugte Chiffretext mit dem gespeicherten Chiffretext übereinstimmt, wird der Benutzer authentifiziert. Der Chiffretext wird in der Tabelle "Passwort" gespeichert, der abgeleitete Schlüssel wird jedoch nie gespeichert.

Um die Kryptographie hier zu brechen, müsste ein Angreifer den Schlüssel aus dem Chiffretext wiederherstellen. Dies wird als "bekannter Klartext" -Angriff bezeichnet, da der Angriff die verschlüsselte magische Zeichenfolge kennt, jedoch nicht den verwendeten Schlüssel. Blowfish wurde ausführlich untersucht, und es sind noch keine Angriffe bekannt, die es einem Angreifer ermöglichen würden, den Schlüssel mit einem einzigen bekannten Klartext zu finden.

Genau wie bei irreversiblen Algorithmen, die auf kryptografischen Digests basieren, erzeugt bcrypt eine irreversible Ausgabe aus einem Kennwort, einem Salt und einem Kostenfaktor. Seine Stärke liegt in der Beständigkeit von Blowfish gegen bekannte Klartextangriffe, die einem "ersten Pre-Image-Angriff" auf einen Digest-Algorithmus entspricht. Da bcrypt anstelle eines Hash-Algorithmus zum Schutz von Passwörtern verwendet werden kann, wird es verwirrenderweise selbst als "Hash" -Algorithmus bezeichnet.

Unter der Annahme, dass Regenbogentabellen durch die richtige Verwendung von Salz vereitelt wurden, reduziert jede wirklich irreversible Funktion den Angreifer auf Versuch und Irrtum. Und die Rate, mit der der Angreifer Versuche durchführen kann, wird durch die Geschwindigkeit dieses irreversiblen "Hash" -Algorithmus bestimmt. Wenn eine einzelne Iteration einer Hash-Funktion verwendet wird, kann ein Angreifer mit Geräten, die in der Größenordnung von 1000 US-Dollar kosten, Millionen von Versuchen pro Sekunde durchführen und alle Passwörter mit einer Länge von bis zu 8 Zeichen in wenigen Monaten testen.

Wenn die Digest-Ausgabe jedoch tausende Male "zurückgemeldet" wird, dauert es Hunderte von Jahren, um denselben Satz von Kennwörtern auf dieser Hardware zu testen. Bcrypt erzielt den gleichen "Schlüsselverstärkungseffekt", indem es innerhalb seiner Schlüsselableitungsroutine iteriert, und eine geeignete Hash-basierte Methode wie PBKDF2 macht dasselbe. In dieser Hinsicht sind die beiden Methoden ähnlich.

Meine Empfehlung für bcrypt beruht also auf den Annahmen 1), dass ein Blowfish ein ähnliches Maß an Kontrolle hatte wie die SHA-2-Familie von Hash-Funktionen, und 2) dass kryptoanalytische Methoden für Chiffren besser entwickelt sind als solche für Hash-Funktionen.

erickson
quelle
4
+1 toller Beitrag. Aber ich habe zwei Fragen. Blowfish wurde vor mehr als einem Jahrzehnt durch Twofish ersetzt. Sollte ein System nicht moderne Primitive verwenden? Außerdem scheinen Tausende von Iterationen in Systemen wie Webanwendungen, in denen sich viele Personen zu einem bestimmten Zeitpunkt anmelden, verschwenderisch zu sein. Beispielsweise wird PBKDF2 nur in Szenarien implementiert, in denen sich jeweils eine Person anmeldet, z. B. eine string2key-Funktion für ein verschlüsseltes Dateisystem. Ich benutze das Sprichwort "Wenn es zu schwer für den Angreifer ist, um es zu heben, dann ist es zu schwer für Ihren Server." Was denken Sie?
Turm
17
Ich glaube nicht, dass etwas falsch daran ist, ein moderneres Primitiv zu verwenden. Sicherheitslücken werden oft im Laufe der Zeit entdeckt, und Twofish wurde unter Verwendung des Wissens von Blowfish entwickelt. Mir sind jedoch keine spezifischen Sicherheitslücken bekannt, die die Verwendung von Blowfish ungültig machen würden. Daher könnte auch ein Argument "Wenn es nicht kaputt ist" vorgebracht werden. Ihr Sprichwort über Angreifer klingt für mich nicht gut. Selbst wenn Sie einen Algorithmus wählen, für den ein Angreifer Jahre benötigt, um eine Milliarde Passwörter zu testen, wird er in einer legitimen Anwendung einen vernachlässigbaren Teil der Zeit in Anspruch nehmen.
Erickson
15
Wenn Sie sich die Spezifikation einer Hash-Funktion ansehen, werden Sie nichts über "Salz" sehen. Der einzige Parameter ist die zu verdauende Nachricht. Überprüfen Sie die Spezifikation einer beliebigen Verschlüsselung, und Sie werden sehen, dass die Funktion mit einem Schlüssel parametrisiert wird. Das "Salz", das in Verbindung mit einem Hash verwendet werden kann (oder nicht ), ist einfach Teil der Nachricht. Der Hash-Algorithmus benötigt es nicht, behandelt es nicht speziell und kann es nicht vom Rest der Nachricht unterscheiden. Während es wahr ist, dass Nachrichten häufig durch Salting geändert werden, erzeugt eine bestimmte Nachricht nur einen Hash.
Erickson
1
@Andre D Als Pentester melde ich Anwendungen, die Konten sperren, und ich melde Anwendungen, die nicht gegen Brute Force verhindern. Im Idealfall muss eine fehlerhafte IP-Adresse ein Captcha lösen. Wenn ein Benutzername als Ziel ausgewählt wird (auch wenn dieser Benutzername nicht vorhanden ist), sollte dieses Konto vor der Authentifizierung ein Captcha lösen. Das Erzwingen eines Grenzwerts von X pro Minute ist ebenfalls akzeptabel. Siehe auch: security.stackexchange.com/questions/25444/…
Turm
2
@rook: Während das Ratelimiting von Anwendungen eine gute Praxis ist, können Sie in diesem Fall davon ausgehen, dass die Datenbank heruntergeladen und auf Geräten abgelegt wurde, die nicht das von Ihnen beschriebene Ratenlimit haben.
Ellert van Koperen
50

Ich stimme der Antwort von erickson mit einer Einschränkung zu: Für die Kennwortauthentifizierung ist bcrypt weitaus besser als eine einzelne Iteration von SHA-512 - einfach weil es viel langsamer ist. Wenn Sie nicht verstehen, warum Langsamkeit in diesem speziellen Spiel von Vorteil ist, lesen Sie den Artikel, auf den Sie erneut verlinkt haben (scrollen Sie nach unten zu " Geschwindigkeit ist genau das, was Sie in einer Passwort-Hash-Funktion nicht wollen ").

Sie können natürlich einen sicheren Passwort-Hashing-Algorithmus um SHA-512 herum erstellen, indem Sie ihn tausende Male wiederholen, genau wie der MD5-Algorithmus von PHK funktioniert. Ulrich Drepper hat genau das für glibcs ​​Krypta getan (). Es gibt jedoch keinen besonderen Grund, dies zu tun, wenn Sie bereits eine getestete bcrypt-Implementierung zur Verfügung haben.

caf
quelle
3
Hoffentlich macht meine Antwort deutlich, dass eine einzelne Hash-Iteration nicht ausreicht (leider kann auch dieser rudimentäre Wissensstand nicht angenommen werden). "Wenn eine einzelne Iteration einer Hash-Funktion verwendet wird, kann ein Angreifer mit Geräten, die in der Größenordnung von 1000 US-Dollar kosten, Millionen von Versuchen pro Sekunde durchführen und alle Passwörter mit einer Länge von bis zu 8 Zeichen in wenigen Monaten testen. Wenn jedoch die Digest-Ausgabe erfolgt wird tausende Male "zurückgemeldet", es wird Hunderte von Jahren dauern, bis derselbe Satz von Passwörtern auf dieser Hardware getestet wurde. Bcrypt erzielt den gleichen "Schlüsselverstärkungseffekt" durch Iteration ... "
erickson
@erickson: Ja, obwohl ich denke, dass Sie die Lede dort begraben haben könnten. Der Punkt, den ich ansprechen wollte, ist, dass ein direkter Vergleich von bcrypt und SHA-512 nicht wirklich relevant ist, da eine eine Schlüsselableitungsfunktion ist und die andere nur ein kryptografisches Grundelement, das für sich genommen ungeeignet ist.
Café
1
Die Verwendung von Tausenden von SHA-512-Runden ist keine Seltenheit und wird in verschiedene cryptImplementierungen (einschließlich PHP, die ich verwende) aufgenommen. Als ich die ursprüngliche Frage las, ging ich sogar davon aus, dass das OP dies bedeutete, als er nach SHA-512 fragte - dass er sich tatsächlich auf Tausende von Runden von SHA-512 gegen bcrypt bezog, die selbst Hunderte oder Tausende von Iterationen verwenden.
Thomasrutter
33

Blowfish ist kein Hashing-Algorithmus. Es ist ein Verschlüsselungsalgorithmus. Das bedeutet, dass Sie etwas mit Blowfish verschlüsseln und später wieder in einfachen Text entschlüsseln können.

SHA512 ist ein Hashing-Algorithmus. Das bedeutet, dass Sie (theoretisch) nach dem Hash der Eingabe die ursprüngliche Eingabe nicht mehr zurückerhalten können.

Es sind zwei verschiedene Dinge, die für verschiedene Aufgaben entwickelt wurden. Es gibt keine 'richtige' Antwort auf "Ist Blowfish besser als SHA512?" Sie könnten genauso gut fragen: "Sind Äpfel besser als Kängurus?"

Wenn Sie mehr über das Thema erfahren möchten, finden Sie hier einige Links:

Tal
quelle
18
Ich denke, die Frage betrifft die Verwendung von bcrypt als irreversiblen Schutz für Passwörter, ähnlich wie Hashing für diesen Zweck verwendet wird.
erickson
3
@erickson der Text "F: aber ist Blowfish besser als SHA512?" scheint mir ziemlich klar zu sein und zeigt, dass das OP die Unterschiede zwischen den beiden Algorithmen nicht versteht
Glen
1
OP hier. Basierend auf Glen's Antwort, dass Blowfish ein Verschlüsselungsalgorithmus ist (von dem ich verstehe, dass er sich vom Hashing unterscheidet), stelle ich jetzt fest, dass meine Frage Ja verwirrt war. Was jetzt jedoch verwirrend ist, ist, dass die Phpass-Klasse (die meiner Meinung nach für das Hashing von Passwörtern verwendet wird) bcrypt verwendet (dh Blowfish, dh Verschlüsselung). Wenn Blowfish Verschlüsselung ist, wie kommt es, dass Phpass es verwendet, um Passwörter zu hashen, scheint mir ein Fehler zu sein, nein? Vermisse ich etwas
Chris
2
Die Frage ist jedoch, welche Äpfel und Kängurus für eine bestimmte Aufgabe besser geeignet sind. Blowfish ist aufgrund der Zeit, die zum Hashing benötigt wird, eine bessere Hashing-Funktion als sha. Die meisten Implementierungen von sha, die ich gesehen habe, sind sehr schnell. Sie möchten einen langsamen Algorithmus für das Passwort-Hashing.
John Nicholas
Diese Antwort ist richtig, dass Blowfish ein Verschlüsselungsalgorithmus ist, aber in diesem Kontext (z. B. wenn in verwendet bcrypt) wird er als Hashing-Algorithmus verwendet, indem ein Schlüssel aus der Quellzeichenfolge abgeleitet und damit eine magische Zahl verschlüsselt wird. Dies macht es irreversibel, im Wesentlichen eine Hashing-Funktion. Sie können den Schlüssel nicht aus einer Chiffre berechnen, selbst wenn Sie den Klartext und die verschlüsselten Daten kennen.
Thomasrutter
4

Blowfish ist nicht besser als MD5 oder SHA512, da sie unterschiedlichen Zwecken dienen. MD5 und SHA512 sind Hashing-Algorithmen, Blowfish ist ein Verschlüsselungsalgorithmus. Zwei völlig unterschiedliche kryptografische Funktionen.

Blasrohrpfeil
quelle
2

Ich würde Ulrich Dreppers SHA-256 / SHA-512-basierte Krypta-Implementierung empfehlen.

Wir haben diese Algorithmen nach Java portiert. Eine frei lizenzierte Version finden Sie unter ftp://ftp.arlut.utexas.edu/java_hashes/ .

Beachten Sie, dass die meisten modernen (L) Unices den Drepper-Algorithmus in ihren / etc / shadow-Dateien unterstützen.

Jonathan Abbey
quelle
PWDTK sourceforge.net/projects/pwdtknet verwendet HMAC-SHA512, jedoch über viele Iterationen hinweg, um "Langsamkeit", auch bekannt als Key Stretching, zu erzeugen, wie andere hier bereits erwähnt haben. BCrypt ist besser als ein einzelner SHA-512, wie bereits erwähnt wurde. Wenn Sie jedoch SHA-512 in etwas wie PBKDF2 verwenden, sind Sie gut sicher (solange Sie ein großes kryptozufälliges Salz und genügend Iterationen verwenden, um Zeit zu erzwingen Machen Sie eine Regenbogentabelle) Die API, die ich gerade gepostet habe, wurde von mir erstellt und wird das tun, was Sie in .NET wollen, wenn Sie dafür entwickeln (für zukünftige Leser profitieren)
Thashiznets
2

Ich bin gerade darauf gestoßen:

http://codahale.com/how-to-safely-store-a-password/

Kann der Autor dieses Artikels falsch liegen?

verschwunden
quelle
2
Es ist nicht so, dass er sich irrt, es ist nur so, dass er eine Fülle von Literatur über die Anwendung von Hash-Algorithmen ignoriert, nämlich. Sie sollten iterativ in Schlüsselableitungsfunktionen verwendet werden, genau wie bcrypt.
Erickson