Warum wird doppelt gehasht?

Hallo zusammen,

nachdem ich nun „Mastering Bitcoin“ einmal durchgearbeitet habe (ein zweites Mal folgt, wenn sich das bisher erworbene Wissen gefestigt hat), stellt sich mir die Frage:

Warum wird der öffentliche Schlüssel (der über die elliptische Kurve aus dem Generatorpunkt und dem privaten Schlüssel erzeugt wird) DOPPELT gehasht? Einmal mit SHA256 und dann mit RIPEMD160?
Ich sehe hier erstmal nur, dass Kollisionen erzeugt werden (Abbildung eines 2^256 Zahlenraums in einen 2^160 Zahlenraum) und damit die Sicherheit von Bitcoin geschwächt wird.
Das ist zwar eher theoretisch, @skyrmion hat es in seinem Beitrag hier sehr gut dargestellt:

ABER: ich habe in „Mastering Bitcoin“ keine Antwort auf die Frage nach dem WARUM gefunden. Dort wird häufig nur beschrieben, WIE etwas gemacht wird, selten WARUM.

Danke für eure Antworten!

3 „Gefällt mir“

Das doppelte Hashen des öffentlichen Schlüssels in Bitcoin dient mehreren Zwecken.
SHA-256 wird verwendet da er eine hohe Widerstandsfähigkeit gegen Angriffe bietet. Sollte dies irgendwann nicht mehr der Fall sein, kann dieser Schritt durch einen anderen HASH-Algo. ausgetauscht werden, ohne den Aufbau der Adressen anzupassen.

Danach wird RIPEMD-160 angewendet, hauptsächlich um die resultierende Hashlänge zu verkürzen. Dies hat den Vorteil, dass Bitcoin-Adressen kürzer sind, was sie benutzerfreundlicher macht.

Zudem bietet das doppelte Hashen eine zusätzliche Sicherheitsebene. Falls in einem der Algorithmen Schwächen gefunden werden, hilft der andere, die Sicherheit der Adressen zu bewahren.

Der Übergang von einem größeren in einen kleineren Zahlenraum (von 2^256 zu 2^160) führt zwar theoretisch zu Kollisionen, die Praxis zeigt jedoch, dass diese Kollisionen aufgrund der riesigen Größe des Zahlenraums extrem unwahrscheinlich sind. :vulcan_salute:

15 „Gefällt mir“

Vielleicht sollte man noch ergänzen, dass deine sehr gute Erklärung dem Ansatz der Bitcoin Entwickler bis vor einigen Jahren entsprach.

Bei Taproot hat man mittlerweile wegen anderer Vorteile einige dieser älteren Sicherheits-Argumente über Bord geworfen. Der PublicKey wird bei Taproot Transaktionen bzw. Outputs nicht mehr gehasht.

Hier dazu nochmal ein Zitat aus einem anderen Thread:

Quelle: BIP0341: Taproot: SegWit version 1 spending rules

2 . Why is the public key directly included in the output?

While typical earlier constructions store a hash of a script or a public key in the output, this is rather wasteful when a public key is always involved. To guarantee batch verifiability, the public key must be known to every verifier, and thus only revealing its hash as an output would imply adding an additional 32 bytes to the witness. Furthermore, to maintain 128-bit collision security for outputs, a 256-bit hash would be required anyway, which is comparable in size (and thus in cost for senders) to revealing the public key directly.

While the usage of public key hashes is often said to protect against ECDLP breaks or quantum computers, this protection is very weak at best: transactions are not protected while being confirmed, and a very large portion of the currency’s supply is not under such protection regardless.

Hier verweist Peter Wuille u.a. auf einen seiner Tweets (Link „large portion“), in dem er erwähnt, dass ca. 5-10 Mio Bitcoin aktuell sowieso schon nicht zusätzlich durch Hashes gesichert sind.
Also Bitcoin auf Adressen, deren Public Key schon bekannt ist, oder alte, ungehashte P2PK Outputs.

6 „Gefällt mir“

Korrekt! Das ist einer der Gründe, warum man eine Adresse nur einmal verwenden sollte. Beim ersten „Ausgeben“ auf der Adresse muss der öffentliche Schlüssel (PubKey) dem Netzwerk bekannt gegeben werden. :grinning:

1 „Gefällt mir“

Also wenn ich das richtig verstehe, ist hashen aus Sicherheitsgründen Quatsch, da PK und somit auch „Adressen“ persé für den öffentlichen Raum bestimmt sind.
Hashen also nur das Kürzen - Verkleinerung des benötigten Blockspaces als Motiv hat.

