Assinaturas com Limite (Threshold Signatures)
Página Inicial
Artigos
Assinaturas com Limite (Threshold Signatures)

Assinaturas com Limite (Threshold Signatures)

Avançado
Publicado em Jul 21, 2019Atualizado em Apr 29, 2021
12m
O esquema de assinaturas com limite (TSS) é um princípio de criptografia para geração e assinatura de chaves distribuídas. O uso da TSS em clientes blockchain é um novo paradigma que pode proporcionar inúmeros benefícios, especialmente em termos de segurança. Em um sentido mais amplo, o TSS pode influenciar o design de sistemas de gerenciamento de chaves (como as carteiras de criptomoedas) e abrir caminho para um suporte nativo em casos de uso DeFi. Dito isto, o TSS ainda é uma nova tecnologia, portanto, os riscos e limitações também devem ser considerados.

Neste artigo, explicaremos o que é o TSS, quais as potenciais vantagens que ele traz para o campo da blockchain, como pode ser implementado em um cliente blockchain, como é comparado aos sistemas Shamir secret sharing e Multisig, quais as diferentes formas de uso do TSS para a gestão de chaves distribuída e, finalmente, discutiremos sobre seus riscos e limitações.

O poder da criptografia

Para entender a tecnologia TSS, precisamos primeiro de algum conhecimento básico em criptografia. Desde a década de 1970, cada vez mais sistemas de Internet (como o TLS e o PGP) empregam criptografia assimétrica, que também é conhecida como criptografia de chave pública (PKC). O PKC utiliza duas chaves: uma pública e uma privada. Embora a chave pública não seja secreta e possa ser publicada e utilizada por qualquer um, a chave privada é um elemento de informação secreta que representa a segurança do sistema.
Encriptação e assinaturas digitais são dois dos usos mais comuns do PKC. Tanto o sistema de encriptação quanto o de assinaturas digitais dependem de um conjunto de três algorítimos. O primeiro, é responsável pela geração do par de chaves privada e pública, o segundo pela geração de um texto de base/assinatura, e o terceiro pelo processo de desencriptação/verificação. No que diz respeito às assinaturas digitais, o algoritmo de assinatura requer a chave privada, que é de conhecimento exclusivo do proprietário, para produzir uma assinatura única. A assinatura está anexada a uma determinada mensagem de uma forma que qualquer pessoa que tenha a chave pública possa verificar a sua autenticidade e exatidão.


Blockchain

Não há dúvidas de que a blockchain é uma tecnologia muito poderosa. Ele fornece uma camada de consenso que organiza e registra eventos. Uma infraestrutura desse tipo proporciona, aos seus usuários, potencial para construir economias e até mesmo governos descentralizados. Surpreendentemente, a criptografia necessária para executar uma blockchain simples pode ser inteiramente baseada em assinaturas digitais. No contexto de uma Blockchain, as chaves privadas representam identidades enquanto uma assinatura é uma afirmação pública ou uma reivindicação feita por alguma identidade. A blockchain irá ordenar as instruções e validá-las de acordo com um conjunto de regras, que garantem, entre outras coisas, que as assinaturas são corretas e não podem ser falsificadas.
Ao contrário da criptografia mais clássica utilizada na blockchain, a caixa de ferramentas moderna da criptografia inclui alguns incríveis truques: provas de conhecimento zero (zero-knowledge proofs), criptografia homomórfica e computação de múltiplas partes (multi-party) são alguns dos exemplos que podemos citar. Como vimos ao longo da última década, as pesquisas sobre blockchain impulsionaram fortemente a aplicação da criptografia, com avanços recentes em todas as aplicações citadas acima e muitas outras. 

Neste artigo, concentraremos a nossa atenção em um único avanço: assinaturas com limite (TSS) seguras e eficazes.


MPC e o esquema de assinatura com limite (TSS)

A computação de múltiplas partes (MPC) é um ramo da criptografia que começou com o trabalho de Andrew C. Yao, há quase 40 anos. Na MPC, um grupo composto por partes ou agentes que não confiam uns nos outros, tentam processar de forma conjunta uma função sobre seus inputs, mantendo a privacidade do conteúdo dos mesmos. 

