Blockchain/Niveau II · Mechanik/2.1 Kryptographie/Lektion 2
HASH160: erst SHA-256, dann RIPEMD-160
Ein doppelter Hash, der Schlüssel verkürzt – und die Schwäche, die er verbirgt
MaterialienEin Block-Explorer wie blockstream.info oder blockchain.comEine Beispielsammlung von Bitcoin-AdressenEin Texteditor oder eine Tabellenkalkulation
Neugier
- Warum sollte Bitcoin nacheinander zwei verschiedene Hash-Funktionen verwenden?
- Was bietet ein 160-Bit-Hash, das ein 256-Bit-Hash nicht bietet?
- Wie kann ein 20-Byte-Hash gleichzeitig sicher und anfällig sein?
Erkunden
- Ein roher öffentlicher Schlüssel ist in Bitcoin in komprimierter Form 33 Bytes lang. Das ist zu lang für eine effiziente Verwendung in Transaktionen. Um ihn ohne Verlust an kryptografischer Integrität zu verkürzen, wendet Bitcoin ein zweistufiges Verfahren an: SHA-256, gefolgt von RIPEMD-160. Diese Kombination heißt HASH160 und ergibt eine 160-Bit-Ausgabe (20 Bytes), die kompakt genug für die Adresskodierung ist.
- RIPEMD-160, 1996 von Hans Dobbertin, Antoon Bosselaers und Bart Preneel entwickelt, liefert eine kürzere Ausgabe als SHA-256 und ging aus einem offenen akademischen Entwurfsprozess hervor. Zunächst wird SHA-256 auf den öffentlichen Schlüssel (bzw. bei P2SH auf das Skript) angewendet, anschließend RIPEMD-160 auf die Ausgabe von SHA-256. Diese Abfolge bietet ein Gleichgewicht zwischen Sicherheit und Effizienz und wird in Outputs vom Typ Pay-to-PubKey-Hash (P2PKH), Pay-to-Script-Hash (P2SH) und Pay-to-Witness-PubKey-Hash (P2WPKH) verwendet.
- Der Einsatz zweier unterschiedlicher Hash-Funktionen fügt eine zusätzliche Verteidigungsebene im Sinne von Defense in Depth hinzu. Die Verschachtelung hilft vor allem gegen Preimage-Angriffe, denn einen Schlüssel zu finden, der zu einem gegebenen Hash passt, würde bedeuten, beide Funktionen zu überwinden; gegen Kollisionen hilft sie nicht, denn jede SHA-256-Kollision ist zugleich eine HASH160-Kollision. Allerdings bedeuten 160 Bit Ausgabe eine Kollisionsresistenz von etwa 80 Bit, was für Adress-Outputs mit einem einzigen Schlüssel akzeptabel ist. Problematisch wird dies bei gemeinsam genutzten Skripten, zu denen mehrere Parteien beitragen; deshalb verwenden SegWit und Taproot für native Skripte 32-Byte-Werte.
- Eine verbreitete Behauptung lautet, dass das Hashen des Schlüssels Coins vor zukünftigen Quantencomputern schützt. Der Schutz ist nur teilweise gegeben. Beim Ausgeben wird der öffentliche Schlüssel offengelegt, daher gilt der Schutz nur für Outputs, deren Schlüssel noch nie gezeigt wurden; die Wiederverwendung von Adressen hebt ihn auf; und Taproot-Outputs legen einen öffentlichen Schlüssel direkt on-chain ab. Ein leistungsfähiger Quantencomputer würde jeden offengelegten Schlüssel bedrohen.
- Um aus einem öffentlichen Schlüssel eine Bitcoin-Adresse zu erzeugen, wird HASH160 angewendet; dem Ergebnis wird dann eine Netzwerkkennung vorangestellt (0x00 für Mainnet-P2PKH), gefolgt von einer 4-Byte-Prüfsumme, die aus doppeltem SHA-256 abgeleitet wird. Diese 25-Byte-Folge wird anschließend Base58-kodiert, um eine für Menschen lesbare Adresse zu erzeugen. Diese Kodierung entfernt mehrdeutige Zeichen und enthält eine Prüfsumme, um Übertragungsfehler zu erkennen.
- Um dies in der Praxis zu sehen, öffnen Sie einen Block-Explorer und suchen Sie nach einer P2PKH-Transaktion. Suchen Sie das Feld scriptPubKey, das den 20-Byte-Hash enthalten sollte. Vergleichen Sie diesen mit dem öffentlichen Schlüssel, der offengelegt wurde, als der Output ausgegeben wurde. Sie werden sehen, dass der öffentliche Schlüssel länger ist und der Hash die verkürzte, kodierte Version ist, die in der Adresse verwendet wird.
Kernfakten
- HASH160 ist die Kombination aus SHA-256 gefolgt von RIPEMD-160.
- Die Ausgabe von HASH160 umfasst 160 Bit (20 Bytes).
- RIPEMD-160 wurde 1996 von Hans Dobbertin, Antoon Bosselaers und Bart Preneel entwickelt.
- HASH160 wird in den Ausgabeskripten von P2PKH, P2SH und P2WPKH verwendet.
- 160-Bit-Hash-Ausgaben bieten eine Kollisionsresistenz von etwa 80 Bit.
- Hashing verbirgt einen öffentlichen Schlüssel nur, bis ausgegeben wird; Taproot-Outputs zeigen einen Schlüssel direkt.
Übung neun, sechs, drei, eins
9SammelnListen Sie 9 Bitcoin-Adressen auf. Notieren Sie das Format (beginnend mit 1, 3, bc1q, bc1p usw.) sowie ihre Länge in Zeichen.
6GruppierenGruppieren Sie die 9 Adressen nach Kodierungs- und Skripttyp in 6 Gruppen (z. B. Base58, Bech32, SegWit usw.).
3VerdichtenReduzieren Sie die 6 Gruppen auf 3 Prinzipien, die erklären, warum Bitcoin unterschiedliche Adressformate verwendet.
1KristallisierenSchreiben Sie einen Satz, der erklärt, warum Bitcoin zwei Hash-Funktionen verwendet, um eine Adresse zu erzeugen.
Faktcheck
Datumsangaben, Zahlen und Behauptungen wurden mit den unten aufgeführten veröffentlichten Quellen abgeglichen.