Doppelter Hash Frage vom letzten Livestream

Es wurde gesagt das durch einen Doppelten Hash das Netzwerk unbemerkt eine Parallele Elongation der Blockchain fortführt ohne das man es zunächst bemerkt. Das würde dann einen Hardfork benötigen um das ganze Netzwerk zu sichern und die Einträge zu sichern. Das wurde mir von Roman etwas zu locker beschrieben, deswegen frage ich hier mal ins Forum rein. Das ganze wäre aber noch immer durch den SHA 256 Algo besichert und das sind Zahlen deren Höhe mehr als das 3fache der Atome im gesamten ersichtlichen Universum ausmacht. Würde die doppelte Hashfindung aber einen einfacheren Angriffsvektor bedeuten? Das wäre die Frage. Mfg Seppl.

Diese Frage ist nicht leicht zu beantworten: Es kann einen Angriff ermöglichen, muss aber nicht.

Die Funktion eines Hashes in Bitcoin ist es den eigentlich gespeicherten Wert zu verschleiern. Sagen wir du willst ein Passwort (123456) in die Blockchain schreiben, dann machst du es nicht im Klartext sondern über einen Hash. Die Hashfunktionen sind so aufgebaut, dass sie deterministisch bei gleicher Ausgabe immer das gleiche Ergebnis liefern aber von dem Ergebnis nicht auf das Eingangswort geschlossen werden kann. Theoretisch ist es eine eineindeutige Abbildung, also auch der resultierende Hashwert kann wieder eindeutig zurück in das Eingangswort gewandelt werden, nur der Aufbau der Hashfunktion ist in der Schwierigkeit Asynchron. Während das Eingangswort binnen weniger Millisekunden gehasht werden kann braucht die umgekehrte Richtung durchschnittlich deutlich länger als das Universum alt ist.

Wenn es jetzt einen Fall gibt, dass zwei unterschiedliche Eingangswörter zu dem gleichen Hash führen, dann ist diese Eineindeutigkeit nicht mehr gegeben. Hast du dein Passwort also mit 123456 gehasht in die Blockchain geschrieben, aber das Wort abcdef führt zum gleichen Hash, dann kannst du dich mit beiden Passwörtern, 123456 und abcdef authentifizieren. Soweit wäre es erstmal nicht schlimm weil auch zwei Passwörter in der Anzahl von Passwörtern die mehr als Atome im Universum entsprechen nicht einfach herauszufinden sind. Aber sollte so eine Doppelung bekannt werden, dann könnte man vielleicht mit mathematischen Mitteln den Algorithmus angreifen und die Struktur des Algorithmuses ergründen um die Rückrechnung, die eigentlich unglaublich lange dauern sollte zu beschleunigen. Wenn man nicht mehr mehrere Universumsjahre benötigt sondern vielleicht nur ein zwei Stunden, dann könnte man die in der Blockchain unkenntlich gemachten Passwörter relativ einfach entschlüsseln.

Der Algorithmus gilt dann deswegen als Unsicher weil Angreifer mehr Möglichkeiten für Angriffe bekommen, ob diese Möglichkeiten aber für einen Angriff ausreichen kann auch niemand voraussagen.

Die Auswirkungen einer Doppelung auf die Blockchain sind auch unterschiedlich, je nachdem wo der Hash gedoppelt in der Blockchain auftritt. Denn der Hashalgorithmus wird an vielen Stellen benutzt, nicht nur für die Verkettung der Blöcke. Tritt eine Doppelung in dem Blockhash auf, dann könnten Nodes verwirrt werden (und somit angreifbar werden) weil sie die Blöcke nicht mehr richtig zuordnen können. Es ist dann eben keine Blockchain mehr sondern ein Blockkreis denn der nächste Block würde ja einen Hash verankern der schon zweimal gespeichert wurde. Auf welchen Block setzt der Block dann auf? (Dieses Problem ist lösbar durch Difficultibetrachtungen aber nicht jede Node hat diesen Edge-Case implementiert, es sollte ja eigentlich nicht vorkommen.)

Wenn die Hashdoppelung im Merkletree auftritt, dann kann es genauso zu Problemen kommen weil dann nicht mehr klar ist welche Transaktionen unter diesem Hash stehen, die vom neuen Block oder die vom Alten Block (Auch das Problem wäre auflösbar wenn man z.B. die Blöcke trennt). Aber die Suche über alle Blöcke würde deutlich langsamer sein (also z.B. den eigenen Bitcoin-Bestand einer Wallet ermitteln) weil man momentan ja nach den Hashes Filtert die eindeutig sein sollten.

Es gibt bestimmt noch viele weitere Probleme wenn diese Eineindeutigkeit gebrochen wird wobei man auch immer anmerken muss, dass es Doppelungen geben muss weil es ja „nur“ 2^(256) Hashwerte maximal geben kann, man als Eingangsworte aber beliebig lange zeichne einsetzen kann, also 2^(∞). Aber die Annahme ist, dass wenn man kleine Zeichenketten, also sowas wie die Menge 2^(200) nimmt, dass es keine Doppelungen im Hash gibt. Bewiesen ist das aber glaube ich nicht für sha256, genau weiß ich das aber nicht.