Como exemplo, digamos que os funcionários de uma empresa querem saber quem é o funcionário mais bem pago entre eles, mas sem que nenhum deles revele ao outro o seu salário. Aqui, as entradas privadas (inputs) são os salários e a saída (output) será o nome do empregado com o maior salário. A execução deste cálculo computacional usando MPC permite que nenhuma informação de salário vaze durante o processo. 

As duas principais características da MPC são a exatidão e privacidade:

  • Exatidão: a saída (output) produzido por um algoritmo é correta (como previsto).

  • Privacidade: os dados secretos de entrada (input) que uma das partes mantém não vazam para as outras partes.

Usaremos a MPC para calcular uma assinatura digital de uma forma distribuída. Vejamos como as propriedades mencionadas se aplicam às assinaturas. Lembrando que, para assinaturas, temos três passos: 

  • Geração da chave: o primeiro passo é também o mais complexo. Precisamos gerar uma chave que seja pública e utilizada para verificar futuras assinaturas. Mas também precisamos gerar um segredo individual para cada parte, que chamaremos de "secret share" (parte do segredo). Em termos de exatidão e privacidade, dizemos que a função irá produzir como output a mesma chave pública para todas as partes, e uma outra parte secreta (secret share) para cada um desses elementos de modo que: (1) privacidade: nenhum dos dados da parte secreta sejam divulgados entre as partes e (2) exatidão: a chave pública é uma função das partes secretas.

  • Assinatura: esta etapa envolve uma função para geração de assinatura. A entrada (input) de cada parte será sua parte secreta (secret share), criada como saída (output) da etapa anterior (geração de chaves distribuída). Existe também uma informação de entrada (input) pública conhecida por todos, que é a mensagem que deve ser "assinada" (confirmada). A saída (output) será uma assinatura digital, e a propriedade da privacidade garante que não ocorra nenhum vazamento de partes secretas durante o processo de computação dos dados.

  • Verificação: o algoritmo de verificação permanece como está na configuração clássica. Para ser compatível com as assinaturas de chave única, todos os que tiverem conhecimento da chave pública devem ser capazes de verificar e validar as assinaturas. Isso é exatamente o que os nós de validação da blockchain fazem.

Threshold signature scheme (TSS) é o nome que damos a esse processo composto pela geração de chaves distribuídas (DKG) com a assinatura distribuída de um esquema de assinaturas com limite.


Combinação do TSS com blockchains

A forma natural de implementar o TSS em uma blockchain é alterando um cliente de blockchain para gerar chaves e assinaturas usando o esquema TSS. Aqui, usamos o termo cliente blockchain para se referir ao conjunto de comandos executados por um completo (full node). Na prática, a tecnologia TSS permite substituir todos os comandos relativos à chave privada por uma tecnologia de computação distribuída.

Para explicar mais detalhes, começaremos descrevendo brevemente como novos endereços são criados no esquema clássico da blockchain.  Basicamente, podemos criar um novo endereço gerando uma chave privada para depois computar a chave pública a partir dessa chave privada. Por fim, o endereço público será um derivado da chave pública.

Assim, usando o esquema TSS, teríamos um conjunto de "n" partes, cada uma delas na posse de uma "secret share" da chave privada, que computaria conjuntamente a chave pública (sem revelar as partes secretas individuais entre si). Da chave pública, podemos extrair o endereço público da mesma forma que no sistema tradicional, fazendo com que a blockchain seja indiferente em relação à maneira que o endereço foi criado. A vantagem é que a chave privada não é mais um único ponto de falha porque cada uma das partes tem apenas uma parcela dela. 

O mesmo pode ser feito ao assinar (validar) transações. Neste caso, em vez de uma única parte assinar com a sua chave privada, realizamos uma geração de assinaturas distribuída entre múltiplas partes. Assim, cada uma das partes pode produzir uma assinatura válida, contanto que um número suficiente das partes esteja agindo honestamente. Ou seja, novamente passamos de um método de computação local (ponto único de falha) para um método interativo.

É importante mencionar que a geração de chaves distribuídas pode ser feita de uma maneira que permite diferentes tipos de estruturas de acesso: a configuração geral “t out of n” será capaz de suportar, sem comprometer a segurança, até "t" falhas arbitrárias em operações relacionadas à chave privada.


