Frage:
Warum nicht Hashes mischen?
Peter
2015-07-12 20:18:59 UTC
view on stackexchange narkive permalink

Um das Targeting von Hashes durch spezielle Hardware zu erschweren, stelle ich mir intuitiv vor, dass das Mischen verschiedener Hash-Algorithmen zusätzliche Stärke bieten sollte. Nehmen wir zur Vereinfachung an, Hash1 ist eine Anzahl von Iterationen von SHA256 , Hash2 ist bcrypt und Hash3 ist scrypt :

  myhash = Hash1 (Hash2 (Hash3 (0, Passwort, Salz), Passwort, Salz), Passwort, Salz)  

Angenommen, Hash1 , Hash2 und Hash3 benötigen jeweils 1/3 Sekunden, um auf der Hardware eines typischen Benutzers zu berechnen. Warum scheint es bevorzugt zu sein,

  myhash = Hash1 (Hash1 (Hash1 (0, Passwort, Salz), Passwort, Salz), Passwort, Salz)   pre zu verwenden > 

BEARBEITEN: Das Kurzformat Hash1 (Hash1 (Hash1 (Passwort ^ salt))) wurde in ein genaueres Format Hash1 (Hash1 (Hash1 (0, Passwort, salt)) geändert. , Passwort, Salz), Passwort, Salz) , um Antworten zu vermeiden, die nur auf die höhere Anzahl von Kollisionen mit dem früheren Format hinweisen. Kollisionen spielen beim Hashing von Benutzerkennwörtern keine Rolle, solange die verbleibende Entropie von myhash (~ 256 - x aufgrund von Kollisionen, wobei x nahe bei 0 liegt) deutlich höher ist als die Entropie des Benutzerkennworts . Das Passwort eines Benutzers hat fast immer weniger als 60 Bit Entropie, es sei denn, dies wird von einem Passwortgenerator ausgewählt.

