Logo
Nuevos usuarios de RPC: 35% de descuento el primer mesVer oferta
OnFinality Learn
Infraestructura y operaciones11 min de lectura

Cold wallet vs hard wallet: almacenamiento de claves, límites de firma y verificación

Una guía práctica sobre la diferencia entre cold wallet y hard wallet, cómo cada una modifica tu superficie de ataque en la firma y el almacenamiento de claves, y cómo verificar la configuración por ti mismo.

TL;DR

Una hard wallet (hardware wallet) es un dispositivo físico de firma; una cold wallet es una postura de almacenamiento de claves en la que las claves privadas nunca tocan un entorno conectado a internet. Ambas se solapan en gran medida, pero no son sinónimos: una hardware wallet usada para firmar transacciones DeFi en línea sigue siendo una hardware wallet, pero no es completamente fría. Este artículo construye un modelo mental de dónde viven las claves, dónde se producen las firmas y contra qué protege cada límite, y luego ofrece procedimientos ejecutables para verificar un flujo de firma air-gapped y auditar tu propia configuración. Cierra con los compromisos que deciden si el almacenamiento en frío merece el coste operativo para un saldo determinado.

Respuesta directa y alcance

Una hard wallet es una clase de dispositivo: hardware dedicado que almacena una clave privada o una semilla dentro de un elemento seguro o microcontrolador y firma transacciones sin exponer la clave al ordenador anfitrión. Una cold wallet es una clase de postura operativa: una cartera cuyas claves privadas se generan y se usan en un entorno que nunca está conectado a una red. La pregunta cold wallet vs hard wallet es en realidad una pregunta sobre dos ejes distintos —el límite del hardware y el límite de la red— y un mismo dispositivo puede situarse en puntos diferentes de cada eje según cómo lo uses.

Este artículo cubre el mecanismo (dónde viven las claves, dónde se producen las firmas), un procedimiento de verificación reproducible para un flujo de firma air-gapped y los compromisos operativos. No recomienda un proveedor ni un dispositivo concreto. Para la selección de endpoints y proveedores cuando tu capa en línea de solo lectura o de difusión necesita una conexión RPC, usa RPC Assistant en lugar de tratar esta página como una lista de proveedores.

  • Hard wallet = límite de firma por hardware.
  • Cold wallet = límite de aislamiento de red para las claves.
  • Un dispositivo puede ser hard pero warm; una configuración con papel o con una máquina offline puede ser cold pero no hard.
  • Las afirmaciones de seguridad deben verificarse contra tu propio flujo de firma, no darse por sentadas a partir de una etiqueta.

Supuestos y requisitos previos

Los procedimientos siguientes asumen que ya tienes una frase semilla o una clave privada y quieres razonar sobre dónde queda expuesta. Asumen familiaridad básica con pares de claves pública/privada, la firma de transacciones y la difusión de una transacción firmada a través de un endpoint RPC. Necesitarás una máquina que puedas poner offline, una segunda máquina para difundir y una forma de mover datos entre ambas (almacenamiento USB, códigos QR o una tarjeta microSD).

Si todavía estás decidiendo cómo se conecta tu capa en línea a una cadena, lee primero la guía de endpoints RPC para que el paso de difusión no sea el eslabón débil de tu razonamiento. Nada de lo aquí expuesto requiere una cartera con fondos; puedes ensayar todo el flujo en una testnet.

Modelo mental: dos límites, no una etiqueta

Separa los dos límites de forma explícita. El límite del hardware responde: ¿puede el sistema operativo anfitrión leer la clave privada? Un firmador hardware dice que no: la clave permanece dentro del dispositivo y solo las firmas y los datos públicos cruzan el límite. El límite de la red responde: ¿ha sido alguna vez accesible desde una red el entorno que contiene o usa la clave? Una configuración en frío dice que no: la generación de claves y la firma ocurren en una máquina o dispositivo aislado que nunca se conecta a Wi-Fi, Ethernet ni a un teléfono emparejado.

La mayor parte de la confusión en el debate cold wallet vs hard wallet proviene de colapsar ambos límites. Una hardware wallet conectada a un portátil en línea para aprobar un contrato inteligente es hard pero no cold: la clave está protegida por el hardware, pero la solicitud de firma se origina en un anfitrión en red, por lo que el phishing, los datos de llamada maliciosos de contratos y la manipulación del portapapeles o de la pantalla siguen siendo riesgos activos. A la inversa, una semilla generada en un portátil antiguo que está permanentemente offline es cold en el sentido de red, pero no tiene elemento seguro, por lo que el acceso físico y el malware presente en el momento de la generación son los riesgos dominantes.

