Salt beim generieren des Seeds

Man nimmt ja die 24 Wörter und übergibt sie mit dem Salt der PBKDF2 Funktion.

The salt is composed of the string constant „mnemonic“ concatenated with an optional user-supplied passphrase string.

Verstehe aber string constant „mnemonic“ nicht.
Was soll das sein ? Meinen die die 24 Wörter ?

VG

https://www.cs.utexas.edu/users/moore/acl2/manuals/current/manual/index-seo.php/BITCOIN____BIP39-MNEMONIC-TO-SEED

Ja, der Mnemonic sind deine xx Wörter.

Die konstante Zeichenfolge „mnemonic“ ist „mnemonic“. Wenn deine Passphrase „DeezNuts“ ist, und du die beiden konkatenierst, ist das resultierende Salz „mnemonicDeezNuts“ oder so.

2 „Gefällt mir“

Aber was bringt das ? Der Grund für den Salt ist ja, dass man keine Nachschlagetabelle für Brutforce erstellen kann. Wenn ich aber weiss, dass der Salt immer „mnemonic“ ist … ??? :thinking:

Das BIP39 sagt:

A user may decide to protect their mnemonic with a passphrase. If a passphrase is not present, an empty string „“ is used instead.

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).

Es ist also genauso wie @mowtan sagt.

Als Password wird der „mnemonic sentence“ verwendet, z.B. folgender String inkl. Leerzeichen:

true next sock harbor flush donkey spend virtual clown misery globe belt metal universe aspect anchor party lesson milk sort ship ecology tiny general

Als Salt wird dem String „mnemonic“ einfach entweder die Passphrase oder gar nichts angehängt, z.B.:

mnemonicSchatz1234

Da der Normalanwender bei einem frei wählbaren Passwort gerne mal „123456“ oder „Passwort!“ verwendet, macht ein Salt bei solchen Anwendungen Sinn. Die Liste beliebtester Passwörter könnte man sonst, wie du schon sagst, ohne Probleme durch Key Stretching Alogrithmen wie PBKDF2 jagen, um sie in vorbereiteten Listen/Tabellen zu speichern.

Bei 24 zufällig gewählten BIP39 Wörtern, mit einer Entropie von 256 Bit, braucht man tatsächlich keinen Salt. Schließlich kann man keine 2^{256} Passwörter vorverarbeiten, um sie in einer Tabelle zu hinterlegen. Sonst wäre ja auch jede Wallet ohne optionale Passphrase unsicher.

Die BIP39 Passphrase hat zahlreiche Use Cases, unabhängig davon als eigentlicher Salt zu dienen. Siehe die ganzen Artikel und Beiträge zur Passhrase hier im Forum (z.B. Optionale Passphrase ("25. Wort") - Braucht man das wirklich?).

Dass man die Passphrase als PBKDF2 Salt verwendet kommt vermutlich daher, dass man auf diese Weise ganz einfach den Mnemonic Sentence mit einer Passphrase zu einem 512 Bit Seed verwursten kann. Sicher weiß ich das aber auch nicht.

1 „Gefällt mir“

Du hast natürlich recht, dass im Fall, dass keine Passphrase verwendet wird, das Salz hier ein bisschen sinnlos anmutet. Klar, man verhindert, dass ein Angreifer fertige ungesalzene rainbow tables verwendet, aber die gibt es für diese hohen Entropien sowieso nicht.

Meine Vermutung ist: Es wird hier mit PBKDF2 richtigerweise ein kryptographischer Standard verwendet, und dieser Standard sieht nun mal vor, dass ein Salz übergeben wird – also macht man es halt. Der Standard empfiehlt, dass das Salz mindestens 64 bit lang sein soll – also nimmt man halt das Wort „mnemonic“, das 64 bit lang ist.