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