Warum verwendet BIP44 überhaupt nicht gehärtete Pfade?

BIP44 verwendet auf den meisten Ebenen Härtung/private Ableitung :

m / purpose' / coin_type' / account' / change / address_index

aber nicht auf der Ebene change und address_index. Erstens, was bringt das Härten und zweitens, was wäre der Nachteil, wenn man immer härtet, außer dass man auf dieser Ebene nur die Hälfte von 2³² Pfaden hat?

Soweit ich verstanden habe, ermöglichen nicht gehärtete Pfade bei Vorhandensein nur eines einfachen privaten Schlüssels, den xpriv-Schlüssel der Adresse zu erfahren, und wenn dieser nicht gehärtet ist, auch den nächsthöheren xpriv-Schlüssel bis hin zum ersten gehärteten Weg. Ist das so, und wenn ja, welchen Vorteil hätte es, außer 2 Milliarden Adressen mehr im externen und Änderungspfad dieses Kontos bereitzustellen, vorausgesetzt, dass der Überlauf in gehärtete Adressräume zulässig wäre?

Ein kleiner Code, um zu sehen, ob/was ich richtig gemacht habe:

    var wallet = HDPrivateKey()
    var hardened = wallet.derive(4, true)
    var nonHardened = hardened.derive(4, false)

    console.log(hardened.publicKey.toAddress().toString())
    // the payee gets this anyway
    console.log(hardened.publicKey.toString())
    // once I spend from my address, I have to reveal this. It's probably secure to
    // re-use the address but better not to.
    console.log(hardened.privateKey.toString())
    // at this point, you can spend funds that are received to above address and
    // only that
    console.log(hardened.xpubkey)
    // you now know all my addresses I could derive from hardened. Do you know any
    // private keys except for the one I explicitly shared a line before?
    console.log(hardened.xprivkey)
    // now you can spend from all the addresses derivable from hardened but learn
    // nothing else about wallet.

    console.log(nonHardened.publicKey.toAddress().toString())
    console.log(nonHardened.publicKey.toString())
    console.log(nonHardened.privateKey.toString())
    console.log(nonHardened.xpubkey)
    // in difference to the hardened case, you would now learn about nonHardened but
    // also (once again) about hardened? What could you actually learn?
    console.log(nonHardened.xprivkey)
    // would this line leak any information that wasn't already leaked in the last
    // block?

Die Ausgabe:

    1c6dKRqvYPiCQx2R3u75pxGfy15g7jfU4
    0342619d3209b6859f4d88e3b1deaa1acee734c94d625b7d59b286b6842c90bd60
    4c461799315979063858208f6c3e8b33f29ceb10c42389690cd0a20427715845
    xpub68GCDysH8nE2Nuodq1ncV4jYiWvajzZyjVr6Pt8N46QAKC3CPxjj8G6AcE7sdvGypzXZFRRHYjRokhTty6LC8MErRifGiJFeTbTBYL9QfTg
    xprv9uGqpULPJQfjARjAizFc7vnpAV66LXr8NGvVbVikVksBSPi3rRRUaTmgkwDii6TFzWWFsch7Qc2v6eM1ZcJAJLv8ybvw7YY4qwLwvfFJoAp

    1NsxMLRhXasbHaskKVQK4qiJpBZgjTs3Aq
    026653baf78fb78cfb9845faa43080dfc452991422edc67f5ba085d02786364670
    afdb89aaf2f02987dfc47cc655fb4e1fb5cdd545af44875b4176805dc8f60852
    xpub69pTp8pV8Fcmkf3HuiWnzGE42MJcMrTtegoZaLApLUSvhugH6YNKgTtVfk2asMNZWKynCpFoCGePbHLfwJqsLtPskSv5cPF6j1FqmdaNCrE
    xprv9vq7QdHbHt4UYAxpogynd8HKUKU7xPk3HTsxmwmCn8uwq7M8Z1458fa1pVZCfWYWUWMG7p7b99NzJnSwZAnQR6EmN4awbcKZrfdrcmXAXqy

Antworten (1)

Warum verwendet BIP44 überhaupt nicht gehärtete Pfade?

Stellen Sie sich vor, Sie haben eine Website, auf der Sie Dinge verkaufen möchten. Sie brauchen die Website, um Adressen generieren zu können, aber Sie möchten nicht, dass sie von ihnen Geld ausgeben kann.

Nun, Sie können der Website einen erweiterten öffentlichen Schlüssel auf Kontoebene geben, und sie kann daraus die nicht gehärteten Adressen generieren, die Sie benötigen. Sie könnten keine gehärteten Adressen erstellen; Sie benötigen den privaten Schlüssel des Kontos, um neue gehärtete Adressen zu erstellen.

// you now know all my addresses I could derive from hardened. Do you know any
// private keys except for the one I explicitly shared a line before?

Nein. Ich kenne einen privaten Schlüssel, aber ich kann den übergeordneten Schlüssel oder irgendwelche Geschwister nicht herausfinden.

// in difference to the hardened case, you would now learn about nonHardened but
// also (once again) about hardened? What could you actually learn? 

Obwohl dieser Schlüssel nicht gehärtet ist, kenne ich den Kettencode des übergeordneten Schlüssels nicht, sodass ich keine Geschwisterschlüssel kompromittieren oder diesen Schlüssel sogar mit einem seiner Geschwister verknüpfen kann.

// would this line leak any information that wasn't already leaked in the last
// block?

Nö. Allerdings, wenn Sie auch ausgesetzt sind

wallet.derive("m").xpubkey

dann hätte ich genug Informationen, um Ihre Brieftasche zu kompromittieren.

Die Kontoebene in BIP44 ist gehärtet, erlaubt jedoch die Ableitung der externen und Änderungsadressen.
@Giszmo, ja, aber seine Kinder sind nicht gehärtet.
Ich kann perfekt von gehärteten xpriv- und xpub-Schlüsseln ableiten. hardened.derive(1, true).derive(1, true).xprivkey is "xprv9zTLKFNn1CmW8oB3s8L1B4Bvn9E4nLmg2juMQv2HwbhhQhufDivMWcNSiio59CiNMXkUCBS4Npi9KAtefwB4KUNkrTkprbECsMLg3yEvJM8".
@Giszmo Können Sie einen untergeordneten öffentlichen Schlüssel aus einem gehärteten öffentlichen Schlüssel generieren?
so etwas wie HDPrivateKey().derive(1,true).hdPublicKey.publicKey.toAddress().toString()? Spuckt eine Adresse aus, wie ich es erwartet hätte.
@Giszmo Nein, ein untergeordneter öffentlicher Schlüssel.
Ok, xpriv (gehärtet oder nicht) kann von jedem gehärteten oder nicht gehärteten privaten oder öffentlichen Unterschlüssel abgeleitet werden, während xpub (gehärtet oder nicht) nur von den nicht gehärteten öffentlichen Unterschlüsseln abgeleitet werden kann.