Riguardo ai brainwallet molti avranno già letto che ne viene spesso sconsigliato l'uso perchè insicuro.
Sono insicuri perchè il metodo per ricavare la chiave privata da una frase (attraverso SHA256) è facilmente attaccabile attraverso dictionary attack.
Cioè provando tante combinazioni di parole e frase conosciute.
I calcolatori di oggi (FPGA/ASIC) sono in grado di provare tantissime combinazioni in poco tempo, e inoltre comunque spesso e volentieri l'essere umano non è grado di scegliere delle combinazioni non comuni.
Questo vuol dire è veramente facile per un calcolatore trovare le frasi degli utenti in poco tempo e prendere i loro Bitcoin.
Viene quindi proposta una soluzione dove invece di SHA256, si fa uso di Scrypt (
https://en.wikipedia.org/wiki/Scrypt)
Questa funzione richiede un uso intenso di molta memoria rispetto allo SHA256, e quindi rende molto più difficoltoso un attacco bruteforce.
Questi sono due proposte che fanno uso di questo metodo:
Sito: https://brainwallet.ioCodice: https://github.com/routman/brainwallet.ioSito: https://keybase.io/warpCodice: https://github.com/keybase/warpwalletEDIT:Fork di Warp che genera BIP39 mnemonic e BIP32 extended keys
https://github.com/Logicwax/PortalWalletEntrambi non sono servizi "remoti", nel senso che le pagine possono essere salvate in locale, e il brainwallet generato offline.
Si può anche fare appunto scaricando direttamente il codice dal loro repository Github.
Oltre alla passphrase (la lista di parole), viene chiesto anche un/il salt (
https://it.wikipedia.org/wiki/Sale_(crittografia) )
Questo per rendere ancora più difficoltoso l'uso di un bruteforce casuale sulle parole, visto che servirebbe sapere con assoluta certezza anche il salt.
Si consiglia quindi di non usare informazioni personali per scegliere il salt.
Ma come funziona esattamente?Prendendo per esempio brainwallet.io, la libreria usata per generare la chiave via browser, usando scrypt, è questa:
Test da browser: http://kclnn.github.io/js-scrypt-async/test_scrypt_browser.htmlCodice: https://github.com/kclnn/js-scrypt-asyncLe impostazioni usate da brainwallet.io sono:N = 262144 (2^18)
r= 8
p = 1
# bytes produced = 32
Queste impostazioni potete anche cambiarle, e alzandole il costo di memoria e computazionale aumenterà, fino ad anche non essere nemmeno eseguito dal vostro comune computer ...
Quindi, nel caso vogliate ottenere un impostazione ancora più difficile da forzare, potete farvene una vostra personalizzata, diversa da quella proposta dal sito/codice. (certo, dovrete poi ricordarvela insieme alle parole del brainwallet)
Brainwallet.io, in una qualunque delle scelte per il salt che mettete, mettera uno di seguito all'altro i dati inseriti.
Quindi se i dati saranno, ad esempio:Name: Gino
Email:
[email protected]Phone: 9836873346
Date of Birth: 04/12/1940
Il salt sarà allora:[email protected]/12/1940
Quindi, usando certi dati, e la vostra passphrase, otterrete da brainwallet.io una chiave privata, potrete ottenere la stessa dal sito già indicato sopra:
http://kclnn.github.io/js-scrypt-async/test_scrypt_browser.htmlIn "Password" dovrete inserire la vostra passphrase, nel "Salt" appunto il vostro salt.
Mettete poi le impostazioni indicate sopra, e generate l'hash.
Tale hash, prendetelo e andate ad inserirlo nella sezione "Brain Wallet" di:
Sito: https://www.bitaddress.orgCodice: https://github.com/pointbiz/bitaddress.orgOtterete cosi la stessa chiave privata generata precedentemente da brainwallet.io.
Pareri e critiche?
Qualcosa non si capisce?