Warum werden Hashes im Bitcoin-Protokoll normalerweise zweimal berechnet (doppelt berechnet)?

Gemäß der Wiki-Spezifikation des Bitcoin-Protokolls werden Hashes typischerweise „zweimal berechnet“. Zum Beispiel :

hello
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (first round of sha-256)
9595c9df90075148eb06860365df33584b75bff782a510c6cd4883a419833d50 (second round of sha-256)

Was ist die Begründung dafür? Ich kann mir vorstellen, dass es irgendwie zusätzliche Sicherheit oder Schutz vor potenziellen Angriffsvektoren bietet, aber ich kann mir nicht erklären, was diese Angriffe sein könnten.

Antworten (5)

Wir wissen es nicht genau, aber die populärste Theorie besagt, dass ein doppelter Hash gewählt wurde, um vor Längenerweiterungsangriffen zu schützen .

Längenerweiterungsangriffe sind in Bitcoin unmöglich, da Längenerweiterungsangriffe nur dort angewendet werden, wo die gehashten Daten geheim sind. Diese Antwort ist falsch.

Die Wiki-Behauptung, dies soll Geburtstagsangriffe verhindern, ist falsch. Wenn Sie bei einem einzigen Aufruf der Hash-Funktion einen Geburtstagsangriff erfolgreich ausführen können, erhalten Sie beim zweiten Aufruf einen erfolgreichen Geburtstagsangriff. Dies ist leicht zu erkennen, da das Haben hash(x) == hash(y)impliziert hash(hash(x)) == hash(hash(y)).

Wenn Sie sich wirklich davor schützen wollten, würden Sie so etwas tun hash(x||hash(x)). Das Finden einer Kollision in einem einzelnen Aufruf hashwürde in diesem Fall nicht direkt zu einer Kollision im doppelten Aufruf führen.

Das Wiki beantwortet diese Frage . TLDR: um gegen Geburtstagsangriffe vorzubeugen .

Bitcoin verwendet zwei Hash-Iterationen (als SHA256^2 bezeichnet, dh „SHA256-Funktion im Quadrat“), und der Grund dafür bezieht sich auf einen teilweisen Angriff auf den kleineren, aber verwandten SHA1-Hash. Der Widerstand von SHA1 gegen Geburtstagsangriffe wurde ab 2005 in O (2 ^ 64) gegenüber dem Design O (2 ^ 80) teilweise gebrochen. Während Hashcash auf Pre-Image-Resistenz angewiesen ist und daher nicht anfällig für Geburtstagsangriffe ist, besteht eine generische Methode zum Härten von SHA1 gegen Geburtstagskollisionsangriffe darin, es zweimal zu iterieren. Ein vergleichbarer Angriff auf SHA256 existiert bisher nicht, da das Design von SHA256 jedoch ähnlich zu SHA1 ist, ist es wahrscheinlich für Anwendungen defensiv, doppeltes SHA256 zu verwenden. Und das ist es, was Bitcoin tut, es ist nicht notwendig, da Hashcash auf Preimage-Sicherheit angewiesen ist, aber es ist ein Abwehrschritt gegen zukünftige kryptoanalytische Entwicklungen.

Das mag das Wiki sagen, aber das tut es eigentlich nicht. Eine Kollision in der Single-Version ( hash(x)==hash(y)) impliziert eine Kollision in der Double-Version. Der Wiki-Artikel ist also falsch.
Die Wiki-Antwort ist falsch. Siehe meine Antwort unten für eine ausführlichere Erklärung

Wie andere gesagt haben, ist die Wiki-Behauptung, Geburtstagsangriffe zu verhindern, falsch. Vielmehr sollte dies vor Längendehnungsangriffen schützen .

Von https://crypto.stackexchange.com/a/884/56797 :

SHA-256(SHA-256(x)) wurde von Ferguson und Schneier in ihrem hervorragenden Buch „Practical Cryptography“ (später aktualisiert von Ferguson, Schneier und Kohno und umbenannt in „Cryptography Engineering“) als Möglichkeit zur Herstellung von SHA-256 vorgeschlagen unverwundbar für "Längenerweiterungs"-Angriffe. Sie nannten es "SHA-256d". Als wir 2006 das Tahoe-LAFS-Projekt gestartet haben, haben wir angefangen, SHA-256d für alles zu verwenden, nach dem Prinzip, dass es kaum weniger effizient als SHA-256 ist und uns davon befreit, darüber nachdenken zu müssen, ob Längenerweiterungsangriffe gefährlich sind jeder Ort, an dem wir eine Hash-Funktion verwenden. Ich wäre nicht überrascht, wenn die Erfinder von Bitcoin es aus ähnlichen Gründen verwendet hätten. Warum nicht SHA-256d statt SHA-256 verwenden?

Beachten Sie, dass das SHA-3-Projekt von allen Kandidaten verlangte, dass sie über eine Methode zur Verhinderung von Längenerweiterungsangriffen verfügten. Einige von ihnen verwenden eine Methode, die eher SHA-256d ähnelt, dh sie führen am Ende einen zusätzlichen „Finalisierungs“-Hash ihres Zustands durch, bevor sie ein Ergebnis ausgeben.

Längenerweiterungsangriffe sind in Bitcoin unmöglich, da Längenerweiterungsangriffe nur dort angewendet werden, wo die gehashten Daten geheim sind. Diese Antwort ist falsch.

Meine Vermutung ist, dass das doppelte Hashing überall ein Ablenkungsmanöver war, um uns glauben zu machen, Satoshi sei schlampig und lahm, und unseren Fokus von einem postulierten gültigen Anwendungsfall für die abzulenken RIPEMD160(SHA256).

Meine lange und ausführliche Begründung ist in meiner Antwort auf die verwandte Frage enthalten.

Ich plädiere dafür, dass intelligente Leser alle politisch motivierten Ablehnungen ignorieren , dh alle, die nicht mit einem sachlichen Kommentar untermauert sind, der erklärt, warum die Antwort falsch oder nicht relevant für die Frage ist. Subjektive Emotionen und Ignoranz haben wenig Nutzen gegen die Steelmanning-Logik. Stellen Sie sich eine Plattform für Transparenz vor, auf der die Identitäten von wertlosen, Zeugen, sinnlosen, dummen Abwählern vor der Öffentlichkeit verborgen werden.