Vai al contenuto
buybitcoinsmart

Glossario / Indirizzi e chiavi

Derivazione hardened vs non hardened

Che cos'è Derivazione hardened vs non hardened?
La derivazione hardened e quella non hardened dividono a metà gli indici figli di BIP-32: le chiavi figlie non hardened si possono calcolare da una chiave pubblica estesa, quelle hardened no.

Specificato nel BIP-32.

L'hardening è un confine nel tuo percorso di derivazione, non un'impostazione che attivi e disattivi. BIP-32 è stato assegnato l'11 febbraio 2012 con la sola derivazione non hardened; la derivazione privata per gli indici pari o superiori a 0x80000000 è stata aggiunta il 16 aprile 2013, e quelle chiavi sono state rinominate hardened il 15 gennaio 2014. Il punto in cui cade quel confine decide quanto del tuo wallet consegna una chiave pubblica estesa condivisa.

Come funziona

La derivazione non hardened ha una proprietà che la derivazione hardened deliberatamente non ha, e BIP-32 registra la differenza come un'identità algebrica. Indica con N() la neutering, il passaggio che scarta la metà privata di una chiave estesa e conserva il chain code di 32 byte. Lungo i livelli non hardened, N(m/a/b/c) è uguale a N(m)/a/b/c, quindi applicare la neutering prima di derivare e applicarla dopo la derivazione porta alla stessa chiave. A un livello hardened la riscrittura non vale: N(m/a') non può diventare N(m)/a', perché la derivazione pubblica è definita solo per le chiavi figlie non hardened e restituisce un errore per qualsiasi altra.

Dal punto di vista meccanico le due modalità differiscono per un solo campo. Entrambe usano il chain code della chiave genitore come chiave di un HMAC-SHA512 e aggiungono l'indice di 4 byte. La modalità non hardened fornisce la chiave pubblica compressa della chiave genitore; la modalità hardened fornisce il segreto della chiave genitore, riempito con un byte zero iniziale fino alla stessa larghezza di 33 byte. Nulla che possieda solo una xpub dispone di quel secondo input, quindi la derivazione si ferma al confine.

BIP-32 è insolitamente esplicito su ciò che le chiavi non hardened non riescono a proteggere. La sua sezione sulla sicurezza elenca due proprietà come assenti e non come presenti: data una chiave pubblica estesa genitore e una chiave pubblica figlia, trovare l'indice non è difficile, e data quella stessa chiave pubblica estesa genitore più una qualsiasi chiave privata figlia non hardened, recuperare la chiave privata estesa genitore non è difficile neppure questo. La prima ti costa la privacy. La seconda ti costa il ramo.

Dove lo vedi

I livelli non hardened sono ciò che rende utile esportare una chiave pubblica estesa, e BIP-32 dedica una sezione agli accordi di condivisione costruiti su di essi. Un revisore a cui vengono consegnate le chiavi pubbliche estese dei conti vede ogni pagamento in entrata e in uscita da ogni conto e nessuna chiave segreta. Due aziende che fanno trading spesso possono condividere la catena esterna di un singolo conto come indirizzo fisso su cui pagare, così nessuna delle due deve chiedere un indirizzo nuovo per ogni trasferimento. Un negozio online può consegnare lo stesso tipo di chiave al proprio server web, che poi genera indirizzi di ricezione dai quali non ha alcun potere di spesa.

La struttura che pone il confine a livello di conto è un consiglio, non una regola. BIP-32 definisce la propria struttura master, account, chain e subchain solo orientativa e dice alle implementazioni che possono discostarsene per esigenze specifiche, ed è per questo che un wallet conforme può applicare l'hardening a più livelli del wallet conforme che gli sta accanto.

Vale la pena conoscere una trappola di interoperabilità, perché la specifica è stata corretta due volte per questa ragione. I vettori di test per la derivazione hardened con zeri iniziali sono stati aggiunti il 24 febbraio 2017 e di nuovo il 4 novembre 2020. L'input hardened è fissato a 33 byte, un byte zero seguito dal segreto di 32 byte, quindi un software che taglia uno zero iniziale invece di mantenere quella larghezza calcola l'hash di dati diversi, produce un ramo diverso e trova un wallet vuoto quando qualcuno ripristina quel seed in un altro programma. La derivazione non hardened non incontra mai questo difetto, perché una chiave pubblica compressa inizia sempre con 0x02 o 0x03 e quindi non ha alcuno zero iniziale da perdere.

Domande frequenti

Qualcuno può derivare i miei conti hardened da una chiave pubblica estesa che ho condiviso?

No. La derivazione pubblica è definita solo per le chiavi figlie non hardened e restituisce un errore per qualsiasi indice pari o superiore a 0x80000000, quindi una chiave pubblica estesa non può superare un livello hardened. Chi la possiede vede il ramo al di sotto del livello che hai esportato e nulla al di sopra o accanto.

Se la derivazione hardened è più sicura, perché BIP-32 mantiene comunque la derivazione non hardened?

Perché la derivazione non hardened è l'unica che una chiave pubblica estesa può eseguire. I wallet di sola osservazione, l'accesso di un revisore a ogni conto e gli indirizzi di ricezione generati su un server web che non custodisce segreti dipendono tutti da essa. Applicare l'hardening a ogni livello renderebbe inutile una chiave pubblica estesa.

Perché BIP-32 ha aggiunto vettori di test per la derivazione hardened con zeri iniziali?

Perché l'input hardened è fissato a 33 byte, un byte zero seguito dal segreto di 32 byte, quindi un'implementazione che taglia uno zero iniziale invece di mantenere quella larghezza calcola l'hash di dati diversi e deriva un ramo diverso. Quei vettori sono stati aggiunti il 24 febbraio 2017 e di nuovo il 4 novembre 2020, e un'implementazione che non li supera ripristinerà un seed sugli indirizzi sbagliati.

Leggi anche

Termini correlati

Altro in Indirizzi e chiavi

Leggi questa pagina in inglese