Ich kann dir leider nicht sagen, was die bedeutenderen Core Entwickler seit Anbeginn von Bitcoin sich dazu gedacht haben. Aber man kann bei diesem Punkt durchaus unterschiedlicher Meinung sein.

Das zusätzliche Hashen bietet meines Erachtens natürlich einen zusätzlichen Schutz ggü. einem Bruch von ECDSA, egal ob durch Quantencomputer oder aktuelle Rechner.

Die Vertreter der Ansicht, zusätzliches Hashen sei unnötig, bestreiten wahrscheinlich nicht diese Aussage an sich. Aber sie sagen die zusätzliche Sicherheit sei aus folgenden Gründen irrelevant:

  1. Viele Bitcoins liegen auf Adressen mit schon bekanntem Public Key, d.h. ein ECDSA Bruch würde Bitcoin ins Chaos stürzen und den Wert ins Bodenlose fallen lassen.

  2. Spätestens beim Ausgeben eines UTXOs muss der Public Key veröffentlicht werden.

Bei diesen Argumenten könnte man allerdings erwidern:

  1. Ein ECDSA Bruch muss nicht dramatisch sein, sondern es könnten im Laufe der Zeit einfach nur immer bessere Angriffe gefunden werden.
    D.h irgendwann würde es sich lohnen, die Adressen mit bekanntem Public Key und den meisten Bitcoin mit enormen Rechenaufwand und entsprechenden Kosten anzugreifen. Falls die ersten Angriffe auf „große“ Adressen bekannt würden, aber gleichzeitig auch klar wäre, dass sich ein Angriff bei „kleinen“ Adressen noch lange nicht lohnt, wäre ich mir nicht sicher, ob die Kaufkraft stark leiden würde.

  2. Dasselbe Szenario ist auch hier relevant. Bei unbekanntem Public Key oder bei wenig Bitcoin pro Adresse hätte man noch lange Zeit um zu reagieren.
    Der Zeitraum zwischen Veröffentlichen und Minen einer Transaktion wäre auch viel zu kurz für einen Angriff.

Lange Rede, kurzer Sinn:

Wenn man nicht von einem ECDSA-Endzeit-Szenario ausgeht, bietet das zusätzliche Hashen sehr wohl eine zusätzliche Sicherheit.

Ich wage auch zu bezweifeln, dass die Kollisionsresistenz ausschließlich von der Länge des Public Keys bzw. der Adresse abhängt. Das wäre nur bei stupiden Bruteforce-Angriffen so.
Ich gehe also mal davon aus, dass ein gehashter Public Key mehr Kollisionsresistenz bietet, als ein ungehashter gleichlanger Public Key.

Bei den Adressen mit RIPEMD-160 Hash ist das soweit ich weiß eine Intention gewesen. Allerdings gilt das nur unter der Prämisse, dass der Public Key im Output schon alleine aus Sicherheitsgründen mindestens einmal gehasht werden soll (z.B. mit SHA-256).

Der Public Key muss immer genau einmal veröffentlicht werden:

  • Entweder im Output → Dann braucht man ihn aber später im Input nicht mehr veröffentlichen (Taproot).
  • Oder erst später im Input → Dann kann man vorher im Output Platz sparen, indem man den Public Key nochmal hasht.

In Bezug auf die Blockchain Insgesamt würde man also naiv betrachtet am meisten Platz sparen, wenn der Public Key ungehasht im Output steht, und dafür nicht mehr im Input. Somit spart man sich ja auch den zusätzlichen (verkleinerten) Hash.

Allerdings hängt es in der Realität u.a. davon ab, ob in Transaktionen im Gesamt-Durchschnitt mehr Inputs oder Outputs stehen. Die stetig wachsende Anzahl von UTXOs deutet darauf hin, dass es im Mittel mehr Outputs als Inputs gibt. Dieser Faktor läuft also dem vorherigen Argument entgegen.

Wo alles in allem das Optimum für die Blockchain als ganzes liegt und ob es dazu Analysen gibt weiß ich nicht. Ich habe auch sicher Aspekte vergessen, weil ich nicht so tief in Thema drin bin. Eventuell haben ja andere hier mehr Infos: @sutterseba, @Cricktor, @mowtan ?

2 „Gefällt mir“

Ganz herzlichen Dank für Deine sehr umfangreichen Ausführungen lieber skyrmion!

So, so, Du steckst da nicht so tief drin. Nun, ich habe den gegenteiligen Eindruck.

Hingegen stecke ich wirklich nicht so tief drin, um Deine Antwort sofort und in Gänze zu überschauen, aber genügend Gedankenimpulse stecken drin.

2 „Gefällt mir“