¿Puedo crear una billetera determinista y exportar/divulgar claves individuales sin comprometer la billetera?

Guión:

  1. Cree una billetera determinista y una mayor cantidad de claves privadas y direcciones de bitcoin asociadas en una computadora segura (por ejemplo, fuera de línea).
  2. Copia de seguridad de la semilla de forma segura. Guarde las claves privadas de forma segura (por ejemplo, en una hoja de papel).
  3. Anote las direcciones y envíe Bitcoins a varias direcciones diferentes. (Ahora están en almacenamiento en frío).
  4. Cuando sea necesario, tome una de las claves privadas e impórtela desde una billetera en línea (billetera electrónica, teléfono celular, etc.) (Esto incluye el riesgo de que el malware o el operador de la billetera electrónica roben la clave privada. Sin embargo, tal el robo solo se aplicaría a una pequeña cantidad, no a su fortuna total).

Si una clave privada de una billetera determinista se ve comprometida (conocido por un aviso), ¿las otras claves (y la semilla) siguen siendo seguras?

Por diseño, este no es el caso de la billetera determinista electrum y los desarrolladores son conscientes de ello. ¿Qué hay de otras billeteras deterministas, por ejemplo, Armory?

Jan, en los comentarios de arriba/abajo, podría haber entendido mal por qué están haciendo algo que parece clave = semilla + hash (secuencia). Consulte aquí para obtener más información: bitcointalk.org/index.php?topic=19137.0 Básicamente, utilizan una propiedad de las claves ECC. Lo que está fuera de la función hash no es la semilla sino una clave pública cuando se generan claves públicas y una clave privada cuando se generan claves privadas. (nota: no tengo karma para comentar)

Respuestas (5)

El estándar propuesto para carteras deterministas jerárquicas (ver BIP 32 ) está diseñado para permitir esto (y más).

Todavía no está implementado, pero varios autores de clientes han acordado adoptarlo, una vez que sea definitivo.

Hacia el final de su enlace, reconocen a "Alan Reiner por la implementación de este esquema en Armory [...]". ¿Significa esto que las versiones actuales de Armory ya usan este esquema (o algo criptográficamente equivalente)?

Tenía la misma necesidad y no pude encontrar soluciones fáciles de usar, así que terminé rodando la mía. Soy nuevo en bitcoin y crypto, así que úsalo con cuidado:

https://github.com/pavlos-christoforou/bitcoin

Asumiré que puede crear su propia billetera, como dijo. Bajo tal circunstancia, le sugiero que siga la lógica a continuación.

En primer lugar, supongamos que alguien ha codificado (ya que el sitio web de blockchain lanzó algunas herramientas en su sección API) un software capaz de crear direcciones de bitcoin para usuarios externos. En tal escenario, si los algoritmos contenidos en dicho software, alojados en un servidor, pueden crear una billetera de múltiples firmas para los usuarios, en el sentido de que cierto usuario necesitaría ambas claves privadas (2 claves por cada dirección) creadas por el software para gastar las monedas de una billetera de una sola dirección, y si, por ejemplo, el servidor guarda la clave privada A y entrega al usuario la clave privada B, entonces tendríamos la situación de una "billetera híbrida en línea" donde solo el usuario puede usar ambas claves, A + B, para crear, firmar y transmitir transacciones relacionadas con su dirección de bitcoin.

Dicho sistema sería bastante seguro para el usuario si el propietario del software no tuviera conocimiento o interacción con la clave privada A (o B) y si el cifrado utilizado antes de almacenar esa clave privada A hiciera inútil a cualquier tercero (incluso si llega a allí) cualquier acceso a esa clave almacenada desde la base de datos del servidor.

Ahora, por otro lado, la única forma de construir una transacción y firmarla con ambas claves privadas podría tener lugar solo en el servidor (siendo esta una condición muy importante, como explicaré más adelante en este escenario).

Si el propietario del software está dispuesto a permitir que los usuarios abandonen el servidor con ambas claves (por ejemplo, solo para eliminar sus cuentas y establecer direcciones como algunas billeteras realmente frías), podría emplear dos opciones.

