Como proteger una cartera Bitcoin

Iniciado por AlbertoBSD, 18 Noviembre 2020, 01:45 AM

0 Miembros y 2 Visitantes están viendo este tema.

AlbertoBSD

Como proteger una cartera Bitcoin

No sabemos qué pasará en el futuro, es decir no sabemos si nos robaran la cartera o la perderemos en algún USB y alguien la encontrara. Tampoco sabemos la cantidad de poder de computo que existira.

Pero además de tener cifrada nuestra cartera con un buen passphrase de más de 40 caracteres, se puede lograr una mejor seguridad, para en el caso de que sea robada sea inviable que por medio de fuerza bruta directo contra el passphrase.

Nuestra Cartera está protegida con el resultado de un hash sha512 derivado N veces a partir de nuestro Passphrase y un salt.

Es decir:

(key,IV) = PBKDF2_algo("sha512",passphrase+salt,N);

Normalmente el cliente bitcoin-core calcula ese N de tal forma que la Operación en total no lleve más de 1 Segundo

¿Por que? ¿Por que ponérsela fácil a los crackers de wallets?

Se puede editar el código fuente del bitcoin-core de tal forma que cuando nosotros cambiemos el passphrase este utilice un número N tal que N el proceso completo de PBKDF2_algo lleve al menos uno o dos minutos por passphare, es un pequeño precio de espera. Y el resultado será sumamente desalentador para quien se robe o encuentre la cartera.

¿Como hacer esta modificacion?

Si revisamos la versión estable y actual al dia de hoy, el bitcoin core 0.20 el archivo wallet.cpp tiene la solución:

https://github.com/bitcoin/bitcoin/blob/0.20/src/wallet/wallet.cpp En la linea 322 tenemos lo siguiente:

