Glosario / Direcciones y claves
Código de cadena
- ¿Qué es un código de cadena?
- Un código de cadena es el valor de 32 bytes de entropía adicional que acompaña a cada clave en una billetera HD y se mezcla en cada derivación de una clave hija, para que las claves no puedan adivinarse a partir de sus hermanas.
Se especifica en el BIP-32.
La mitad de toda clave extendida no es una clave en absoluto. BIP-32 divide un hash de 512 bits en una clave de 256 bits y un código de cadena de 256 bits, y la cadena de caracteres de una xpub lleva ambos, 111 caracteres en total. Si alguna vez entrega una xpub, está entregando con ella el código de cadena, y eso es lo que permite al destinatario derivar sus direcciones futuras.
Cómo funciona
Un código de cadena hace su trabajo dentro de una sola llamada a HMAC. Derivar una clave hija ejecuta HMAC-SHA512 con el código de cadena de la clave padre como clave y la clave pública padre más un índice de cuatro bytes como mensaje. El resultado de 64 bytes se divide por la mitad: los 32 bytes de la izquierda se suman a la clave privada padre, módulo el orden de la curva, para dar la clave privada hija, y los 32 bytes de la derecha pasan a ser el código de cadena propio de la clave hija, que esta usará para sus propias hijas.
Lo que decide la sal es quién puede recorrer el árbol. Una clave pública por sí sola no deriva nada, porque la función de derivación no se ejecuta sin el código de cadena correspondiente. Por eso una clave pública extendida no es simplemente una clave pública con un nombre más largo. Es una clave pública más su código de cadena, y entregar ambos a alguien convierte un punto de una curva en una rama ilimitada y enumerable de direcciones que usted todavía no ha usado.
BIP-32 documenta el peligro que resulta de ello. Si un atacante tiene su clave pública extendida y además consigue una clave privada hija no endurecida, restar el desplazamiento derivado recupera la clave privada padre y, con ella, cada clave hermana y cada descendiente. La derivación endurecida existe para cortar esa ruta: en un paso endurecido, el mensaje del que se calcula el hash contiene la clave privada padre en lugar de la pública, así que ninguna cantidad de material público permite a nadie ascender.
Dónde aparece
Usted nunca escribe un código de cadena, y ninguna billetera de consumo muestra uno por separado. Viaja dentro de una clave extendida. Las cadenas de caracteres Base58Check que empiezan por xpub o xprv se decodifican en 78 bytes dispuestos así: 4 bytes de versión, 1 byte de profundidad, una huella digital de la clave padre de 4 bytes, un índice de la clave hija de 4 bytes, el código de cadena de 32 bytes y, por último, la clave de 33 bytes, razón por la cual una xpub ocupa 111 caracteres de texto.
Es en las herramientas para desarrolladores donde el campo se hace visible como campo. La llamada RPC deriveaddresses de Bitcoin Core trabaja con descriptores que incorporan claves extendidas, bibliotecas como python-bip32 devuelven el código de cadena como un atributo aparte, y un dispositivo de firma que exporta una cuenta para una configuración de solo lectura está exportando exactamente esos dos valores.
El nivel de cautela adecuado es el que aplicaría a un historial completo de transacciones, no el que aplicaría a una contraseña. Un código de cadena no puede firmar, así que por sí solo no le hace perder nada. En manos de una empresa de análisis, de un respaldo en la nube o de cualquiera que haya pegado una xpub en una solicitud de soporte, expone cada pago de esa rama, pasado y futuro, y después no hay forma de revocar el acceso.
Código de cadena frente a clave privada
Un código de cadena y una clave privada son ambos 32 bytes de apariencia aleatoria, y solo uno de los dos puede gastar. La clave privada produce firmas. El código de cadena no produce nada salvo más derivación, y precisamente por eso la gente lo subestima: como no puede mover dinero, personas que nunca harían lo mismo con una clave pegan claves públicas extendidas en hojas de cálculo compartidas, informes de errores y aplicaciones de teléfono. El resultado es una ventana permanente a sus finanzas, no un robo, y los dos fallos merecen nombres distintos.