2.3 Soluções Descentralizadas
2.3.2 Identidade Descentralizada
As técnicas para prover identidades descentralizadas buscam construir identificadores que sejam únicos e possam ser verificados de 12 github.com/savoirfairelinux/opendht
13 tox.chat/faq.html#techfaq 14 twister.net.co/?page_id=25 15 yacy.net/en/Technology.html
forma segura, e que não dependam de uma entidade ou organização central para a geração ou verificação delas. Além disso essas técnicas buscam construir meios para associar a esses identificadores, nomes significativos para humanos e que possam ser lembrados por eles. A base principal para essas técnicas são algoritmos de criptografia (seção 2.3.2.1). Eles proveem os aspectos de segurança e unicidade dessas identidades. Sobre eles outras soluções são criadas para permitir associar nomes significativos a humanos, como as apresentadas nas seções 2.3.2.2 e 2.3.2.3. Além disso, são apresentadas algumas técnicas complementares na seção 2.3.2.4.
2.3.2.1 Criptografia para gerenciar identidades descentralizadas
A criptografia pública ou assimétrica é o principal fundamento para a criação de identidades descentralizadas. Ela permite que usuários gerem identidades de forma independente, com chances mínimas de conflito, e provê meios para que essas identidades possam ser comprovadas, sem precisar de uma “terceira parte confiável”.
A base da criptografia assimétrica está na capacidade de utilizar pares de chaves, uma chave pública e uma privada, que permitem a dois pares trocarem dados encriptados sem precisar concordar em uma chave secreta previamente. Além de algoritmos de encriptação, duas outras classes de algoritmos estão relacionadas a esse tipo de criptografia: algoritmos de assinatura e algoritmos de troca de chaves (HOUTVEN, 2017). Algoritmos de assinatura permitem utilizar uma chave privada para autenticar uma determinada mensagem. Isto é, um valor (a assinatura) é gerado a partir de uma entrada, de modo que é possível verificar, através da chave pública relacionada e da entrada utilizada, que a assinatura foi gerada a partir daquela chave. Simultaneamente, a assinatura permite verificar a integridade dos dados assinados.
Os algoritmos de troca de chaves permitem a dois pares compartilharem uma chave secreta, de forma confidencial, através de um meio inseguro. Eles devem ser utilizados em conjunto com técnicas de
autenticação para garantir que a troca de chaves foi efetuada com o par desejado. Caso contrário, ataques de interceptação (maninthemiddle) poderão ser efetuados. Isto é, um atacante pode interferir na comunicação de dois pares durante a troca de chaves, de modo a permitir monitorar e até alterar os dados enviados.
Além desses algoritmos, o uso de criptografia pública requer algoritmos para geração do par de chaves utilizado. Esses algoritmos permitem gerar uma chave privada e, a partir dela, uma chave pública matematicamente relacionada. O oposto, entretanto, não deve ser possível. Isto é, a partir de uma chave pública não deve ser viável gerar a chave privada correspondente. A geração dessas chaves também deve ser resistente a colisões, acidentais ou intencionais. Isto é, as chances para duas chaves idênticas serem geradas devem ser mínimas. Além disso, uma mesma chave pública não deve poder ser gerada a partir de chaves privadas diferentes.
Um outro elemento importante utilizado em conjunto com os algoritmos descritos, e como base de alguns deles, são as funções hash criptográficas. Elas permitem gerar, a partir de uma entrada arbitrária, um valor binário (hash ou digest) com um tamanho fixo de acordo com o algoritmo. Esse valor é gerado de tal forma que para uma mesma entrada sempre será produzida a mesma saída. Porém, qualquer mudança na entrada tende a gerar várias mudanças na saída. Além disso, os algoritmos utilizados tornam muito difícil que a entrada possa ser obtida a partir do seu hash, ou que seja gerada uma entrada tal que possua o mesmo valor de hash de uma outra. Essas propriedades fazem com que as funções hash criptográficas sejam utilizadas, dentre outras coisas, para: prover um identificador único e compacto para arquivos e outros tipos de dados; e verificar a integridade de dados.
O Bitcoin16, uma moeda digital descentralizada, é um exemplo do uso de técnicas de criptografia para gerenciar identidades. No Bitcoin a identidade de um usuário é dada em função de sua “carteira digital”. Cada carteira está associada a pelo menos um par de chaves criptográficas. A 16 bitcoin.org
partir de uma chave pública é gerado um identificador, utilizando funções de hash, que serve de endereço para as transações monetárias. Além disso, a chave privada de uma carteira é utilizada para assinar as transações, que podem ser verificadas através das respectivas chaves públicas. 2.3.2.2 Blockchain e Identidade A blockchain é uma tecnologia desenvolvida para o Bitcoin que atua como um registro público, global e descentralizado de transações. Através de um processo chamado de mining (mineração), as transações são agrupadas em blocos e publicadas através de uma rede peertopeer. Cada bloco referencia o anterior, formando uma cadeia ou corrente de blocos (em inglês, blockchain).
A blockchain provê um mecanismo que permite com que todos os nós da rede utilizem uma base de dados consistente, sem que uma entidade central precise regular as operações. Para isso, todos os nós da rede verificam a validade dos blocos publicados e descartam blocos inválidos (ANTONOPOULOS, 2015). Dessa forma, possíveis erros ou falsificações apenas não seriam propagados. Em alguns casos, entretanto, podem ocorrer divergências (forks), i.e. mais de um bloco ou cadeia válidos, com um antecessor comum. Eventualmente, entretanto, a blockchain converge, pois os nós da rede passam a adotar um único caminho, aquele com maior “computação acumulada”, i.e. com maior número de blocos (ANTONOPOULOS, 2015). Isso poderá ser decidido pela velocidade com que novos blocos forem adicionados a um fork ou outro.
O mecanismo da blockchain embora tenha sido desenvolvido para armazenar transações financeiras, pode ser adaptado a outros aplicações. Uma delas é o registro de nomes. Namecoin é um fork do Bitcoin que foi desenvolvido para isso, i.e. permitir registrar nomes em uma blockchain. Assim, ele segue o mesmo princípio de funcionamento do bitcoin, porém ele permite registrar na blockchain nomes arbitrários e, associados a eles, valores de até 520 bytes (NAMECOIN). Isso permite vincular a um nome
dados de uma identidade, como uma chave pública, ou mesmo um endereço de email.
Para permitir gerenciar os nomes, e.g. registrálos ou atualizálos, o Namecoin utiliza também chaves criptográficas e uma moeda própria, análogas às do Bitcoin. A chave permite verificar a autoria do nome. A moeda permite “comprar nomes”, mas também pode ser utilizada para trocar por outras mercadorias, i.e. como uma moeda digital. A cada novo registro de nome é cobrada uma taxa fixa de 0.01 NMC (namecoins), o que equivale, no momento da escrita, a poucos centavos de Real. Esse valor é uma forma de limitar o “name squashing”, isto é, a aquisição de múltiplos nomes ou nomes desejados para permitir revender no futuro. A taxa de registro é destruída após o registro. Isto é, ela não é transferida para mais ninguém. Além dessa taxa, é pago um valor pela transação, assim como no Bitcoin, como uma recompensa aos mineradores, que verificam as transações da rede. Essa taxa é variável, i.e. definida pelos usuários, mas influencia o quão rápido a transação será inclusa na blockchain. Para atualizar ou renovar um nome é cobrada apenas a taxa da transação (NAMECOIN).
Graças ao uso da blockchain, o Namecoin permite solucionar o triângulo de Zooko. Isto é, através dele é possível registrar nomes significativos para humanos, de forma segura e descentralizada. O Namecoin provê ainda uma alternativa ao DNS e às entidades certificadoras. Ele inclui um TLD alternativo, o “.bit”, que pode ser utilizado para resolver nomes registrados na blockchain do Namecoin (utilizando um namespace específico para isso) em endereços, contanto que o cliente esteja configurado e possua os softwares adequados. O Namecoin apresenta, entretanto, algumas limitações. Uma delas é o tempo de atualização da blockchain. Devido a questões de segurança, cada bloco na blockchain precisa ser validado através de um algoritmo de “prova de trabalho” (Proof of Work), que é intencionalmente lento e custoso (sua verificação, entretanto é rápida). Isso faz com que atualizações possam demorar a ser consideradas válidas. Além disso, o próprio custo em registrar
e manter os nomes, embora seja pequeno, pode servir de barreira para usuários. Esse custo, por sua vez, não soluciona por completo o problema de name squashing, já que mesmo com um custo maior, o custo de revenda será ainda maior (NAMECOIN).
2.3.2.3 Petnames
Um petname é um nome que é utilizado para se referir a uma determinada entidade, mas que é único e significativo apenas de forma local, i.e. para aquele que o definiu. Sistemas de nome seguros podem ser construídos utilizando petnames, ao associálos a identificadores que são únicos (globalmente) e que não podem ser forjados ou falsificados, e.g. chaves criptográficas. Petnames funcionam de forma similar aos contatos de uma agenda telefônica. Mas, invés de facilitar o uso de números telefônicos, eles simplificam o uso de chaves criptográficas. Petnames devem ter, no contexto em que são utilizados, uma associação bidirecional um para um com uma chave (STIEGLER, 2005), de modo que o nome possa ser substituído pela chave e viceversa. Isso evita possíveis ambiguidades para os usuários, e para o sistema.
Petnames provêem uma solução alternativa para o triângulo de Zooko. Isto é, eles combinam as características de chaves criptográficas, i.e. são globais e seguros, com o uso de nomes que são fáceis de lembrar significativos para humanos, mas com escopo local.
Uma das limitações dos petnames, é a necessidade dos usuários definirem nomes para cada “entidade”, com qual eles interagem. Uma forma de lidar com isso é através do uso de “nomes propostos” (alleged names). Isto é, cada entidade pode definir uma sugestão de nome para associar a sua identidade. Outros usuários podem adotar ou não o nome sugerido como um petname.
Um outro mecanismo que pode contribuir para solucionar essa limitação é a possibilidade de importar nomes a partir de contatos conhecidos. Para lidar com os possíveis conflitos gerados, o Gnu Name
System(GNS) adota o conceito de delegação de nomes. Isto é, os petnames de um “contato” podem ser referenciados utilizado o petname desse contanto como um namespace. Por exemplo, se Bob for um contato registrado e ele tiver Alice como contato, ela pode ser referenciada por “alice.bob.gnu”. Os nomes definidos no GNS são compatíveis com o DNS. Eles utilizam o pseudotld “.gnu” como base. O GNS utiliza uma DHT para registrar nomes públicos e permitir a resolução “transitiva”. Validade dos nomes é verificada através de assinaturas criptográficas (WACHS et al, 2014).
O uso de petnames pode ainda apresentar limitações, como a necessidade de gerenciar os contatos adicionados, e a dificuldade de se referenciar a uma entidade em um contexto global, e.g. na Web, já que o nomes são relativos a cada usuário. Entretanto, essa solução não impõe nenhum custo para registrar ou manter nomes, como no Namecoin ou DNS, e permite potencialmente aos usuários utilizarem identificadores mais significativos para eles. Além disso, ela não está exposta ao problema de name squashing, nem pode sofrer censura por um governo ou organização. O Namecoin, especificamente, pode estar vulnerável ao controle de uma organização ou governo caso ele obtenha mais de 50% do poder computacional dos mineradores. Mas isso é considerado improvável, devido ao poder computacional exigido. Além disso, interferências poderiam vir a ser percebidas através da análise da blockchain.
2.3.2.4 Técnicas auxiliares para representar e transmitir identidades
Além das soluções descritas, outras técnicas podem ser utilizadas em conjunto para simplificar a representação, transmissão e verificação de chaves criptográficas (especialmente) por usuários. Elas podem ajudar aos usuários transmitirem chaves de um sistema ou dispositivo para outro e verificarem a validade dessas chaves e se elas correspondem ao esperado, para evitar, por exemplo, erros ou ataques de phishing. O Base58check é um formato utilizado pelo Bitcoin para representar valores binários. Ele provê uma representação que é menos ambígua para
usuários e cuja validade pode ser verificada por software, além de incluir metadados de forma compacta. Esse formato é similar ao base64, i.e. utiliza caracteres ASCII para representar valores binários. Entretanto, ele elimina caracteres que possam ser confundidos, como zero e a letra 'O' ou um e letra 'l' minúscula. Dessa forma, usuários podem verificar e copiar os dados representados, quando necessário, de uma forma mais simples. Para verificar a validade do conteúdo, um prefixo é incluso com um checksum, calculado com base em funções hash. Além disso, o formato inclui um byte de versão que permite identificar o conteúdo representado (ANTONOPOULOS, 2015).
Outra forma de representar chaves, endereços, ou outros dados binários, é através do uso de mnemônicos. Eles permitem converter uma quantidade de bytes em um conjunto de palavras ou frases. 4 little words17,
por exemplo, é uma proposta para representar endereços IPv4 utilizando quatro palavras da língua inglesa, de modo a facilitar a memorização deles. Para isso, cada valor possível de um byte, i.e. 256 valores, é mapeado a uma palavra diferente. Dessa forma, um endereço como “210.55.180.158”, por exemplo, poderia ser representado como “ROOM RED LULU IDEA”. Uma proposta similar foi feita para utilizar com endereços '.onion' do Tor18. Como esses endereços tem um comprimento maior (80 bits), a proposta sugere, o uso de frases. Para isso, seriam utilizados “templates” com uma estrutura fixa de tipos de palavras, e.g. “<substantivo> e <substantivo> <verbo> <adjetivo> <objeto>”, o que permitiria gerar sentenças mais legíveis.
Uma possibilidade para auxiliar usuários a reconhecerem chaves criptográficos ou outros identificadores binários é o uso de técnicas para visualização de hashs (PERRIG e SONG, 1999), como os Identicons19. Essas técnicas permitem criar representações gráficas de um valor binário. Elas podem ser utilizadas para verificar chaves criptográficas e com isso ajudar a prevenir ataques como maninthemiddle e phising.
Outras técnicas podem ser usadas para facilitar a transmissão de chaves criptográficas ou outros identificadores, e.g. QR Code ou tags NFC. 17 blog.rabidgremlin.com/2010/11/28/4-little-words
18 gitweb.torproject.org/torspec.git/tree/proposals/194-mnemonic-urls.txt 19 en.wikipedia.org/wiki/Identicon