Cómo generan tu frase de recuperación las billeteras OneKey (y de dónde sale la aleatoriedad)

Puntos clave
- La seguridad de una billetera empieza por la entropía: los bits aleatorios impredecibles con los que se crea. Si esa entropía es predecible, ningún PIN ni resguardo posterior puede repararlo.
- La frase de recuperación es solo una codificación legible de esa entropía; su seguridad depende de qué tan impredecible sea el azar original, no de cuántas palabras tenga.
- El problema que salió en las noticias viene de una configuración incorrecta del PRNG Yasmarang en
libngu, que en ciertas compilaciones terminaba saltándose el TRNG del chip. - Los flujos de creación de OneKey no usan
libngu, Coinkite, Coldcard ni ninguna dependencia CKCC, y múltiples auditorías confirman que sí llaman al TRNG del hardware o del elemento seguro. - Cada modelo obtiene su aleatoriedad de una fuente distinta: THD89 SE TRNG (Pro, Classic 1S, Classic 1S Pure), ATECC608A SE TRNG (Classic) o STM32 MCU TRNG (Mini); en todos los casos el MCU se encarga de codificar la frase BIP39/SLIP39.
Este artículo repasa cómo cada modelo de OneKey produce la entropía y la frase de recuperación cuando creas una billetera nueva, y por qué las preocupaciones recientes sobre ciertas implementaciones de RNG por software no aplican a los flujos de creación de billeteras de OneKey.
La seguridad de una billetera empieza con una aleatoriedad que nadie puede predecir
La seguridad de una billetera empieza con una sola cosa: la entropía, esos bits aleatorios impredecibles que se usan para crearla. Una frase de recuperación no es más que una codificación legible de esa entropía. Si la entropía es predecible en el momento de la creación, nada de lo que agregues después —un PIN, dónde guardas la frase, cómo se derivan las direcciones— puede deshacer el daño.
No todos los modelos de OneKey obtienen su aleatoriedad del mismo lugar. Acá te contamos exactamente de dónde viene la entropía detrás de tu frase de recuperación en cada dispositivo.
El problema que estuvo en las noticias se remonta a un PRNG Yasmarang mal configurado en libngu, donde ciertas compilaciones terminaban saltándose el TRNG del chip. Los flujos de firmware relevantes de OneKey no usan libngu, Coinkite, Coldcard ni ninguna dependencia CKCC, y varias rondas de auditoría confirman que realmente llaman al TRNG del hardware o del elemento seguro. A continuación repasamos, dispositivo por dispositivo, la interfaz de aleatoriedad de hardware que usa cada uno.
¿Qué es la entropía y por qué una billetera no puede vivir sin ella?
Piensa en la entropía como una cantidad medible de impredecibilidad, que normalmente se cuenta en bits. 128 bits de entropía significan 2^128 posibles valores iniciales; salvo que exista otra falla, a un atacante no le queda más que adivinar. Tus llaves privadas, tus direcciones y tu capacidad de firmar se derivan todas de forma determinista a partir de ese único secreto inicial.
Así que la seguridad de una frase de recuperación no viene del hecho de que una docena de palabras en inglés "parezcan muchas". Viene de qué tan impredecible es la entropía cruda que hay detrás de ellas:
- 128 bits de entropía → 12 palabras BIP39;
- 192 bits de entropía → 18 palabras BIP39;
- 256 bits de entropía → 24 palabras BIP39.
Una aleatoriedad débil le permite a un atacante reproducir las entradas desde el momento en que se creó tu billetera y llegar exactamente a la misma frase y a la misma llave privada. Ninguna cantidad de SHA-256, protección con PIN o almacenamiento en un elemento seguro puede convertir una entrada predecible en entropía genuinamente impredecible.
De un número aleatorio a una frase de recuperación: cómo funciona realmente la matemática
Los detalles varían según el modelo, pero toda billetera BIP39 comparte el mismo modelo de cómputo:
Generador de números verdaderamente aleatorios por hardware (TRNG)
↓
Se extraen 128 / 192 / 256 bit de entropía (ENT)
↓
Se toman los primeros ENT / 32 bit de SHA-256(ENT) como suma de verificación (CS)
↓
Se divide ENT || CS en grupos de 11 bit, cada uno mapeado a una de las 2048 palabras BIP39
↓
12 / 18 / 24 palabras → seed → llaves privadas, direcciones y llaves de firma
Por ejemplo, una frase de 12 palabras usa 128 bits de entropía más una suma de verificación de 4 bits: 132 bits en total, que se dividen limpiamente en 12 grupos de 11 bits. Cada grupo es un índice dentro de la lista de palabras BIP39.
El paso de SHA-256 acá solo calcula la suma de verificación de BIP39; no es un generador de números aleatorios. La aleatoriedad de la frase sigue descansando por completo en la entropía cruda capturada en el momento de la creación.
Entonces, ¿por qué la implementación de OneKey queda intacta ante el problema de ColdCard? A continuación desglosamos, dispositivo por dispositivo, cómo se produce el número aleatorio inicial de cada modelo y si en algún momento cae en la ruta de código afectada.
OneKey Pro
OneKey Pro
¿Está afectado?
No, no por el problema de ColdCard con libngu / Yasmarang. La compilación actual del Pro habilita THD89 de forma predeterminada. Cuando creas una billetera en el dispositivo, el TRNG del THD89 provee la entrada aleatoria y el firmware se encarga de la codificación BIP39 o SLIP39 que sigue.
Cómo se genera
THD89 TRNG → entropía de inicialización de la billetera → el firmware codifica BIP39 o SLIP39.
El random.bytes() del Pro usa por defecto source=1, que llama a se_random_encrypted() bajo la compilación predeterminada USE_THD89=1.
Notas sobre la aleatoriedad
- La compilación predeterminada del Pro habilita THD89, y los bytes aleatorios provienen de
se_random_encrypted(), no de la ruta del PRNG por software de Yasmarang olibngu. - Según el Centro de Ayuda de OneKey, el TRNG del elemento seguro EAL6+ actual fundamenta su aleatoriedad en procesos físicos como el ruido electrónico.
OneKey Classic 1S
OneKey Classic 1S
¿Está afectado?
No, no por el problema de ColdCard con libngu / Yasmarang. El flujo de creación en dispositivo actual y público del Classic 1S toma su entropía del TRNG del elemento seguro THD89, y la cadena de la frase BIP39 la codifica el firmware del MCU.
Cómo se genera
THD89 TRNG → 128 / 192 / 256 bit de entropía → el MCU codifica la frase BIP39.
Notas sobre la aleatoriedad
- Decir que "la frase la genera el THD89" no es del todo exacto: el THD89 aporta la entrada aleatoria, mientras que la codificación de las palabras BIP39 ocurre en el firmware del MCU.
- El firmware llama a la interfaz
se_random_encrypted()del THD89 y no usa Yasmarang nilibngu. Según el Centro de Ayuda de OneKey, el TRNG del elemento seguro EAL6+ actual produce aleatoriedad a partir de procesos físicos como el ruido electrónico.
OneKey Classic 1S Pure
OneKey Classic 1S Pure
¿Está afectado?
No, no por el problema de ColdCard con libngu / Yasmarang. El código público no le da al Classic 1S Pure una rama separada de generación de entropía; comparte la misma base de código firmware-classic1s que el Classic 1S. Así que cuando creas una billetera, la entropía del Pure también viene del TRNG del THD89 y el MCU la codifica en una frase BIP39.
Flujo verificado
THD89 TRNG → 128 / 192 / 256 bit de entropía → el MCU codifica la frase BIP39.
Que el Pure sea un producto sin batería no cambia esta ruta pública de creación.
Notas sobre la aleatoriedad
- No asumas que el Pure tiene un mecanismo de entropía distinto solo porque se vende como su propio modelo.
- Igual que en el Classic 1S, el código público de creación llama a la interfaz de aleatoriedad del THD89 y no usa Yasmarang ni
libngu.
OneKey Classic
OneKey Classic
¿Está afectado?
No, no por el problema de ColdCard con libngu / Yasmarang. En la ruta de firmware del Classic con elemento seguro habilitado, el SE provee el material aleatorio que se usa para crear la billetera, y el MCU lo convierte en una frase BIP39.
Cómo se genera
El SE provee material aleatorio → se toman los primeros 32 bytes como entropía → el MCU codifica la frase BIP39.
Notas sobre la aleatoriedad
- Esta ruta obtiene su material aleatorio a través de las interfaces de inicialización y exportación del SE, y no llama a la implementación de RNG de Yasmarang ni de
libngu, así que nunca cae en la ruta de código afectada que está en discusión. - El código público no puede fijar de forma individual el modelo y la certificación del SE de cada lote de Classic. Al describirlo públicamente, guíate por la documentación del chip del lote específico en lugar de aplicarle al Classic la certificación de otro modelo.
OneKey Mini
OneKey Mini
¿Está afectado?
No, no por el problema de ColdCard con libngu / Yasmarang. El flujo de creación en dispositivo del Mini obtiene su entropía del generador de números aleatorios por hardware del MCU STM32, y luego el MCU la codifica en una frase BIP39.
Cómo se genera
STM32 MCU TRNG → 128 / 192 / 256 bit de entropía → el MCU codifica la frase BIP39.
En el firmware más antiguo del Mini, random32() lee directamente el periférico RNG del STM32 y rechaza salidas duplicadas consecutivas. El flujo de creación en dispositivo usa exactamente esta aleatoriedad para generar la frase.
Notas sobre la aleatoriedad
- El MCU lee directamente el periférico RNG por hardware del STM32, y el firmware además rechaza las salidas duplicadas consecutivas. Esta ruta no usa Yasmarang ni
libngu.
Consejos de seguridad para los usuarios
- No importa de dónde venga la entropía: una vez que una frase de recuperación se filtra, cualquiera puede restaurar la billetera. Respaldarla sin conexión y con precisión siempre es tu responsabilidad.
- Si se pierde una frase de recuperación, ningún dispositivo, aplicación ni fabricante puede recuperarla por ti.
Lecturas adicionales y fuentes
- Centro de Ayuda de OneKey: ¿Cómo genera una billetera de hardware OneKey una frase de recuperación y garantiza su aleatoriedad?
- OneKey Pro:
reset_device - OneKey Pro: implementación de la fuente de aleatoriedad
- OneKey Pro: configuración de compilación que habilita THD89 por defecto
- Classic 1S:
reset.c - Classic 1S:
config.c - OneKey Classic / Mini:
reset.c - Commit histórico: el Mini usando Microchip ATECC608