Nun, wenn man nach dem derzeitigen Kenntnisstand über die Funktion als "kollisions-, zweit- und vorbildresistent" eingestuft wird, werden drei übereinander liegende keine Rolle spielen. Es könnte schlimmer werden, wenn einer schwächer ist als die anderen (Big-MAC / Little-Mac-Angriff). Dies entspricht dem Angriff auf drei verschiedene Nachrichten, jedoch in einer bestimmten Reihenfolge. Wenn Sie einen dieser Angriffe nicht angreifen können, warum sollten Sie sie dann stapeln? Es sei denn, es handelt sich um sichere MACs (HMAC), die einen bestimmten Angriff haben, den sie schützen möchten
Auch bcrypt, scrypt und pbkdf2 sind keine Hashes selbst, sondern KDFs (Key Derivation Functions), die mit HMAC-Algorithmen erstellt wurden, die wiederum Hash-Algorithmen wie SHA-256 verwenden, um die HMAC-Werte zu generieren. Es ist bereits ein erhebliches Mischen, Rühren und Schütteln erforderlich, um einen Wert aus einem KDF zu erhalten. Selbst wenn das Mischen der Ausgabe mehrerer KDFs die Gesamtsicherheit nicht schwächt, wird sie wahrscheinlich nicht wesentlich verbessert.
@Craig Dies ist meine bisherige Lieblingsantwort. Würde es Ihnen etwas ausmachen, daraus eine Antwort anstelle eines Kommentars zu machen?
[meine Einstellung zu progs.SE] (http://programmers.stackexchange.com/a/115414/25768)
Hashing und Salting funktioniert nur beim Lesen des gespeicherten Passworts / Strings / was auch immer. Jemand, der versucht, es brutal zu erzwingen, muss nur die unverschlüsselte Zeichenfolge eingeben, unabhängig davon, wie oft und was auch immer Sie zum Hashing verwenden.
Beachten Sie, dass bcrypt die Eingabe nicht mehr liest, wenn es auf Byte 0 trifft, und bis zu 72 Bytes liest. Wenn Sie also die Ausgabe von Hash-Funktionen in bcrypt eingeben, erhalten Sie möglicherweise bcrypt ("\ 0abcd ...") == bcrypt ("\ 0efgh ..."), was sehr schlecht ist. 1/256 der Passwörter haben denselben Hash! Wenn Sie die Basis 64 von Hash in bcrypt einspeisen, kann die Längenbeschränkung ein Problem sein.
@DanWhite Ja, aber ... ein Teil dessen, was die vielen Iterationen von Schlüsselableitungsfunktionen wie pbkdf2 / bcrypt / scrypt bewirken, dass jede Kennwortschätzung so lange dauert (ein signifikanter Bruchteil einer Sekunde oder länger anstelle einiger Millisekunden) Der Versuch, Brute-Force-Vermutungen anzuwenden, lohnt sich einfach nicht. Es sei denn, Sie meinen, der Angreifer verfügt über eine Kopie der Kennwortdatenbank. In diesem Fall muss er wissen, welchem ​​Algorithmus das Klartextkennwort zugeführt werden soll, wie viele Iterationen ausgeführt werden sollen usw. Die Messlatte ist etwas höher als Sie zu implizieren scheinen?
Können Sie beweisen, dass keine Ihrer Hash-Funktionen eine der anderen invertiert (oder teilweise invertiert)? Ich wäre überrascht, habe aber noch nie versucht, so etwas zu beweisen. Es wäre peinlich zu behaupten, einen stärkeren Hash gemacht zu haben, nur um herauszufinden, dass es gleichbedeutend ist, nur "die Hälfte" eines Hashs zu machen ...
Sieben antworten:
Thomas Pornin
2015-07-12 21:02:16 UTC
view on stackexchange narkive permalink

Beim Versuch, Hash-Passwörter zu verwenden, kann der Angreifer immer dieselbe Art von Hardware wie der Verteidiger verwenden. Was der Angreifer versucht, ist, es besser zu machen, indem er spezielle Hardware verwendet, die es ihm ermöglicht, N potenzielle Passwörter zu geringeren Gesamtkosten zu hashen, als wenn er die Hardware des Verteidigers verwenden würde. Die Gesamtkosten umfassen die Kosten für den Kauf der Hardware, die Kosten für die Entwicklung der entsprechenden Software und dann die Kosten für den Betrieb der Hardware, die sich im Wesentlichen auf den verbrauchten Strom (für die Stromversorgung der Hardware und) belaufen zum Abkühlen). Für einen ernsthaften Angreifer dominieren die Energiekosten.

Immer wenn es eine Operation gibt, die der Angreifer billiger als der Verteidiger ausführen kann, gewinnt der Angreifer. Ein wichtiger Punkt ist, dass das Knacken von Passwörtern ein peinlich paralleles Problem ist: Per Definition hat der Angreifer viele potenzielle Passwörter zum Ausprobieren.

Angenommen, Sie kaskadieren Drei verschiedene Hash-Funktionen Hash1 , Hash2 und Hash3 . Dies bedeutet, dass der Verteidiger alle drei Implementierungen zur Hand haben muss, die alle auf seinem Server ausgeführt werden. Der Angreifer hingegen kann eine bessere Planung haben: Er kann (sagen wir) eine Million potenzieller Passwörter mit Hash1 hashen und die Ergebnisse in einem Puffer speichern. Schalten Sie dann die Hardware auf etwas um, das Hash2 anwendet, und führen Sie sie über die Millionen gespeicherten Ausgaben des vorherigen Schritts aus. Speichern Sie dort erneut die Hash2 -Ausgänge in einem Puffer. Endlich wieder Hardware wechseln, mit Hash3 .

Diese Art der "Hardware-Umschaltung" ist besonders relevant bei Verwendung von FPGA: Jede "Umschaltung" ist eine Neuprogrammierung von der gleichen tatsächlichen Hardware, und ist eine Frage von höchstens ein paar Sekunden. Durch die Verwendung einer solchen Planung und Pufferung sind die "Umschalt" -Kosten vernachlässigbar.

