Wo wird Double Hashing in Bitcoin durchgeführt?

Wo im Bitcoin-Protokoll wird SHA256(SHA256(x)) ausgeführt und warum?

Antworten (7)

Bitcoin verwendet fast überall doppeltes Hashing in einer von zwei Varianten:

  • RIPEMD160(SHA256(x)) namens Hash160, das eine 160-Bit-Ausgabe erzeugt

    • Hashing des öffentlichen Schlüssels, um einen Teil einer Bitcoin-Adresse zu generieren
  • SHA256(SHA256(x)) namens Hash256, das eine 256-Bit-Ausgabe erzeugt

    • Erzeugen der Prüfsumme in einer Bitcoin-Adresse
    • Hashing des Blocks in einem Merkle-Baum
    • Verknüpfen von Transaktionsausgaben und -eingaben
    • Hash des Blockheaders (und damit der Proof of Work und der Link zum vorherigen Block)

Es scheint, als hätte Satoshi Hash256 gewählt, wenn Kollisionen ein Problem darstellen, und Hash160, wenn nur (mehrere) zweite Vorabbilder eine Rolle spielen. Dies steht im Einklang mit dem Ziel, 128 Bit Sicherheit zu erreichen.

Sie benötigen einen 2*n-Bit-Hash, um eine n-Bit-Kollisionsresistenz zu erreichen, und Sie benötigen einen at*n-Bit-Hash, um eine n-Bit-Sekunden-Pre-Image-Resistenz zu erreichen. Wenn wir von konservativen 4 Milliarden Zielen und einem 128-Bit-Sicherheitsniveau ausgehen, führt dies zu 256-Bit-Hashes für Kollisionsresistenz und 160-Bit-Hashes für Multi-Target-Second-Preimages.

Warum hasht er also zweimal? Ich vermute, es ist, um Längenverlängerungsangriffe zu verhindern.

SHA-2 leidet wie alle Merkle-Damgard-Hashes unter einer Eigenschaft namens "Längenerweiterung". Dadurch kann ein Angreifer, der H(x) kennt, H(x||y) berechnen, ohne x zu kennen. Dies ist normalerweise kein Problem, aber es gibt einige Anwendungen, bei denen die Sicherheit vollständig aufgehoben wird. Das relevanteste Beispiel ist die Verwendung von H(k||m) als MAC, wobei ein Angreifer leicht einen MAC für m||m' berechnen kann. Ich glaube nicht, dass Bitcoin jemals Hashes auf eine Weise verwendet, die unter Längenerweiterungen leiden würde, aber ich denke, Satoshi hat sich für die sichere Wahl entschieden, dies überall zu verhindern.

Um diese Eigenschaft zu vermeiden, schlugen Ferguson und Schneier vor, SHA256d = SHA256(SHA256(x)) zu verwenden, wodurch Angriffe mit Längenerweiterung vermieden werden. Diese Konstruktion hat einige kleinere Schwächen (nicht relevant für Bitcoin), daher würde ich sie nicht für neue Protokolle empfehlen und stattdessen HMAC mit konstantem Schlüssel oder abgeschnittenem SHA512 verwenden.

Etwas verwandte Lektüre:

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.

Hier ist die Haupt-Hashing-Funktion:

template<typename T1>
inline uint256 Hash(const T1 pbegin, const T1 pend)
{
    static unsigned char pblank[1];
    uint256 hash1;
    SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
    uint256 hash2;
    SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
    return hash2;
}

Ich würde sagen, überall, wo Anrufe getätigt werden, die SHA256 zweimal verwenden.

Warum, siehe hier .

Wir führen SHA-256d auf erweitertem RIPEMD-160-Hash aus und führen SHA-256 zweimal darauf aus. Wir nehmen die ersten 4 Bytes unseres SHA-256d-Hash als Prüfsumme und hängen sie an das Ende unseres erweiterten RIPEMD-160-Hash an. Nachdem wir das Ergebnis in base58 konvertiert haben, haben wir endlich unsere Bitcoin-Adresse.

Bitcoin verwendet fast überall Doppel-Hashing>SHA256[SH256[X]], genannt Hash256, das ein 160-Bit-Out erzeugt. Transaktionsausgaben und -eingaben verknüpfen. Checsum in einer Bitcoin-Adresse generieren. Block in einem Merkle-Baum hashen.

Das Hashen des Blocks in einem Merkle-Baum und mit zwei SHA256-Runden erhöht die Sicherheit, sodass beide Funktionen unterbrochen werden müssten, um den Hash rückgängig zu machen.

I. So generieren Sie eine Bitcoin-Adresse aus einem öffentlichen Schlüssel:

  1. Führen Sie die Hash-Funktion SHA-256 auf dem Schlüssel aus
  2. Führen Sie RIPEMD-160 auf dem Schlüssel aus. Dies komprimiert die Adressgröße auf 160 Bit und ist als "doppeltes Hashing" (HASH160) bekannt. Dies gibt uns den Hash des öffentlichen Schlüssels.
  3. Fügen Sie ein Versionsbyte vor dem RIPEMD-160-Hash hinzu und geben Sie unser Netzwerk an
  4. Führen Sie eine Base58check-Codierung aus, um die Prüfsumme zu erhalten.
  5. Führen Sie SHA-256 zweimal auf RIPEMD-160 aus
  6. Nehmen Sie die ersten 4 Byte des SHA-256d-Hash als Prüfsumme und fügen Sie sie am Ende des erweiterten RIPEMD-160-Hash hinzu
  7. Konvertieren Sie das Ergebnis in die Basis 58, um die Bitcoin-Adresse zu erhalten

II. Um die Sicherheit zu erhöhen, indem SHA-256 manipulationssicher gemacht wird III. Auf Meldungseingängen und -ausgängen

Absender geben ein Sperrskript an und Empfänger geben ein Entsperrskript an. Diese gestapelten Hashes bestätigen den Arbeitsnachweis des sendenden UTXO und die Legitimität des Empfängers, die Transaktion zu erhalten.

Das ergibt keinen Sinn und beantwortet die Frage nicht