Glosario / Direcciones y claves
Derivación endurecida frente a no endurecida
- ¿Qué es la derivación endurecida frente a no endurecida?
- La derivación endurecida y la no endurecida dividen por la mitad los índices de claves hijas de BIP-32: las hijas no endurecidas pueden calcularse a partir de una clave pública extendida, y las endurecidas no.
Se especifica en el BIP-32.
El endurecimiento es una frontera en su ruta de derivación, no una opción que se activa y desactiva. BIP-32 se asignó el 11 de febrero de 2012 solo con la derivación no endurecida; la derivación privada para índices iguales o superiores a 0x80000000 se añadió el 16 de abril de 2013, y esas claves pasaron a llamarse endurecidas el 15 de enero de 2014. Dónde cae esa frontera decide cuánto de su billetera entrega una clave pública extendida compartida.
Cómo funciona
La derivación no endurecida tiene una propiedad de la que la derivación endurecida carece a propósito, y BIP-32 registra la diferencia como una identidad algebraica. Sea N() la neutralización, el paso que descarta la mitad privada de una clave extendida y conserva el código de cadena de 32 bytes. A través de niveles no endurecidos, N(m/a/b/c) es igual a N(m)/a/b/c, así que neutralizar antes de derivar y neutralizar después de derivar llevan a la misma clave. En un nivel endurecido la reescritura deja de valer: N(m/a') no puede convertirse en N(m)/a', porque la derivación pública solo está definida para claves hijas no endurecidas y devuelve un fallo para cualquier otra.
En lo mecánico, los dos modos difieren en un solo campo. Ambos usan el código de cadena de la clave padre como clave de un HMAC-SHA512 y añaden el índice de 4 bytes. El modo no endurecido aporta la clave pública comprimida de la clave padre; el modo endurecido aporta el secreto de la clave padre, rellenado con un byte cero a la izquierda hasta el mismo ancho de 33 bytes. Nada que tenga solo una xpub posee ese segundo valor de entrada, así que la derivación se detiene en la frontera.
BIP-32 es inusualmente franco sobre lo que las claves no endurecidas no logran proteger. Su sección de seguridad enumera dos propiedades como ausentes y no como presentes: dada una clave pública extendida padre y una clave pública hija, encontrar el índice no es difícil, y dada esa misma clave pública extendida padre más una clave privada hija no endurecida cualquiera, recuperar la clave privada extendida padre tampoco es difícil. La primera le cuesta privacidad. La segunda le cuesta la rama.
Dónde aparece
Los niveles no endurecidos son lo que hace que merezca la pena exportar una clave pública extendida, y BIP-32 dedica una sección a los acuerdos de uso compartido que se apoyan en ellos. Un auditor que recibe las claves públicas extendidas de las cuentas ve cada pago que entra y sale de cada cuenta, y ni una sola clave privada. Dos empresas que comercian a menudo pueden compartir la cadena externa de una sola cuenta como dirección permanente a la que pagar, de modo que ninguna tenga que solicitar una nueva para cada transferencia. Una tienda web puede entregar el mismo tipo de clave a su servidor web, que entonces genera direcciones de recepción desde las que no tiene capacidad de gastar.
La estructura que sitúa la frontera en el nivel de cuenta es un consejo, no una regla. BIP-32 califica de solo orientativa su estructura de nodo maestro, cuenta, cadena y subcadena, y dice a las implementaciones que pueden apartarse de ella por necesidades específicas, razón por la cual una billetera conforme puede endurecer más niveles que la billetera conforme de al lado.
Conviene conocer una trampa de interoperabilidad, porque la especificación recibió dos parches por su causa. Los vectores de prueba de derivación endurecida con ceros a la izquierda se añadieron el 24 de febrero de 2017 y de nuevo el 4 de noviembre de 2020. El valor de entrada endurecido tiene una longitud fija de 33 bytes, un byte cero seguido del secreto de 32 bytes, así que el software que recorta un cero a la izquierda en lugar de mantener ese ancho calcula el hash de datos distintos, produce una rama distinta y encuentra una billetera vacía cuando alguien restaura esa semilla en otro programa. La derivación no endurecida nunca se topa con este error, porque una clave pública comprimida siempre empieza por 0x02 o 0x03 y, por lo tanto, no tiene ningún cero a la izquierda que perder.