Dies kann auch als Pipelining verwendet werden: Wenn der Angreifer drei spezialisierte Maschinen erstellt hat, eine für Hash1 , eine für Hash2 und eine für Hash3 , dann kann er Hash1 mit dem ersten möglichen Kennwort ausführen und dann die Ausgabe an den Computer senden, der Hash2 berechnet. Während der zweite Computer Hash2 berechnet, kann der erste Computer Hash1 für ein anderes potenzielles Kennwort berechnen. Und so weiter. In der Praxis kann der Angreifer jederzeit alle seine Spezialmaschinen voll belegen und so über Ihre Versuche einer "erhöhten Stärke" lachen.

Außerdem, wenn drei verschiedene Hash-Funktionen implementiert werden müssen und nur eine von ihnen können mit spezieller Hardware optimiert werden, dann erhält der Angreifer immer noch einen Gewinn, indem er diese optimiert. Um es grob zu sagen: Wenn Sie bcrypt, scrypt und SHA-256 kaskadieren, verwendet der Angreifer einen PC für die ersten beiden und eine GPU für den SHA-256 und vermeidet so etwa 1/3 der Kosten / p>


Zusammenfassend ist die Intuition, dass "das Mischen einer Reihe verschiedener Hash-Algorithmen zusätzliche Stärke bieten sollte" falsch. Es macht das Gegenteil. Ein solches Mischen erhöht die Entwicklungs- und Nutzungskosten für den Verteidiger, verlangsamt jedoch nicht den Angreifer (der von viel Parallelität profitiert) und erhöht die Optimierungsoptionen des Angreifers.

(All dies ist sagte, ohne über praktische Dinge zu sprechen, wie das Management der einzelnen Salze für alle kaskadierten Funktionen und die Gefahren der hausgemachten Kryptographie.)