bool CWallet::ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase)
{
   bool fWasLocked = IsLocked();

   {
       LOCK(cs_wallet);
       Lock();

       CCrypter crypter;
       CKeyingMaterial _vMasterKey;
       for (MasterKeyMap::value_type& pMasterKey : mapMasterKeys)
       {
           if(!crypter.SetKeyFromPassphrase(strOldWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
               return false;
           if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, _vMasterKey))
               return false;
           if (Unlock(_vMasterKey))
           {
               int64_t nStartTime = GetTimeMillis();
               crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
               pMasterKey.second.nDeriveIterations = static_cast<unsigned int>(pMasterKey.second.nDeriveIterations * (100 / ((double)(GetTimeMillis() - nStartTime))));

               nStartTime = GetTimeMillis();
               crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
               pMasterKey.second.nDeriveIterations = (pMasterKey.second.nDeriveIterations + static_cast<unsigned int>(pMasterKey.second.nDeriveIterations * 100 / ((double)(GetTimeMillis() - nStartTime)))) / 2;

               if (pMasterKey.second.nDeriveIterations < 25000)
                   pMasterKey.second.nDeriveIterations = 25000;

               WalletLogPrintf("Wallet passphrase changed to an nDeriveIterations of %i\n", pMasterKey.second.nDeriveIterations);

               if (!crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
                   return false;
               if (!crypter.Encrypt(_vMasterKey, pMasterKey.second.vchCryptedKey))
                   return false;
               WalletBatch(*database).WriteMasterKey(pMasterKey.first, pMasterKey.second);
               if (fWasLocked)
                   Lock();
               return true;
           }
       }
   }

   return false;
}


Y solo tendria que quedar de la siguiente manera:

bool CWallet::ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase)
{
   bool fWasLocked = IsLocked();

   {
       LOCK(cs_wallet);
       Lock();

       CCrypter crypter;
       CKeyingMaterial _vMasterKey;
       for (MasterKeyMap::value_type& pMasterKey : mapMasterKeys)
       {
           if(!crypter.SetKeyFromPassphrase(strOldWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
               return false;
           if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, _vMasterKey))
               return false;
           if (Unlock(_vMasterKey))
           {
               pMasterKey.second.nDeriveIterations = 133707331;

               WalletLogPrintf("Wallet passphrase changed to an nDeriveIterations of %i\n", pMasterKey.second.nDeriveIterations);

               if (!crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
                   return false;
               if (!crypter.Encrypt(_vMasterKey, pMasterKey.second.vchCryptedKey))
                   return false;
               WalletBatch(*database).WriteMasterKey(pMasterKey.first, pMasterKey.second);
               if (fWasLocked)
                   Lock();
               return true;
           }
       }
   }

   return false;
}


Si quitamos todo lo relacionado con el calculo del tiempo y agregamos la linea:

pMasterKey.second.nDeriveIterations = 133707331;

En mi caso con el bitcoin-core oficial recompilado y con un procesador Intel Xeon CPU E3-1271 v3 @ 3.60GHz cambiar el passphrase toma alrededor de un minuto

Saludos!

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

el-brujo

AlbertoBSD Muy bueno. La billetera 1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx no sería tuya?  :silbar:

La verdad es que después de leer esto:

Crackers llevan un año intentando abrir una cartera con 600 millones de euros en Bitcoin
https://blog.elhacker.net/2020/09/crackers-llevan-un-ano-intentando-abrir-acceder-wallet-billetera-bitcoin-600-millones-euros.html

Y sobre todo esto, pues da mucho que pensar:

Alguien ha vaciado un monedero de Bitcoin de mil millones de dólares.

A finales de octubre alguien había enviado 88.857 bitcoins por un valor de casi mil millones de euros a monederos diferentes y que, además, la transferencia de estas criptomonedas había tenido una comisión de apenas 3,09 euros.

el monedero identificado por la dirección 1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx, ha realizado una transacción «importante».

https://www.blockchain.com/btc/address/1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx

El 3 de noviembre de 2020 contenía 69369.16628020 Bitcoins, lo que equivale aproximadamente a 957 millones de dólares. A comienzos del día 4 de noviembre el balance de la cuenta era sólo de 1.38 dólares.

este mismo monedero de bitcoin, ya que circulaba por distintos foros de hacking y entre particulares con el objetivo de romper la contraseña del mismo, objetivo que no se había logrado hasta la fecha.

Tenemos dos opciones posibles:

1- El propietario ha decidido mover sus «pertenencias» a otro monedero por la notoriedad que había alcanzado el original.
2- Alguien ha conseguido crackear la contraseña y ahora es una persona muy feliz.

AlbertoBSD

#2
Cita de: el-brujo en 18 Noviembre 2020, 16:57 PM
AlbertoBSD Muy bueno. La billetera 1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx no sería tuya?  :silbar:

No ya quisiera si hubiese sido mía la hubiera protegido mejor desde el principio.

Mi cartera es la siguiente: 1H3TAVNZFZfiLUp9o9E93oTVY9WgYZ5knX

Lamentablemente yo me interese en este tema tan solo semana y media antes de que dejaran en ceros la cartera mencionada, no me dio oportunidad de intentar crackearla con mi metodo directo al KEY AES256, es decir omitiendo el KeyDerivation.

He hecho un video explicando los métodos de ataque y mostrando como la edición del nDeriveIterations hace totalmente inviable los métodos por fuerza bruta.
[youtube=640,360]https://www.youtube.com/watch?v=PAcf-3vMGzQ[/youtube]

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

B€T€B€

Cita de: AlbertoBSD en 18 Noviembre 2020, 19:13 PMMi cartera es la siguiente: 1H3TAVNZFZfiLUp9o9E93oTVY9WgYZ5knX

> https://www.blockchain.com/btc/address/1H3TAVNZFZfiLUp9o9E93oTVY9WgYZ5knX

Consérvala como oro en paño; el Bitcoin se está disparando.

AlbertoBSD

Cita de: B€T€B€ en 19 Noviembre 2020, 00:24 AM
Consérvala como oro en paño; el Bitcoin se está disparando.

Así es, la verdad en momento quería invertir pero también sonaban y siguen sonando muchas noticias de estafas por internet con respecto a comprar bitcoin, muchos sitios hackeados incluso hace 9 años. Me arrepiento de no haberlo hecho, pero ni modo ya pasó.

Saludos!

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

B€T€B€



Lo de las estafas es algo secundario.
La clave está en mantener los Bitcoins en una cartera de tu propiedad y bien protegida.