486 / 736SEED-GEN

Seed Generation

Generación del seed de una cartera

Al crear una cartera, sus palabras de respaldo deben proceder de una aleatoriedad que nadie más pueda predecir. Seed Generation es el proceso que crea y transforma ese punto de partida secreto. Que la cartera acepte una secuencia con el número correcto de palabras no significa que sea segura.

En el procedimiento habitual de BIP39, unos datos aleatorios se convierten en palabras de respaldo, o Seed Phrase. Estas palabras y una passphrase opcional, una contraseña adicional, producen el seed: datos secretos a partir de los cuales BIP32 puede derivar un árbol de claves. Datos aleatorios, palabras, seed y claves son etapas distintas del mismo recorrido. Otros formatos de respaldo pueden funcionar de otra manera.

Imagina que quieres recordar fácilmente el respaldo y escoges palabras de tu libro favorito. A ti pueden parecerte originales, pero un atacante puede probar precisamente citas y patrones humanos conocidos. Por eso BIP39 parte de aleatoriedad generada por ordenador y después la representa mediante palabras. La entropía describe su imprevisibilidad. Las palabras son una forma legible de anotar datos secretos, no una invitación a inventar una frase. [1]

La cartera necesita obtener datos aleatorios de verdad, no solo llamar a una función con el nombre adecuado. Linux ofrece getrandom(), que por defecto espera a que la fuente del sistema esté preparada. Con GRND_NONBLOCK puede devolver EAGAIN en lugar de esperar: los datos aún no están disponibles. El programa debe comprobar tanto el resultado como el número de bytes, las unidades de datos recibidas. Continuar tras un fallo como si se hubiera creado la entrada secreta podría producir una cartera aparentemente funcional, pero insegura. [2]

Los navegadores también ofrecen una interfaz para obtener datos aleatorios seguros. Web Crypto getRandomValues() rellena un array de enteros con bytes criptográficamente seguros; si se solicitan más de 65536 bytes, falla con QuotaExceededError. Pero esto describe una función, no certifica la seguridad de la página. Una web podría obtener buena aleatoriedad y después filtrar las palabras de respaldo. También hay que revisar el código cargado y lo que hace con el resultado. [3]

Si copias mal una palabra, la cartera puede detectar el error mediante un checksum: una breve comprobación calculada a partir de los datos originales. BIP39 añade 4 bits de control a 128 bits de entrada para formar 12 palabras; 256 bits más 8 bits de control forman 24 palabras. El bit es una unidad básica de información. Los bits de control proceden de una huella de los datos calculada con SHA256, no de nueva entropía independiente. Un checksum válido no demuestra que las palabras sean secretas ni que se hayan generado de forma segura. [1]

Las palabras facilitan el respaldo; el programa necesita transformarlas en datos definidos con precisión. BIP39 emplea la función de derivación PBKDF2-HMAC-SHA512 con 2048 iteraciones para producir un seed de 512 bits. Junto a la frase utiliza un parámetro llamado salt: aquí, el texto literal mnemonic seguido de la passphrase, o de una cadena vacía si no se usa. La frase y este parámetro se procesan en UTF-8 NFKD, que normaliza la representación de los caracteres. Una salida más larga no aporta la aleatoriedad que falta: su longitud no demuestra 512 bits de entropía inicial. [1]

BIP32 describe el paso siguiente. Deriva una clave privada maestra y un chain code, datos auxiliares utilizados para derivar otras claves. Así, la cartera puede crear nuevas direcciones desde un origen común. Técnicamente aplica HMAC-SHA512 con el texto fijo Bitcoin seed como clave de esa función y divide el resultado. Ese texto público no es tu secreto. Una clave privada derivada cuyo valor sea cero o esté fuera del intervalo permitido es inválida. El seed, por tanto, no se convierte en clave privada simplemente cambiándole el nombre. [4]

Los desarrolladores necesitan comprobar que el programa realiza bien los cálculos. Los vectores de prueba ofrecen entradas conocidas y resultados esperados. BIP39 publica conjuntos con entropía, palabras y seed, incluida la passphrase de prueba TREZOR. Obtener el resultado esperado verifica la conversión de esa entrada; no demuestra que el generador real produzca secretos impredecibles. Como estos datos son públicos, nunca deben servir como respaldo secreto de fondos reales. [1]

Entre la fuente de aleatoriedad, las palabras y el almacenamiento del respaldo hay varias etapas. NIST SP 800-90C describe cómo se combinan las fuentes de entropía con los mecanismos de generación de datos aleatorios. Al evaluar una cartera también hay que revisar su versión concreta, la gestión de errores y el paso de datos entre etapas. Un componente bien probado no garantiza por sí solo que otro no pierda o divulgue el secreto. Hay que seguir el proceso completo, no buscar una única etiqueta tranquilizadora. [5]

Para obtener la imagen más completa, lee esta entrada junto con Random Number Generator, BIP 39, HD Wallet, Seed Phrase. También enlazan con esta entrada Random Number Generator, CSPRNG, Deterministic RNG, Entropy Mixing.

DOC · 001BIP39 — Mnemonic generation and seed conversionEspecificación DOC · 002Linux getrandom — Initialization and return valuesDocumentación DOC · 003W3C Web Crypto — getRandomValues contractEspecificación DOC · 004BIP32 — Master key generationEspecificación DOC · 005NIST SP 800-90C — Random bit generator constructionsEspecificación
Revisado: Fuentes primero · No es asesoramiento financiero