Sie sagen, dass die Verwendung einer GPU ein Drittel der Kosten für den Angreifer senken würde, wenn wir einen gemischten Hash verwenden. Dies bedeutet jedoch, dass der Angreifer mit nur einem Hash, aber dem falschen (sha256) keine Kosten mehr hat und gewonnen hat. Was mir sagt, "wenn ich Zweifel habe, welcher Hash der beste ist, kaskadiere mehrere Hashes" - das ist der Punkt, den ich nicht verstehe.
Ich denke, was Sie mitnehmen sollten, ist tatsächlich: "Wenn Sie Zweifel haben, welcher Hash der beste ist, finden Sie heraus, welcher Hash der beste ist, und verwenden Sie diesen." Diese Funktionen werden sehr detailliert analysiert, und es sollte angesichts des Angriffsprofils, gegen das Sie schützen müssen, nicht schwierig sein, herauszufinden, welche den größten Schutz bietet. Wenn Sie den besten Hash mit anderen minderwertigen Hashes kaskadieren, liegt es nahe, dass Sie Ihre Sicherheit verbessern können, indem Sie die minderwertigen Hashes durch den besten ersetzen.
Es sei denn, die um 300% erhöhten Hashing-Kosten für den Verteidiger sind vernachlässigbar (da er so wenig tut), und die um 200% erhöhten Hashing-Kosten für den Angreifer sind unerschwinglich. Es gibt Gründe, Hashes nicht zusammenzusetzen, aber die Kostenunterschiede zwischen Angreifer und Verteidiger scheinen schwach zu sein.
Wenn ein 3x erhöhter Hashing-Preis für den Verteidiger vernachlässigbar ist, sollte er die Iterationszahl in seinem bcrypt / PBKDF2 / was auch immer entsprechend erhöhen. Dafür ist diese Iterationszahl gedacht.
Ich würde das gegenteilige Argument vorbringen: Wenn man eine einzelne Hashing-Funktion verwendet, die eine Wahrscheinlichkeit von 0,1% hat, eine erkennbare Schwäche zu haben, die es einem Angreifer ermöglicht, sie um den Faktor einer Million zu beschleunigen, gibt es eine Eins-in-A-Funktion -tausend Chance, dass ein Angreifer eine millionenfache Beschleunigung erreichen kann. Wenn man drei unabhängige Funktionen verwendet, von denen jede eine Chance von 0,1% hat, einen solchen Durchbruch zuzulassen, besteht eine Chance von 0,3%, dass ein Angreifer eine Beschleunigung von 33% erreicht, und eine Chance von 0,0003%, dass ein Angreifer eine 66 erreicht % Beschleunigung und nur 0,0000001% Chance eines Angreifers ...
... eine millionenfache Beschleunigung. Ich würde die Möglichkeit, dass ein Angreifer eine Beschleunigung von 33% erhält, als belanglos betrachten, verglichen mit der Verringerung der Wahrscheinlichkeit, dass der Angreifer eine Beschleunigung von 70% oder besser erhält.
Beantwortet Ihr Argument "Muss Implementierungen wechseln" und "Kann Pipeline" nicht genau "Ja!" zum OP? Pipelining "für immer" mit FPGAs ist nicht möglich (insbesondere wenn Sie den nächsten Algo in der Pipe nicht kennen), aber für den Verteidiger trivial. Sie können 5.000 Mal auf PBKDF2-ähnliche Weise hashen und einen pseudozufälligen Hash aus einer Reihe von 3 oder 4 Algorithmen auswählen. Diese Art von Komplexität wird Sie wahrscheinlich dazu zwingen, einen GPU-Rechenjob in mehrere Durchgänge aufzuteilen und entweder Millionen für FPGAs auszugeben (wohingegen sonst ein paar Dollar ausreichen würden) oder sie die ganze Zeit neu zu programmieren. Auf jeden Fall ist es viel schwieriger.
@DavidZ Was Sie sagen, macht Sinn, aber das Problem, das ich habe, ist, dass ich in "Jetzt" und der Angreifer in "Zukunft" arbeite. Und um den Angreifer effektiv zu vereiteln, muss ich herausfinden, welcher Hash in "Future" am besten ist, was über meine Fähigkeiten hinausgeht.
@Peter nein, ich glaube nicht. Wir sprechen über die nahe Zukunft - ungefähr ein Jahr bis zu einem Jahrzehnt - und in diesem Zeitraum besteht eine sehr geringe Wahrscheinlichkeit für eine technologische Entwicklung, die grundlegend ändert, welche Hash-Algorithmen am effektivsten sind.
@DavidZ Die einzigen Bezugspunkte, die ich habe, sind vergangene Jahrzehnte, in denen wir in jedem Jahrzehnt viele grundlegende Veränderungen hatten.
@Peter gab es nicht so viele grundlegende Änderungen. Die großen sind ASICs und Parallelverarbeitung. (GPUs sind im Wesentlichen eine Kombination der damit verbundenen Ideen.) Zwei große Fortschritte über ein halbes Jahrhundert führen nicht zu vielen grundlegenden Änderungen in jedem Jahrzehnt. Und in Bezug darauf, welche Hashes am effektivsten sind, ist die einzige wirklich große Änderung in der jüngsten Speicher-AFAIK die Umstellung von Algorithmen vom SHA-Typ, die CPU-intensiv sind (aber leicht mit Hardware optimiert werden können) auf Algorithmen vom Typ bcrypt, die Speicher sind. intensiv.
@DavidZ Zusätzlich haben sich die Arten der verwendeten Passwörter dramatisch geändert - wir können nicht mehr alle 4-stelligen Passwörter in Kleinbuchstaben verwenden. Dies und alle Beispiele, die Sie erwähnt haben, geschahen im selben Jahrzehnt. In den letzten zehn Jahren haben wir begonnen, Hashes zu verwenden, anstatt Passwörter als Klartext in einer Datenbank oder Textdatei zu speichern und sie im Klartext über das Netzwerk zu übertragen.
Craig
2015-07-13 02:32:51 UTC
view on stackexchange narkive permalink

Ich wurde gebeten, meinen Kommentar zu einer Antwort zu machen.