El enfoque útil es una matriz: firmador hardware + nunca conectado a la red = aislamiento más fuerte; firmador hardware + anfitrión en línea = fuerte protección de la clave, menor integridad de la solicitud; clave software en una máquina offline = cold pero físicamente frágil; clave software en una máquina en línea = hot. Tu trabajo es saber en qué celda estás y verificarlo en lugar de confiar en una categoría de producto.

Dónde viven las claves y dónde se producen las firmas

En un flujo de firma con hardware, la semilla se genera en el dispositivo y nunca se exporta. El anfitrión construye una transacción sin firmar, la envía al dispositivo, el dispositivo muestra el destino y el importe para confirmación humana y devuelve una firma. El anfitrión difunde entonces la transacción firmada. La clave privada nunca entra en la memoria del anfitrión, que es la propiedad que da sentido al límite del hardware.

En un flujo totalmente cold, la máquina offline contiene el material de la clave y también construye y firma la transacción. Solo la transacción firmada cruza a la máquina en línea. La máquina en línea nunca ve la clave y nunca necesita pedir a la máquina offline que firme nada de forma interactiva, lo que elimina por completo la superficie de ataque del canal en vivo.

La diferencia práctica se manifiesta en lo que un atacante debe controlar. Contra un firmador hardware, un atacante necesita engañar a la persona para que apruebe una carga maliciosa en la pantalla del dispositivo, o comprometer el firmware del dispositivo. Contra una configuración cold, un atacante necesita acceso físico a la máquina offline o al medio que transporta las transacciones firmadas. Son modelos de amenaza distintos, y ninguno es estrictamente mejor para todos los usuarios.

Procedimiento ejecutable: ensaya un flujo de firma y difusión air-gapped

El siguiente esbozo en Python demuestra la forma de un flujo de firma en frío usando una clave de marcador de posición y una URL RPC de marcador de posición. Ejecuta la mitad de firma en tu máquina offline y la mitad de difusión en tu máquina en línea. Usa eth_account y requests; instálalos en cada máquina según corresponda. Nunca pegues una clave real de mainnet en un shell conectado a la red: usa una clave de prueba desechable en una testnet para el ensayo.

Máquina offline (solo construir y firmar):

from eth_account import Account
from eth_account.messages import encode_defunct

# Placeholder only. On a real cold machine this key never leaves the device.
PRIVATE_KEY = "0x" + "11" * 32
acct = Account.from_key(PRIVATE_KEY)

# Example: sign a simple message payload as a stand-in for a transaction digest.
msg = encode_defunct(text="rehearsal-payload-v1")
signed = acct.sign_message(msg)

print("address:", acct.address)
print("signature:", signed.signature.hex())
# Carry ONLY the signature and the original payload to the online machine.

Procedimiento ejecutable: verifica la firma en la máquina en línea

En la máquina en línea, recupera la dirección del firmante a partir de la carga y la firma. Si la dirección recuperada coincide con la esperada, la firma cruzó el air gap intacta y fue producida por la clave que crees. Este es el paso de verificación que convierte un flujo en frío de una creencia en una comprobación.

Máquina en línea (solo verificar, sin material de clave):

from eth_account import Account
from eth_account.messages import encode_defunct

EXPECTED_ADDRESS = "0x0000000000000000000000000000000000000000"  # replace
PAYLOAD = "rehearsal-payload-v1"
SIGNATURE_HEX = "0x..."  # paste from the offline machine

msg = encode_defunct(text=PAYLOAD)
recovered = Account.recover_message(msg, signature=SIGNATURE_HEX)

print("recovered:", recovered)
print("matches expected:", recovered.lower() == EXPECTED_ADDRESS.lower())

# Broadcasting a real signed transaction would use an RPC endpoint here:
# RPC_URL = "RPC_URL"
# requests.post(RPC_URL, json={"jsonrpc":"2.0","id":1,
#   "method":"eth_sendRawTransaction","params":["0x..."]})

Resultado de verificación esperado y cómo interpretarlo

Un ensayo correcto imprime la misma dirección en ambas máquinas y matches expected: True. Si la dirección recuperada difiere, la carga o la firma se alteraron en tránsito, se usó la clave equivocada o la codificación difiere entre ambos lados. Trata cualquier discrepancia como un air gap fallido y detente antes de difundir nada.

Registra el resultado de cada ensayo en una tabla pequeña para poder comparar configuraciones con el tiempo. No rellenes cifras que no hayas observado; la tabla es una plantilla para tus propias mediciones.