TSS vs. Multisig

Algumas blockchains oferecem funcionalidade TSS como parte integrante ou programável do software. Chamamos esta funcionalidade de multisig ou multi-assinatura. Para entender melhor as diferenças, podemos ver o multisig como uma TSS na camada de aplicação da blockchain.

Em outras palavras, tanto o multisig como o esquema TSS tentam, essencialmente, alcançar os mesmos resultados. Entretanto, o TSS usa criptografia off-chain (fora da cadeia), enquanto o multisig ocorre on-chain (na cadeia). No entanto, a blockchain precisa de uma maneira de codificar o multisig. Isso pode prejudicar a privacidade porque a estrutura de acesso (número de assinaturas) é exposta na blockchain. O custo de uma transação multisig é maior porque a informação sobre os diferentes assinantes (validadores) também deve ser comunicada na blockchain.

Em TSS, os dados dos assinantes’ são guardados em uma transação de aparência regular, reduzindo o custo e mantendo a privacidade. Por outro lado, o multisig pode ser não interativo, o que resolve o problema de executar uma complexa camada de comunicação entre os diferentes assinantes.

A principal diferença é que o multisig é específico da blockchain e precisa ser reimplementado para cada blockchain mas, em alguns casos, isso é totalmente inviável. Por outro lado, o TSS está dependendo de criptografia pura, então o suporte é sempre possível. Um excelente artigo com ilustrações sobre essas diferenças pode ser encontrado aqui.


TSS vs. Shamir secret sharing scheme

O esquema de compatilhamento de segredos de Shamir (SSSS) fornece uma maneira de armazenar a chave privada de uma forma distribuída, de modo que enquanto a chave privada for mantida em repouso  ela é mantida em múltiplas localizações. Existem duas diferenças entre SSSS e TSS:

  • Geração de chave: no esquema SSSS, há uma única parte chamada de “the dealer” que é responsável por gerar as partes secretas (secret shares) da chave privada. Isso significa que, no momento da geração de chave, a chave privada é gerada em um único local e depois distribuída pelo dealer para diferentes locais. No TSS, não há nenhum dealer, uma vez que essa função é feita de modo a que a chave privada completa nunca esteja em uma única localização.

  • Assinatura: em SSSS, as partes devem reconstruir a chave privada completa para assinar, o que mais uma vez resulta em um único ponto de falha para cada vez que uma assinatura é necessária. No TSS, a assinatura é feita de forma distribuída sem nunca reconstruir as partes secretas (secret shares).

Como podemos ver, no TSS, a chave privada (que representa a segurança do sistema) nunca está em um único local ao longo de toda a sua existência.


Threshold wallets

Uma carteira baseada na tecnologia TSS é um pouco diferente das tradicionais carteiras de criptomoedas. Normalmente, uma carteira convencional gera uma "seed phrase" (frase semente) e a usa para determinar os endereços. Depois o usuário pode usar essa estrutura hierárquica e determinista (HD) para 1) alcançar as chaves privadas que correspondem aos endereços públicos de carteira e assinar transações com eles; e 2) recuperar todas as chaves de carteira usando a seed phrase.

Em uma threshold wallet, as coisas são mais complexas. Embora seja possível gerar uma estrutura HD, sua geração deve ser computada de forma distribuída, como outro protocolo MPC. As partes devem decidir em conjunto qual é a próxima chave a ser utilizada. Em outras palavras, cada uma das partes terá uma seed phrase própria. As seed phrases são geradas separadamente e nunca combinadas para que uma parte sozinha não possa derivar a chave privada de sua seed phrase.

As carteiras baseadas em TSS, também têm um bom recurso de segurança, que habilita a rotação de chave privada sem alterar os endereços de chave pública e de blockchain correspondentes. A rotação de chave privada, também conhecida como proactive secret sharing, é mais um protocolo MPC que recebe as secret shares como entrada (input) e extrai (output) um novo conjunto de secret shares. As antigas secret shares podem ser excluídas e as novas podem ser utilizadas da mesma forma.

Esta estrutura adiciona uma dimensão de tempo à segurança, o que significa que um agente malicioso deve estar em vários locais ao mesmo tempo para ser capaz de invadir uma threshold wallet. Combinar secret shares antes e depois da rotação não dará ao agente invasor nenhum poder adicional se ele tiver a intenção de falsificar uma assinatura. 