Grundsätzlich habe ich gesagt, dass bcrypt, scrypt und pbkdf2 selbst keine Hashes sind, sondern KDFs (Key-Ableitungsfunktionen). . KDFs basieren auf HMAC-Algorithmen, die wiederum auf Einweg-Hashing-Algorithmen wie SHA-256 basieren, um die Message Digest-Werte zu generieren.

Es ist bereits ein erhebliches Mischen, Rühren und Schütteln erforderlich, um einen Wert zu erhalten aus einem KDF heraus.

Auch wenn das Mischen der Ausgabe mehrerer KDFs die Gesamtsicherheit nicht schwächt, wird sie wahrscheinlich nicht wesentlich verbessert.

Im Wesentlichen sind "Hash1 (Hash2 (Hash3 (Passwort ^ Salt))" und "Hash1 (Hash1 (Hash1 (Passwort ^ Salt))") beide benutzerdefinierte Schlüsselableitungsfunktionen, die versuchen, das gleiche Problem "Scrypt" und "Bcrypt" zu lösen `versuchen zu lösen. Daher sind "scrypt" oder "bcrypt" für sich genommen beiden Beispielen in der Frage vorzuziehen, da sie von Fachleuten einer genaueren Prüfung unterzogen wurden. Richtig?
Das "Mischen und Rühren und Schütteln" ist hier ziemlich unangebracht, da ein einzelner Hash-Funktionsaufruf, selbst ein "defekter" wie MD5, bereits alles liefert, was in dieser Hinsicht benötigt wird. Der Hauptangriffsvektor zum Knacken von Passwörtern ist Brute Force (Ausprobieren potenzieller Passwörter). Die vielen Iterationen in normalen Passwort-Hashing-Funktionen sind nicht für das "zusätzliche Mischen" (es gibt bereits mehr als genug) da, sondern für die zusätzlichen Rechenkosten.
@ThomasPornin Ich glaube nicht, dass irgendjemand vorgeschlagen hat, dass die zusätzlichen Rechenkosten kein wesentlicher, absichtlicher Aspekt von KDFs waren. ;-);
Wenn andererseits die Rechenkosten die * einzige * relevante Überlegung wären, dann hätte die Verwendung von Verschlüsselung über bcrypt oder pdkdf2 keinen wirklichen oder wahrgenommenen Vorteil, oder? Sie würden nur die Anzahl der Iterationen erhöhen, damit die Digest-Berechnung so lange dauert, wie Sie es für angemessen halten. Wenn die Basis-Hash-Funktionen * wirklich * mehr als genug "Mischen, Rühren und Schütteln" bewirken würden, wäre es wirklich nicht erforderlich, HMAC-Funktionen zu verwenden, um Längenerweiterungsangriffe abzuwehren und so Kollisionen und Entdeckungen zu verhindern (oder teilweise Entdeckung) der Nachricht. Oder bin ich hoch? ;-);
... okay, ich weiß, dass ich zu stark vereinfache und dass einige Algorithmen mit bestimmter Hardware (GPUs) effizienter beschleunigt werden können als andere Algorithmen. Aber letztendlich berücksichtigt meine Aussage, dass "es bereits ein erhebliches Mischen und Rühren und Schütteln gibt, um einen Wert aus einem KDF herauszuholen", offensichtlich die Wirkung des zugrunde liegenden Hashing-Algorithmus (oder der Blockverschlüsselung im Fall von bcrypt). Was ich damit meinen wollte, war dasselbe, was Sie gesagt haben - dass das bereits stattfindende Scrambling ausreicht und das Mischen mehrerer KDFs das wahrscheinlich nicht verbessern wird.
Die Schwierigkeit, einige Funktionen mit spezieller Hardware zu berechnen, ist der springende Punkt beim Verschlüsseln / Verschlüsseln über etwas wie PBKDF2. bcrypt macht einer GPU das Leben schwer; scrypt versucht auch, FPGA-basierte Angriffe abzuwehren. (Außerdem ist PBKDF2 ein schlechtes KDF, da seine Gesamtkosten für die Berechnung proportional zur Ausgabegröße sind. Ein besseres Design würde das Kennwort auf eine feste Größe ändern und dann mit einem schnellen KDF wie HKDF erweitert werden. Aber das ist eine andere Debatte. )
@ThomasPornin Vielen Dank, dass Sie das erweitert haben. Meine falsche Schreibweise von pbkdf2 in diesen Kommentaren (im Gegensatz zur korrekten Schreibweise in meinem Kommentar zur Frage des OP) war übrigens nur ein Tippfehler. :-)
ratchet freak
2015-07-13 01:27:58 UTC
view on stackexchange narkive permalink

So kopieren Sie meine Antwort auf eine ähnliche Frage zu progs.SE:

das Problem mit

  hash1 (hash2 ( hash3 (... hashn (pass + salt) + salt) + salt) ...) + salt)  

ist, dass dies nur so stark ist wie die schwächste Hash-Funktion in der Kette . Wenn beispielsweise Hash (der innerste Hash) eine Kollision ergibt, führt die gesamte Hash-Kette zu einer Kollision ( unabhängig davon, welche anderen Hashes in der Kette sind).

Eine stärkere Kette wäre

  hash1 (hash2 (hash3 (... hashn (pass + salt) + pass + salt) + pass + salt) ...) + pass + salt)  

hier vermeiden wir das Problem der frühen Kollision und generieren im Wesentlichen ein Salz, das vom Passwort für den endgültigen Hash abhängt.

und wenn ein Schritt in der Kette kollidiert, spielt es keine Rolle, weil in der Im nächsten Schritt wird das Passwort erneut verwendet und sollte für verschiedene Passwörter ein anderes Ergebnis liefern.

Beim Passwort-Hashing spielen Kollisionen keine Rolle. Sofern eine Kennwort-Hashing-Methode nicht einfach gebrochen ist oder das Kennwort eines Benutzers außergewöhnlich stark ist, ist es für einen Angreifer im Allgemeinen einfacher, die Zeichenkombination im Kennwort des Benutzers zu finden, als eine andere Zeichenkombination, deren Hash ebenfalls mit dieser übereinstimmt.
BufferOverflow
2015-07-12 20:47:29 UTC
view on stackexchange narkive permalink

Wenn Sie verschiedene Hash-Algorithmen verwenden, erhalten Sie nicht mehr Entropie, sondern weniger. Ich denke, Sie haben den Ausdruck «Die Sicherheit ist nicht stärker als der schwächste Punkt» gehört, das gilt auch hier. Die Entropie davon ist nicht größer als die des schwächsten Algorithmus.

Wenn Sie das Kennwort jedoch mehrmals mit demselben Algorithmus hacken, erhalten Sie mehr Sicherheit. Verwenden Sie jedoch einen starken Hashing-Algorithmus für einige Runden anstelle eines schwachen Algorithmus für viele Runden. Beispiel: Dies ist sicherer:

  sha512 (sha512 (sha512 (Passwort + Salt)))  

als:

  sha1 (sha1 (sha1 (sha1 (sha1 (sha1 (... sha1 (Passwort + Salz) ...)))))  

Ich sehe, dass es Leute gibt, die nicht Ich glaube nicht daran und möchte, dass ich es beweise. Nehmen wir ein Beispiel. Ich habe drei Hashing-Algorithmen ausgewählt, SHA256, SHA1 und MD5.

  • SHA256 erzeugt eine 256-Bit-Ausgabe
  • SHA1 erzeugt eine 160-Bit-Ausgabe
  • MD5 erzeugt eine 128-Bit-Ausgabe
  • Wenn wir also haben:

      sha256 (sha1 (md5 (Passwort + Salt)));  

    Zuerst werden das Passwort und das Salt mit dem MD5 gehasht Die Ausgabe ist 128 Bit groß, sodass die Gesamtmöglichkeiten der MD5-Ausgabe 2 ^ 128 betragen. Dann wird die MD5-Summe mit SHA1 gehasht, aber Sie müssen nicht alle Möglichkeiten hashen, sondern nur die 2 ^ 128 als MD5-Ausgänge. Dann wird die SHA1-Summe mit SHA256 gehasht, aber wieder. Es ist nicht notwendig, alle Möglichkeiten von SHA256 zu hashen, sondern nur die 2 ^ 128 Möglichkeiten, die MD5 erzeugt. Dieser Hashing-Algorithmus kann also wie der MD5 nur eine Ausgabe mit einer Entropie von 2 ^ 128 erzeugen. Und MD5 weist mehrere Schwachstellen auf, sodass die tatsächliche Stärke weniger als 2 ^ 128 beträgt.

    Kommentare sind nicht für eine ausführliche Diskussion gedacht. Diese Konversation wurde [in den Chat verschoben] (http://chat.stackexchange.com/rooms/25904/discussion-on-answer-by-bufferoverflow-why-not-mix-hashes).
    goodguys_activate
    2015-07-12 20:55:24 UTC
    view on stackexchange narkive permalink

    Das Mischen von Hashes führt normalerweise zur Sicherheit des schwächsten Hashs in der Kette, nämlich:

    • Erste Vorbildresistenz
    • Zweite Vorbildresistenz
    • Kollision Widerstand

    Anstatt Hashes zu mischen, ist die CPU-Leistung normalerweise am besten auf Hashing mit mehr Bytes gerichtet.

    Mit anderen Worten, wenn das Hashing mit zwei Algorithmen N Joule Arbeit erfordert und zu weniger Sicherheit führt, verwenden Sie einfach SHA512 anstelle von SHA256, und Sie sind sicherer.

    Kollisionen und zweite Vorbilder sind für das Hashing von Passwörtern irrelevant. Bei ersten Vorbildern macht die Kaskadierung von Hash-Funktionen die Kette tatsächlich so stark wie den stärksten Hash, nicht den schwächsten - aber das spielt hier keine Rolle, da es sehr viel katastrophale Kreativität erfordert, um tatsächlich Schwächen im Vorbild zu haben. Beim Passwort-Hashing geht es (meistens) um Recheneffizienz, nicht um Kryptoanalyse. In dieser Ansicht ist SHA-512 "besser" als SHA-256, nicht wegen der zusätzlichen Ausgabelänge, sondern nur, weil die derzeit verkaufte GPU bei 64-Bit-Berechnungen schlecht ist.
    Atsby
    2015-07-14 06:52:17 UTC
    view on stackexchange narkive permalink

    Hashes sollten nicht gestapelt werden. Vielmehr sollte das Ergebnis mehrerer Hashes zusammen XOR-verknüpft werden. Ein solches Grundelement (das XORs mehrere glaubwürdige Hash-Funktionen zusammenfasst) kann in der Schleife von PBKDF oder ähnlichem verwendet werden, um Ergebnisse zu erzielen, die dem Stapeln von Hash-Funktionen weit überlegen sind. Was bei der Kosten-Nutzen-Analyse berücksichtigt werden muss, ist, dass ein solches Protokoll viel zusätzliche Arbeit erfordert, um von den Guten implementiert zu werden, und es gibt keine Beweise dafür, dass die schlechten Käufe SHA-256 brechen können.

    In der Tat schützen Stapel-Hashes beispielsweise vor einem "Hash" mit ungerader Parität, der den Schlüsselraum für alle nachfolgenden Hashes auf zwei Bits reduziert.
    KristoferA
    2015-07-12 20:35:01 UTC
    view on stackexchange narkive permalink

    Wenn Sie von:

      myhash = Hash1 (Hash2 (Hash3 (Passwort ^ salt)))  

    ... zu ...

      myhash = Hash1 (Passwort + Salz + Hash2 (Passwort + Salz + Hash3 (Passwort ^ Salz)))  

    ... dann haben Sie vielleicht reduzierte das Risiko einer Kollision von Hash1 ...



    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...