| Comprobación | Máquina offline | Máquina en línea | Condición de aprobado |

| --- | --- | --- | --- |

| Dirección derivada de la clave | observada | n/a | coincide con la esperada |

| Recuperación de la firma | producida | observada | recuperada == esperada |

| Integridad de la carga | origen | observada | carga idéntica byte a byte |

| Difusión (testnet) | n/a | observada | se devuelve el hash de la transacción |

| Aislamiento de red | n/a | observada | el host offline no tiene ruta |

La última fila es la que la gente omite. Confirma que la máquina offline realmente no tiene ruta de red —revisa sus interfaces y su ruta por defecto— en lugar de suponerlo porque desconectaste un cable una vez.

Solución de fallos comunes

La mayoría de los fallos en un flujo en frío son mundanos. Las discrepancias en la recuperación de la firma suelen venir de diferencias de codificación: un lado aplica hash a una cadena, el otro firma bytes en bruto, o se añadió un salto de línea al copiar. Normaliza la carga a una única cadena de bytes canónica y aplícale hash de forma idéntica en ambos lados antes de firmar.

Los fallos de difusión suelen estar del lado del RPC: un nonce obsoleto, gas insuficiente o un nodo que no ha visto la transacción padre. Si difundes a través de un endpoint compartido, confirma que el nodo está sincronizado y en la cadena esperada antes de culpar a la firma. Para el comportamiento de endpoints específico de cada cadena, el directorio de redes y la opción de nodo dedicado son las referencias relevantes.

Los fallos físicos y operativos también importan: una tarjeta microSD perdida, una transferencia por QR corrupta o un dispositivo que en realidad nunca estuvo air-gapped porque se emparejó con un teléfono. Si hay un firmador hardware implicado, verifica en la pantalla del dispositivo que el destino y el importe coinciden con lo que pretendías: la pantalla del dispositivo es el último punto de control humano antes de que exista una firma.

  • Recuperación discrepante: revisa primero la codificación de la carga y los espacios en blanco.
  • Difusión rechazada: revisa el nonce, el gas y el chain ID antes de volver a firmar.
  • El dispositivo muestra un destino distinto al del anfitrión: aborta e investiga.
  • El host offline tiene una ruta por defecto: no es cold; corrige el aislamiento.

Limitaciones y compromisos

El almacenamiento en frío compra aislamiento a cambio de fricción. Cada transacción requiere un viaje de ida y vuelta manual, lo que hace impráctico el trading frecuente y aumenta la probabilidad de error humano durante las transferencias. Los firmadores hardware reducen esa fricción pero reintroducen un canal en vivo entre el anfitrión y el dispositivo, por lo que la integridad de la solicitud depende de lo que muestre el dispositivo y del firmware en el que confíes.

Ninguno de los dos enfoques protege contra una semilla comprometida en el momento de la generación, un sitio de phishing que te convenza de firmar una carga maliciosa o una copia de seguridad perdida. El almacenamiento en frío tampoco protege contra la coacción o el robo físico de la máquina offline. Para configuraciones institucionales o de alto valor, la multifirma y la separación geográfica de las participaciones de la clave abordan riesgos que un único dispositivo en frío no puede cubrir.

Por último, la capa en línea sigue importando. Un firmador perfectamente frío que difunde a través de un endpoint RPC poco fiable o mal configurado puede producir transacciones atascadas o confirmaciones engañosas. Presupuesta una ruta de difusión fiable y verifica el estado de la cadena de forma independiente. Si necesitas comparar opciones de endpoints para esa capa, dirige la pregunta a RPC Assistant en lugar de adivinar.

Próximos pasos: convierte el modelo en una rutina

Ensaya el bucle completo de firma y verificación en una testnet hasta que resulte aburrido. Luego anota tu configuración como una entrada de la matriz —hardware o software, cold o warm— y verifica cada afirmación con una comprobación que puedas repetir. Mantén auditable el aislamiento de la máquina offline, mantén las copias de seguridad separadas geográficamente y vuelve a ejecutar la tabla de verificación cada vez que cambies de dispositivo o de firmware.

Cuando estés listo para conectar la capa en línea, revisa los precios de RPC para entender cuánto cuesta una ruta de difusión fiable, y lee la guía de alojamiento de nodos blockchain si pretendes ejecutar tu propio nodo en lugar de usar un proveedor. El objetivo no es una etiqueta en una caja; es un flujo de firma cuyos límites hayas probado tú mismo.

Nunca te preocupes por la infraestructura nuevamente

OnFinality elimina la carga pesada de DevOps para que puedas construir de forma más inteligente y rápida.

Comenzar