Autor: Omer Shlomovits,ZenGo.
Los Esquemas de Firma con Umbral (Threshold Signature Schemes o TSS) son primitivas criptográficas para la generación y firma de claves distribuidas. El empleo de TSS en clientes blockchain representa un nuevo paradigma que puede proporcionar numerosos beneficios, especialmente, en términos de seguridad. En un sentido más amplio, los TSS pueden influenciar el diseño de los sistemas de gestión de claves (como por ejemplo, los criptomonederos ) y abrir camino para el soporte nativo en casos de uso de tipo DeFi. Dicho esto, los TSS no dejan de ser una tecnología novedosa, por lo que sus riesgos y limitaciones también deberían ser tenidos en cuenta.
A lo largo de este artículo, analizaremos qué son los TSS, qué ventajas potenciales pueden aportar en el ámbito del blockchain, cómo pueden implementarse en los clientes blockchain, cómo se relacionan con los Sistemas de Compartición de Secretos Shamir (Shamir Secret Sharing) y Multisig, cuáles son las distintas maneras de utilizarlos para la gestión de claves distribuidas y, finalmente, discutiremos sus riesgos y limitaciones.
El poder de la criptografía
Para comprender los TSS, en primer lugar necesitaremos ciertos conocimientos básicos de criptografía. Desde la década de 1970, un número cada vez mayor de sistemas de Internet (tales como el TLS y PGP) emplearían criptografía asimétrica, también conocida como Criptografía de Clave Pública o PKC. La PKC se basa en el uso de dos claves: una pública y otra privada. A diferencia de la clave pública (que no es secreta y puede ser publicada y utilizada por cualquiera), la clave privada es un fragmento de información secreta que representa la seguridad del sistema.
La encriptación y las firmas digitales son dos de los casos de uso de la PKC más comunes. Tanto los sistemas de cifrado como los esquemas de firmas digitales dependen de conjuntos de tres algoritmos. El primero es la generación del par clave privada/pública, el segundo es la generación de un texto cifrado/firma, y el tercero es el proceso de desencriptado/verificación. En lo que respecta a las firmas digitales, el algoritmo de firma requiere la clave privada, que sólo conoce su propietario, para producir una firma única. La firma se adjunta a un mensaje determinado, de forma tal, que cualquiera que esté en posesión de la clave pública podrá verificar su autenticidad y exactitud.
Blockchain
No cabe duda de que el blockchain es una tecnología muy poderosa. Proporciona una capa de consenso (consensus layer) que se encarga de organizar y registrar eventos. Una infraestructura de este tipo nos otorga, a los usuarios, la capacidad potencial de construir economías descentralizadas e, incluso, gobiernos. Sorprendentemente, la criptografía necesaria para ejecutar una blockchain básica puede estar basada, exclusivamente, en firmas digitales. En el contexto de una blockchain, las claves privadas representan identidades -mientras que las firmas son declaraciones públicas o reclamos realizados por las mismas. El blockchain ordena las declaraciones y las valida conforme a un conjunto de reglas que, entre otras cosas, garantizan que las firmas son correctas y no pueden ser falsificadas.
En contraste con la criptografía más clásica utilizada en el blockchain, el conjunto de herramientas propias de la criptografía moderna incluye algunos trucos mágicos formidables: zero-knowledge proofs, cifrado homomórfico, computación multipartita (multi-party computation), por nombrar solamente unos cuantos. Como hemos podido ver a lo largo de la pasada década, la investigación en el ámbito del blockchain ha impulsado enormemente la criptografía aplicada, con progresos recientes en todas las aplicaciones que acabamos de citar y muchas otras.
En este artículo, nos centraremos en uno de dichos avances: las firmas con umbral (TSS) eficientes y seguras.
MPC y Esquemas de Firma con Umbral (TSS)
La computación multipartita (multi-party computation o MPC) es una rama de la criptografía que se originó a partir de la obra seminal de Andrew C. Yao, hace aproximadamente unos 40 años. En la MPC, un conjunto de actores que no confían los unos de los otros, intentan procesar de forma conjunta una función sobre sus inputs, manteniendo la privacidad del contenido de las mismas.
Por poner un ejemplo, digamos que “n” empleados de una empresa quieren saber quién de ellos es el que está cobrando más, pero sin confesarse los unos a los otros su salario real. En este caso, los inputs privados son los salarios, y el output será el nombre del empleado con el salario más elevado. Al realizar dicha computación mediante MPC logramos que ni un solo salario se filtre durante el proceso.
Las dos propiedades principales de la MPC son la corrección y privacidad:
- Corrección: el output producido por un algoritmo es correcto (tal como se esperaba).
- Privacidad: los datos de entrada secretos que están en posesión de una de las partes no se filtrarán a las otras.
A continuación, emplearemos la MPC para procesar una firma digital de manera distribuida. De esta forma, veremos cómo las propiedades anteriormente mencionadas pueden aplicarse a las firmas. Cabe recordar que, en el caso de estas últimas, nos encontramos con tres pasos:
- Generación de la Clave: el primer paso es también el más complejo. Necesitamos generar una clave que será pública y se utilizará para verificar las futuras firmas. Pero también deberemos generar una secreto individual para cada una de las partes, que denominaremos “secret share” (porción secreta). En términos de corrección y privacidad, se dice que la función producirá la misma clave pública para todas las partes, y una “secret share” para cada una de ellas, por lo que: (1) privacidad: no se filtrarán entre las partes datos de las “secret shares”, y (2)corrección: la clave pública es una función de las “secret shares”.
- Firma: este paso conlleva una función de generación de firmas. El input de cada una de las partes será su “secret share”, creada como output del paso previo (generación de clave distribuida). Existe también un input público conocido por todos, que es el mensaje que se debe firmar. El output será una firma digital, y la propiedad de la privacidad garantizará que no se habrán producido filtraciones relativas a las “secret shares” durante la computación.
- Verificación: el algoritmo de verificación se mantiene tal como se presenta en la configuración clásica. Para ser compatible con las firmas de clave única, todo aquel que conozca la clave pública debería ser capaz de verificar y validar las firmas. Esto es exactamente lo que los nodos de validación de las blockchains hacen.
El nombre que damos a estas composiciones de generación de claves distribuidas (DKG) y firma distribuida es el de Esquemas de Firma con Umbral (TSS).
Combinar TSS con blockchains
La forma natural de implementar TSS en una blockchain es cambiando el cliente de esta última, para que genere claves y firmas utilizando TSS. Aquí utilizamos el término cliente de una blockchain para referirnos al conjunto de comandos ejecutados por un nodo completo (full node). En la práctica, la tecnología TSS nos permite reemplazar todos los comandos relacionados con la calve privada por computaciones distribuidas.
Para explicarlo con mayor detalle, empezaremos describiendo la forma en que las nuevas direcciones se crean en el esquema blockchain clásico. En pocas palabras, podemos crear una dirección nueva generando una clave privada para, a continuación, computar la clave pública a partir de ella. Finalmente, la dirección pública se derivará de la clave pública.
Así, utilizando TSS, tendríamos un conjunto de “n” partes, cada una de ellas en posesión de una “secret share” de la clave privada, que computarán de forma conjunta la clave pública (sin revelarse entre sí las porciones individuales secretas). A partir de la clave pública, podemos derivar la dirección pública de la misma manera que en el sistema tradicional, lo que hace que la blockchain sea agnóstica respecto a la forma en que se genera la dirección. La ventaja es que la clave privada deja de ser un “single point of failure” (punto único de fallo), porque cada parte sólo dispondrá de una porción de la misma.
Lo mismo puede hacerse al firmar transacciones. En este caso, en lugar de que una única parte firme con su clave privada, ejecutaremos una generación de firmas distribuida entre múltiples partes. Por lo tanto, en la medida que un número suficiente de las partes actúe de forma honesta, cada una podrá producir una firma válida. Así que, nuevamente, hemos pasado de un esquema de computación local (single point of failure o punto único de fallo) a uno interactivo.
Es importante mencionar que la generación de claves distribuida puede realizarse de una manera que permite diferentes tipos de estructuras de acceso: la configuración general “t out of n” permitirá soportar hasta “t” fallos arbitrarios en operaciones relacionadas con la clave privada, sin comprometer la seguridad.
TSS vs. Multisig
Algunas blockchains ofrecen funcionalidad TSS como parte integrada o programable del software. Llamamos a esta funcionalidad multisig o multi-firma. Para entender mejor las diferencias, podemos considerar multisig como un TSS en la capa de aplicación de la blockchain.
Dicho de otro modo, tanto el multisig como las TSS están tratando esencialmente de alcanzar objetivos similares, pero las TSS están utilizando criptografía off-chain (fuera de cadena), mientras que el multisig sucede on-chain (en la cadena). Sin embargo, la blockchain necesita una forma de codificar multisig, lo que podría dañar la privacidad porque la estructura de acceso (número de firmantes) está expuesta en la blockchain. El coste de una transacción multisig es mayor porque la información sobre los diferentes firmantes también debe ser comunicada en la blockchain.
En TSS, los datos de los firmantes’ se guardan en una transacción con aspecto regular, reduciendo el costo y manteniendo la privacidad. Por otra parte, multisig puede ser no interactivo, lo que ahorra el problema de ejecutar una compleja capa de comunicación entre los diferentes firmantes.
El punto principal de diferencia es que el multisig es específico de la blockchain y debe ser reembolsado por cada blockchain, y en algunos casos no está soportado en lo absoluto. Por el contrario, TSS depende de la criptografía pura, por lo que siempre es posible el soporte. Un gran artículo con ilustraciones sobre las diferencias se puede encontrar aquí.
TSS vs. Sistema de compartición de secretos de Shamir
El Sistema de compartición de secretos de Shamir (SSSS) proporciona una forma de almacenar la clave privada de una manera distribuida de tal manera que mientras la clave privada está en reposo , se almacena en múltiples ubicaciones. Hay dos diferencias entre SSSS y TSS:
- Generación de claves: en SSSS, hay una única parte llamada el “distribuidor” que se encarga de generar las comparticiones secretas de la clave privada. Significa que en el momento de la generación de claves, la clave privada se genera en una única ubicación y luego se distribuye por el distribuidor a los diferentes lugares. En TSS, no hay ningún distribuidor porque su rol se distribuye de tal manera que la clave privada completa nunca se encuentra en una única ubicación.
- Firma: en SSSS, las partes deben reconstruir la clave privada completa para firmar, lo que de nuevo da lugar a un único punto de fracaso cada vez que se necesita una firma. En TSS, la firma se realiza de forma distribuida sin nunca reconstruir las partes secretas.
Como podemos ver, en TSS la clave privada (que representa la seguridad del sistema) nunca se encuentra en una única ubicación durante toda su vida.
Carteras Threshold
Una cartera basada en la tecnología TSS es un poco diferente a la tradicional cartera de criptomonedas. Normalmente, una cartera convencional genera una frase semilla y la usa para derivar deterministicamente las direcciones. Posteriormente, el usuario puede usar esta estructura determinista jerárquica (HD) para 1) alcanzar las claves privadas que corresponden a las direcciones públicas de la cartera y firmar transacciones con ellas, y 2) para recuperar todas las claves de la cartera utilizando la frase semilla.
En una cartera threshold, las cosas son más complejas. Aunque es posible generar una estructura HD, su generación debe ser computada de una manera distribuida, como otro protocolo MPC. Las partes deben decidir conjuntamente cuál es la próxima clave que se utilizará. En otras palabras, cada parte tendrá una frase de semilla propia. Las frases de semillas se generan por separado y nunca se combinan para que una sola parte no pueda derivar las claves privadas de su semilla.
Las carteras basadas en TSS también tienen una buena característica de seguridad, que es habilitando la rotación de claves privadas sin cambiar la clave pública y la dirección de blockchain correspondiente. La rotación de claves privadas, también conocida como intercambio secreto proactivo, es otro protocolo MPC que toma los recursos compartidos secretos como entrada y genera un nuevo conjunto de recursos compartidos secretos. Las antiguas claves secretas pueden ser eliminadas y las nuevas pueden ser utilizadas de la misma manera.
Esta estructura añade una dimensión de tiempo a la seguridad, lo que significa que un atacante debe estar en múltiples ubicaciones al mismo tiempo para atacar una cartera threshold. Combinar claves secretas antes de la rotación y después de la rotación no dará al atacante poder extra si desea falsificar una firma.
Una desventaja de este tipo de cartera es que la falta de una frase de semilla la hace incompatible con los sistemas de cartera de clave única. Así que es importante que consideres qué partes conservarán las claves secretas.
Hay algunas arquitecturas posibles:
- TSS externalización: el usuario permitirá que “n” servidores ejecuten la computación en su nombre. Externalizar efectivamente la generación, gestión y firma clave a los proveedores de servicios que no son los propietarios de los activos, pero proporcionar una capa de seguridad a cambio de algún incentivo.
- Usar múltiples dispositivos: El usuario ejecutará las TSS entre los dispositivos que poseen. Por ejemplo – una parte será un dispositivo IoT, otra parte será el móvil de usuario, otra parte su portátil, etc.
- Hibrido: TSS se ejecutará tal que algunas partes están controladas por proveedores de servicios externos y algunas partes se ejecutan en dispositivos de propiedad del usuario.
El primer método permite la computación pesada de TSS desde el lado del cliente de usuario. Por otra parte, los proveedores de servicios pueden colisionar (asumimos que suficiente de ellos no son atacados al mismo tiempo, pero en la práctica, podrían) y robar los activos del usuario.
El segundo método da al usuario un control completo, pero hace que sea engorroso realizar transacciones ya que necesita múltiples dispositivos para estar en línea y comprometerse con la computación TSS.
La tercera opción se considera la mejor de ambos mundos, ya que da al usuario una forma fácil y rápida de realizar transacciones pero sin comprometerse a realizar transacciones sin la autorización del usuario.
TSS y contratos inteligentes
A lo largo de los años, los investigadores han encontrado muchos usos para firmas digitales, y algunos son sorprendentemente no triviales. Como se ha mencionado, TSS es un primitivo criptográfico que puede aumentar enormemente la seguridad. En el contexto de las blockchains, podemos decir que muchas funcionalidades pueden ser reemplazadas por criptografía basada en TSS. Aplicaciones descentralizadas, soluciones de escalabilidad de tipo layer 2, swaps atómicos, mixing, herencia y mucho más pueden construirse sobre un framework TSS. Esto permitiría finalmente que las costosas y arriesgadas operaciones de contratos inteligentes on-chain fueran sustituidas por alternativas más baratas y fiables.
Para dar algunos ejemplos concretos: Multi-Hop Locks hace uso de firmas de dos partes de una manera inteligente y puede ser utilizado como una alternativa a lightning network de Bitcoin con una red de canales de pago más segura y privada. ShareLock es probablemente la solución de mezcla on-chain más barata para Ethereum, basada en la verificación de una firma de threshold única.
Riesgos
En los últimos dos años, se ha producido un aumento significativo de las implementaciones de TSS. Sin embargo, como tecnología relativamente nueva, sigue teniendo algunas limitaciones y preocupaciones. Comparado con la criptografía clásica de claves públicas, los protocolos TSS pueden ser muy complejos y todavía están siendo “probados en la batalla”. Generalmente, las TSS requieren presunciones más débiles y criptográficas comparadas con firmas digitales simples. Como resultado, se están descubriendo vectores de ataque criptográfico que no existían en las configuraciones tradicionales (vea esta presentación de Breaking Bitcoin Conference 2019). Los ingenieros de seguridad y los criptógrafos aplicados pueden ayudar a desplegar TSS de forma segura en tu sistema.
En conclusión
En este artículo, introdujimos los conceptos básicos del esquema de firma de umbral (TSS), el cual es un fascinante primitivo criptográfico que tiene el potencial de cambiar significativamente la forma en que utilizamos blockchain.
Dado que este artículo no discutió el Threshold ECDSA que se puede utilizar en Binance Chain y Bitcoin, los interesados pueden referirse a la siguiente lista de documentos recientes. Además, si quieres jugar con algunas implementaciones TSS, puedes encontrar un código para la cartera de binance Chain de dos partes aquí o probar ZenGo wallet, que utiliza el método híbrido para proporcionar una cartera de binance de dos partes no custodial.
Lecturas adicionales:
- ECDSA Firma rápida de dos partes segura
- ECDSA rápido y seguro de múltiples partes con Generación de Clave Distribuida Práctica y Aplicaciones de Custodia de criptomonedas
- ECDSA de dos partes de Hash Proof Systems y Instanciaciones Eficientes
- Threshold ECDSA rápido y de múltiples partes con configuración rápida trustless
- ECDSA seguro de dos partes de las Asunciones ECDSA
- Threshold ECDSA de las Asunciones ECDSA: El Caso de múltiples partes