Una sería entregar directamente al usuario la clave privada A, lo que le permitiría usar en otro lugar (si es necesario y cuando sea necesario) las claves A y B para firmar transacciones, o la otra (de alguna manera mejor) en la que el algoritmo permite crear una tercera tecla, la tecla C, que podría usarse junto con la tecla B para gastar monedas desde esa dirección. Es decir, el usuario vuelve a salir con dos claves privadas en el bolsillo, suficientes para utilizarlas para vaciar la dirección correspondiente (clave pública). Eso se puede realizar utilizando una semilla (cierta clave privada "D"), única para el servidor (o para la cuenta de usuario), o estableciendo como semilla incluso la clave A. Si la clave A se usa como semilla, entonces, prácticamente cualquier persona con acceso al código fuente del software podría replicar todo el rango de direcciones creadas para el usuario específico (si la clave A es "específica de la cuenta del usuario" y no "específica de la dirección"). Veo que el último es imposible de usar por cualquier administrador de sistemas decente (si tiene la más mínima idea sobre los riesgos incurridos en una elección de seguridad de tan bajo nivel). Así que supongamos que el servidor crea semillas con mayores privilegios (también conocido como específico del usuario). Eso, nuevamente, podría tener consecuencias catastróficas para cualquier usuario descuidado que importara esa clave A a cualquier billetera desde un dispositivo infectado con malware. (¿Quizás eso nos recuerda de alguna manera a la billetera Electrum? :/ ...) Veo que el último es imposible de usar por cualquier administrador de sistemas decente (si tiene la más mínima idea sobre los riesgos incurridos en una elección de seguridad de tan bajo nivel). Así que supongamos que el servidor crea semillas con mayores privilegios (también conocido como específico del usuario). Eso, nuevamente, podría tener consecuencias catastróficas para cualquier usuario descuidado que importara esa clave A a cualquier billetera desde un dispositivo infectado con malware. (¿Quizás eso nos recuerda de alguna manera a la billetera Electrum? :/ ...) Veo que el último es imposible de usar por cualquier administrador de sistemas decente (si tiene la más mínima idea sobre los riesgos incurridos en una elección de seguridad de tan bajo nivel). Así que supongamos que el servidor crea semillas con mayores privilegios (también conocido como específico del usuario). Eso, nuevamente, podría tener consecuencias catastróficas para cualquier usuario descuidado que importara esa clave A a cualquier billetera desde un dispositivo infectado con malware. (¿Quizás eso nos recuerda de alguna manera a la billetera Electrum? :/ ...)

La última opción disponible que queda es aquella en la que el servidor tiene una clave semilla propia (con los privilegios más altos) a la que no puede acceder ningún tercero, y que se combina con al menos otra (servidor protegido con firma múltiple también).

Volviendo a su situación, debería tener la clave B que ofrece privilegios elevados (lo que le permite crear claves D y más, pero cualquiera que use la D no podrá crear otras claves). Sin embargo, debido a que tal cosa sería una carga para el código, sugeriría una opción más simple: la transacción de una sola vía. Lo que significa que importas en cualquier billetera de tu elección las claves después de una dulce limpieza de las funciones básicas. Como dijo una vez Henry Ford sobre sus autos "puedes pedir cualquier color, siempre y cuando sea solo negro".

La dirección importada, donde sea que esté almacenada, puede codificarse para hacer posible una sola operación : enviar un pago de la cantidad precisa únicamente hacia otra dirección X de usted (por ejemplo, solo puede enviar cada vez alrededor de 0.1 BTC hacia su billetera caliente -- dinero de bolsillo). ¿Necesitas algo más? Otro tramo fijo de 0.100 BTC, hacia la misma dirección. Solo eso. Un retoque perfecto. Por supuesto, la dirección X podría almacenarse en una billetera de hardware, completamente segura. Otros tipos de gastos pueden ser posibles solo usando el propio servidor (para desbloquear el control total sobre el saldo de la dirección).

Todo depende de cómo se creó su billetera determinista, si es algo basado en hash, sería seguro. Lo que necesita es que es imposible descubrir la semilla con las claves privadas reales, por lo que debe usar una función unidireccional (es decir, función hash).

Y, en general, comprometer una clave privada en una billetera no comprende el resto de la billetera.

Eso es lo que estaba pensando. Sin embargo, después de leer el código fuente de electrum, me di cuenta de que debes tener cuidado: usan algo como KEY = SEED + HASH (secuencia), lo que hace posible en algunas circunstancias calcular SEED.
Sólo una idea: ¿ KEY=HASH(SEED + offset)funcionaría también? De esa manera, SEEDni las otras direcciones ni las otras serían adivinables.
@cdecker Creo que sí, pero no confíes en mi palabra. Mejor implemente un esquema que haya sido revisado por expertos en criptografía.
@cdecker Sí, esto es algo que sería seguro porque hash la semilla junto con otro parámetro, cambiando así todo el hash resultante.
@Jan Si electrum usa de esta manera, no lo recomendaría para ningún uso, la semilla está comprometida en toda la clave privada, lo cual es horrible desde mi consideración.

La billetera Armory permite esto y no compromete la seguridad de la billetera en absoluto. Aunque compromete la integridad de sus copias de seguridad. Las billeteras deterministas son útiles porque puede hacer una sola copia de seguridad desde el principio (antes de usarla) y será una buena copia de seguridad para siempre.

Es decir, a menos que importe direcciones de otro lugar. Esas nuevas direcciones no estarán en su copia de seguridad anterior, por lo que debe hacer una nueva copia de seguridad en ese momento.