¿Cómo cifra el cliente Bitcoin el archivo wallet.dat?

¿Cuál es el algoritmo utilizado para cifrar el archivo wallet.dat?

Respuestas (2)

Puede encontrar una explicación detallada en el LÉAME de la aplicación: https://github.com/bitcoin/bitcoin/blob/6b8a5ab622e5c9386c872036646bf94da983b190/doc/README

En breve:

  • La frase de contraseña se convierte en un par clave/iv usando EVP, con un número dinámico de rondas
  • Este par key/iv se usa para encriptar una clave maestra generada aleatoriamente, usando AES-256-CBC
  • Luego, la parte secreta de las claves de la billetera se cifra con esa clave maestra, nuevamente con AES-256-CBC.
Hmm, el LÉAME parece actualizarse de vez en cuando y la descripción del cifrado de la billetera ya no está allí. ¿Es esta la versión a la que estabas enlazando? github.com/bitcoin/bitcoin/blob/…
@ThePiachu Gracias por el enlace actualizado, me ahorró unos minutos. Actualicé la respuesta para reflejar el enlace permanente.

La respuesta de Pieter cubre los detalles técnicos, así que no repetiré nada de eso. Agregaría que los usuarios deben recordar que el punto más débil en la billetera Bitcoin-core o cualquier sistema de encriptación criptográficamente fuerte es la frase de contraseña. El sistema convierte una frase de contraseña en una clave AES-256 y esa clave derivada de la contraseña se usa para cifrar una clave de billetera maestra generada aleatoriamente. La clave maestra de la billetera no puede ser forzada por fuerza bruta, salvo un PRNG comprometido o defectuoso; sin embargo, los atacantes pueden intentar forzar la frase de contraseña por fuerza bruta.

El cliente agrega intentos de fortalecerse contra este ataque mediante el uso de una sal (número aleatorio) y múltiples rondas de hashing. La sal evita un ataque de cálculo previo, ya que la misma frase de contraseña con diferentes sales producirá claves diferentes. El uso de varias rondas de hash ralentiza los ataques de fuerza bruta porque el atacante también necesitará realizar varias rondas en cada intento de frase de contraseña.

El cliente utiliza el endurecimiento dinámico de claves. Esto significa que la cantidad de rondas varía según la potencia computacional del cliente (para mantener el tiempo de encriptación o desencriptación por debajo de 1 segundo). Cuanta más potencia informática tenga su hardware, más rondas realizará y más difícil será forzar la contraseña. Cuando cambie su frase de contraseña, el cliente ajustará la cantidad de rondas dinámicas en función de la potencia informática de su hardware actual. Al actualizar su contraseña periódicamente, puede asegurarse de que la clave derivada de la contraseña cumpla con la ley de Moore.

El endurecimiento de la clave mediante el uso de sal y el estiramiento de la clave solo puede llegar hasta cierto punto. Si su contraseña es "p@ssw0rd!" o alguna otra contraseña conocida de uso común, seguirá siendo trivial forzar la billetera por fuerza bruta. Para ilustrar por qué, supongamos que el atacante tiene hardware que puede intentar 100 millones de hashes por segundo y su billetera está usando 100,000 rondas de hashing. Esto significa que el hardware de los atacantes (100 millones de hashes) puede intentar 1000 contraseñas por segundo. Entonces, la billetera ralentiza al atacante, pero si la contraseña es débil, no puede ralentizarlo lo suficiente. Hay listas de contraseñas previamente comprometidas/robadas/hackeadas disponibles públicamente con decenas de millones de contraseñas. Sin estirar la clave, un atacante podría intentar todas las contraseñas conocidas posibles en menos de un segundo. El estiramiento de teclas lo ralentiza a unas pocas horas. Por otro lado, digamos que su contraseña era desconocida y lo suficientemente fuerte como para que con un solo hash, en promedio, tomaría un día para la fuerza bruta. Con 100.000 rondas que aumenta el tiempo a siglos.

Agregaría que la frase de contraseña se llama frase de contraseña por una razón. Usar "Esta es una frase de contraseña muy larga, pero muy simple, para recordar" es muchísimo más seguro que "fl@a%%zG", incluso si se usa un ataque de diccionario .
@AndreasBonini: Gracias a tu comentario, esa contraseña en particular ahora formará parte del diccionario ;-)