Das hatte ich bei dir glaube ich schon einmal gelesen. Auch wenn es etwas Richtung OT abdriftet würde mich das kurz im Detail interessieren.
Im BIP39 steht:
To create a binary seed from the mnemonic, we use the PBKDF2 function with a mnemonic sentence (in UTF-8 NFKD) used as the password and the string „mnemonic“ + passphrase (again in UTF-8 NFKD) used as the salt. The iteration count is set to 2048 and HMAC-SHA512 is used as the pseudo-random function. The length of the derived key is 512 bits (= 64 bytes).
Bei Wikipedia zu PBKDF2:
The PBKDF2 key derivation function has five input parameters:
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
Und zur verwendeten Pseudo Random Function (PRF) HMAC-SHA512:
H is a cryptographic hash function
m is the message to be authenticated
K is the secret key
K’ is a block-sized key derived from the secret key, K; either by padding to the right with 0s up to the block size, or by hashing down to less than or equal to the block size first and then padding to the right with zeros
Ich finde die Bezeichnungen verwirrend. Der Mnemonic wird als Password und ‚mnemonic‘ + Passphrase als Salt an PBKDF2 übergeben. Soweit klar. Aber reicht PBKDF2 das Password dann als message m oder als secret key K an HMAC-SHA512 weiter?
Den letzteren Fall verstehe ich so, dass der Mnemonic, der mehr als 64 Byte hat, bei jeder Iteration bereits einmal mit SHA512 vorgehasht werden muss, um K’ auf die gewünschte Länge zu bringen. Man hätte dann zusammen mit dem eigentlich Hash zwei Hashes pro Iteration (4096 total).
Im ersteren Fall, also als message m würde allerdings nach meinem Verständnis nicht vorgehasht werden müssem, da ‚mnemonic‘ + Passphrase weniger als 64 Byte haben.
Kannst du den ersten Fall so bestätigen? Normalerweise kommt man mit diesem Detail nicht in Berührung, da man nur PBKDF2 mit den entsprechenden Argumenten aufruft.
Anscheinend wird und wurde auch bei Bitcoin schon länger diskutiert, ob die Collission Resistance oder die Preimage Resistance der Hash-Funktionen entscheidend ist.
Bei meinen Zahlen oben zur Sicherheit ggü. Brute Force Attacken habe ich mich auf die Preimage Resistance bezogen. Also wie aufwendig man den Klartext (Mnemonic oder Private Key) zu einem gegebenen Hash (Adresse) suchen muss.
Die Collission Resistance gibt dagegen an, wie aufwendig man nach zwei Klartexten suchen muss, die einen (beliebigen) gemeinsamen Hash ergeben, Also in unserem Kontext zwei Mnemonics oder Private Keys mit gemeinsamer Adresse.
Dieser Aufwand ist wegen des Geburtstagsparadoxons typischerweise wesentlich geringer, Größenordnung = Wurzel(Hash-Sicherheit). Deshalb empfiehlt das BSI auch mindestens 240 Bit Hash-Länge, damit eine Kollisionssicherheit von 120 Bit erreicht wird (Seite 41).
Bei SHA-256 hat man also 128 Bit Sicherheit gegen Kollisionen. Bei RIPEMD160 nur 80 Bit. Daher kommen ziemlich sicher die Zahlen in Mastering Bitcoin.
Hier eine interessante Diskussion in der Bitcoin Developers Mailing Liste aus 2016, u.a. zwischen Gavin Andresen und Pieter Wuille, genau zu diesem Thema:
- [bitcoin-dev] Time to worry about 80-bit collision attacks or not?
(Diese Diskussion ist im BIP341 verlinkt, deshalb habe ich sie gefunden . Man kann sich mit „Next message“ durchklicken)
Pieter Wuille meinte, dass die Collission Resistance auch bei Bitcoin entscheidend ist. Für mich hört es sich etwas sehr konstruiert an, aber ich habe es wahrscheinlich noch nicht ganz verstanden.
P. Wuille meint, ein Betrüger könnte nach zwei unterschiedlichen Skripten suchen, die einen gemeinsamen Hash ergeben. Eines der Skripte könnte man nun als Nachweis ggü. jemandem verwenden, um einen (Zahlungs-)vorgang nachzuweisen, wobei nachher nur der Hash in der Transaktion steht. Anschließend verwendet der Betrüger aber das andere Skript mit dem selben Hash, um den UTXO anderweitig zu transferieren.
Lange Rede, kurzer Sinn:
Wenn diese Entwickler recht haben, dann ist ein RIPEMD160 Hash auch bei Bitcoin schon nicht mehr ausreichend.
Wem sagst du das…
So wie ich es verstehe, müsste man Skripte bzw. P2WSH Adressen auch für eine normale Native Segwit Single Sig Wallet verwenden können. Ich habe bei der Walleteinrichtung noch nie darauf geachtet. Wahrscheinlich ist P2WPKH Standard.