2 „Gefällt mir“

Okay, ich hab die Stelle im Video jetzt gefunden und versuche eine zusammenzufassende Erklärung.

DIe Theorie lehrt, dass der Sha-256 Algorithmus eine Abbildung ist, bei der zwei verschieden Eingabewerte zu einem gleichen Hashwert führen können. Daran gibts nichts zu rütteln und das ist eine mathematische Tatsache.
Sollten solche Doppelungen im aktiv laufenden Protokoll auftreten, so würde die Blockchain weiterarbeiten, diese Fälle sind in der Implementierung berücksichtigt. So weit kein Problem.

Bekommen jetzt kluge, bösartige Menschen tatsächlich zwei konkrete Eingabewerte in die Hand, die den gleichen Hash haben, so würde diese Datenbasis einen möglichen Angriff auf SHA-256 unterstützen. Von einer Umkehrung der Hashfunktion sind wir immer noch meilenweit entfernt, aber wir hätten ein weiteres Werkzeug, das helfen könnte, einen erfolgreichen Angriff durchzuführen.
Praktisch gesehen ist eine Kollission sehr unwahrscheinlich und ein darauf basierender Angriff in absehbarer Zeit noch viel unwahrscheinlicher. Trotzdem wird man wohl irgendwann den Hash Algorithmus wechseln, vielleicht auch weil sich bei Quantencomputing mehr tut.

Leider finden sich zum Suchbegriff „Kollissionsresistenz“ auf durchaus großen Seiten falsche Aussagen, z.B:

Eine Hash-Funktion muss kollisionsresistent sein. Dadurch wird sichergestellt, dass zwei verschiedene Eingaben niemals denselben Hashwert erzeugen können.

auf Bitpanda.com

Auf Wikipedia wird es besser formuliert, da hervorgehoben wird, dass es „schwer“ sein muss.

Eine Funktion (in diesem Zusammenhang fast immer eine Einwegfunktion) wird als kollisionsresistent bezeichnet, wenn es „schwer“ ist, verschiedene Eingaben zu finden, die auf denselben Wert abgebildet werden. Insbesondere bei kryptographischen Hashfunktionen handelt es sich hierbei um eine übliche Anforderung, deren Bruch in der Regel als Bruch der kompletten Hashfunktion betrachtet wird.

Was die Bitpanda Seite meint, wird auf Wikipedia als " Perfekte Kollisionsresistenz" bezeichnet.

3 „Gefällt mir“

Da hast du recht und ich habe diesen Zusammenhang unten im Post richtig gestellt: für die meisten Anwendungen wird angenommen, dass für kleine Eingangswörter die Hashfunktion bijektiv ist.

Was Asynchron in der Schwierigkeit bedeuten hab ich im nächsten Absatz erklärt: Die Berechnung des Hashes geht schnell, die Umkehrfunktion nicht.

Du hast recht das der Code Quelloffen ist und damit auch so ergründet werden kann. Mir geht es hier darum, dass anhand eines Beispiels von doppelter Eingabe die zum gleichen Hash führen Informationen gewonnen werden können die auch andere Doppelte Eingaben leichter finden lassen. Es gibt den Angreifern ein Informationsgewinn den sie Nutzen können aber es ist natürlich trotzdem ungewiss ob diese Informationen nützlich sind.

Ok, was machst du wenn der Block 792546 den gleichen Hashwert hat wie block 314159? Der Nächste Block würde laut letzter Haschwert ja sowohl auf 792546 als auf 314159 aufbauen. Werden alle Blöcke dazwischen deswegen ungültig weil der Block 792547 eine bessere Difficulty hat als Block 314160 ?

Ich sage ja das das Problem gelöst werden kann, aber ich bin mir nicht sicher ob das alle Nodes so schon implementiert haben.

Ok, wenn das so ist dann sollte es keine Probleme geben :+1:

1 „Gefällt mir“

Hallo!

Das ist relativ trivial gelöst weil zumindest alle Implementierungen die ich kennen gelernt habe, zuerst einmal die Blocknummern betrachten.
Wenn also der Nachfolger von Block 792546 gefunden wird, dann wird in der Datenbank der Block 792547 angelegt, der den Hash von 792546 beinhaltet. Dass 792546 der Vorgänger von 792547 ist, wird einfach der Blocknummer entnommen. Diese ist oft (immer?) der Dateiname. Der von dir erwähnte Block 314159 wird gar nicht betrachtet, weil seine Blocknummer sicher nicht der richtige Vorgänger sein kann.

Blockhashes garantieren, dass eine richtige Version der Kette gebaut wird, aber im ersten Schritt werden die Blöcke einfach ihrer Blocknummer nach sortiert und dann anschließend mit dem Hash validiert.

3 „Gefällt mir“