Um ponto negativo deste tipo de carteira é que a falta de uma seed phrase a torna incompatível com o sistemas de carteira de chaves únicas. Então, é importante considerar quais partes terão posse das secret shares.

Existem algumas arquiteturas possíveis:

  • Outsourcing TSS: o usuário permitirá que “n” servidores executem o processo de computação em seu nome. Externalizar efetivamente a geração de chave, gestão e assinatura à provedores de serviços que não são donos dos ativos porém, fornecem uma camada de segurança em retorno de algum incentivo.

  • Usar múltiplos dispositivos: O usuário executará o TSS entre os dispositivos que possui. Por exemplo - uma das partes será um dispositivo IoT, outra parte será o celular do usuário, outra parte seu laptop, etc.

  • Híbrido: O TSS será executado de tal forma que algumas partes são controlados por prestadores de serviços externos e outras são executadas em dispositivos de propriedade do usuário.

O primeiro método alivia o cliente do usuário da parte pesada de cálculos computacionais do TSS. Por outro lado, os prestadores de serviços podem conspirar (presumindo que eles não sofreram ataques simultâneos, mas na prática pode acontecer) e roubar os bens do usuário.

O segundo método proporciona controle total ao usuário, porém torna o processo mais pesado para realizar transações, pois serão necessários vários dispositivos online executando os cálculos computacionais do TSS.

A terceira opção é considerada a melhor, pois dá ao usuário uma maneira fácil e rápida de realizar transações, mas sem descartar a necessidade de sua autorização para a realizá-las.


TSS e contratos inteligentes 

Ao longo dos anos, pesquisadores encontraram muitas utilizações para assinaturas digitais, e algumas são surpreendentemente importantes. Conforme mencionado anteriormente, o TSS é um princípio criptográfico que pode melhorar muito a segurança. No contexto das blockchains, podemos dizer que muitas funcionalidades podem ser substituídas pela criptografia baseada no TSS. Aplicações descentralizadas, soluções de escala layer 2, atomic swaps, mixing, herança e muito mais podem ser construídos sobre a estrutura TSS. Isto permitiria, eventualmente, substituir operações caras e arriscadas de contratos inteligentes on-chain (na cadeia) por alternativas mais baratas e confiáveis.
Alguns exemplos concretos: MultiHop Locks utiliza assinaturas de duas partes de uma forma inteligente e pode ser usado como alternativa à lightning network da Bitcoin com uma rede de pagamento mais segura e com maior privacidade. ShareLock é provavelmente a solução de mixing on-chain mais barata para o sistema Ethereum, baseada na verificação de uma única assinatura com limite (threshold signature).


Riscos

Nos últimos dois anos, registrou-se um aumento significativo das implementações do esquema TSS. No entanto, por ser uma tecnologia relativamente nova, ainda apresenta algumas limitações e preocupações. Em comparação com a criptografia de chave pública clássica, protocolos TSS podem ser muito complexos e ainda precisam passar por mais testes. Geralmente, o esquema TSS requer pressupostos adicionais (relacionados à criptografia) mais fracos quando comparados com assinaturas digitais simples. Como resultado, agentes maliciosos que não existiam em configurações tradicionais estão agora sendo descobertos (veja esta apresentação da Breaking Bitcoin Conference 2019). Os engenheiros de segurança e criptógrafos podem ajudar na implantação segura do TSS no sistema.


Considerações finais

Neste artigo, introduzimos os conceitos básicos do esquema de assinatura com limites (TSS), que é um princípio criptográfico fascinante e que tem o potencial de mudar significativamente a forma como utilizamos a blockchain.

Como este artigo não discutiu o Threshold ECDSA que pode ser usado na Binance Chain e na Bitcoin, os interessados podem consultar a seguinte lista de documentos recentes. Além disso, se quiser testar algumas implementações do TSS, você pode encontrar um código para a carteira de duas partes (two-party wallet) da Binance Chain aqui ou testar aZenGo wallet, que utiliza o método híbrido para fornecer uma carteira two-party wallet da Binance Chain, sem custódia.


Leituras adicionais: