Fazemos autenticação na web através de blockchain


Recentemente participei do hackathon Ethereum e hoje quero falar sobre o projeto EtherAuth, com o qual a equipe MixBytes ficou em terceiro lugar. O EtherAuth é uma tentativa de criar uma versão descentralizada de um logon no site usando uma conta externa. Como botão, efetue login via Facebook, apenas sem o Facebook.


Problema e soluções


Se você deseja criar uma área fechada para os usuários em seu site, é necessário escolher: desenvolver seu próprio sistema para identificar, autenticar e autorizar usuários ou usar uma solução pronta. Uma solução pronta para uso significa que seu usuário já possui uma conta em algum sistema (Facebook, Google, Yahoo, Outlook ou mesmo apenas email). E você usa o mecanismo apropriado (geralmente o protocolo OAuth 2.0) para garantir que alguém tentando fazer login no seu site usando um ID de usuário externo seja esse usuário.


A última opção é mais fácil de implementar, mas há um risco para o usuário: se algo acontecer com sua conta principal (por exemplo, o Facebook bloqueará a conta sem fornecer motivos), ele também perderá o acesso às informações no site.
Além disso, se, como usuário, desejo efetuar login em um site no qual ainda não confio, sou confrontado com a necessidade de fornecer a este site acesso às minhas informações pessoais, como email ou idade. Se o site suportar apenas o login com uma conta externa, devo literalmente fazer uma escolha: recusar o uso do site ou sacrificar meu anonimato.


A maioria dos usuários acaba sacrificando o anonimato com as palavras "então o que pode acontecer de terrível, não tenho nada a esconder". Infelizmente, a maioria dos ataques direcionados a um usuário despreparado e com perda de dinheiro começa com palavras semelhantes. "O que pode acontecer de terrível se eu enviar um código do SMS para um funcionário do banco?" "Que coisa terrível pode acontecer se eu enviar a um funcionário do suporte técnico os cabeçalhos da solicitação?" A resposta a esta pergunta é mais frequentemente encontrada quando nada pode ser feito.


Como o Ethereum pode ajudar aqui? Já percebemos que existem três problemas principais:


  1. O usuário não é obrigado a confiar no site que visita e deseja evitar o vazamento de informações pessoais.
  2. O site deseja usar um sistema de autenticação externo para evitar o armazenamento de dados do usuário e os custos de segurança associados.
  3. Os sistemas externos existentes que fornecem aos sites a capacidade de autenticar usuários correm o risco de censura. Qualquer conta pode ser bloqueada a qualquer momento, sem explicação e, às vezes, sem a possibilidade de recuperação.

Podemos usar a rede Ethereum em vez de um sistema externo e armazenar apenas os dados necessários nele. Devemos tomar cuidado para não armazenar informações secretas em domínio público, mas, como qualquer carteira na rede Ethereum é realmente um par de chaves criptograficamente fortes, nas quais a chave pública determina o endereço da carteira e a chave privada nunca é transmitida pela rede e é conhecida apenas pelo proprietário, nós podemos usar criptografia assimétrica para autenticar usuários.


No caso mais simples, você pode usar o endereço da carteira Ethereum como um ID do usuário. Mas aqui surge um problema: no caso de um vazamento de chave, o usuário perde o acesso ao sistema para sempre. Mais precisamente, a partir do momento em que a chave secreta do usuário ficou conhecida pelo invasor ou simplesmente caiu acidentalmente no acesso público, não podemos usar essa chave para autenticação.


Implementação


Em nossa solução, escrevi um contrato inteligente simples do EtherAuth para armazenar IDs de usuários e endereços de carteira associados. O ID do usuário é apenas uma sequência UTF-8 entre 2 e 32 bytes de tamanho. Ele foi inventado uma vez pelo próprio usuário e posteriormente usado para efetuar login em qualquer site que ofereça suporte ao EtherAuth. Hoje eu adicionaria uma restrição aos possíveis caracteres incluídos na string, deixando a possibilidade de usar caracteres latinos e algarismos arábicos (subconjuntos da codificação ASCII de 7 bits) para limitar a capacidade de criar logons externamente semelhantes.


Ao criar uma conta no EtherAuth, um par de chaves é definido: uma chave de autorização (authAddr) e uma chave para restaurar o acesso (recoveryKey). O nome recoveryKey não é totalmente bem-sucedido, porque esse endereço é usado para gerenciar a conta, e não apenas para recuperação. Ao criar, os dois endereços são iguais ao endereço da carteira em nome do qual a transação foi enviada. Mas um usuário que se preocupa com sua segurança deve criar uma chave de controle separada e armazená-la em um local inacessível pela rede. Eu o manteria no papel em um cofre na forma de 12 palavras mnemônicas, permitindo, se necessário, recriar algumas chaves.


Também é aconselhável usar um endereço de carteira separado para autenticação, separando-o do endereço de carteira em que todo o seu Éter está armazenado. O relacionamento de authKey com o endereço da carteira que criou a conta ainda pode ser rastreado analisando a sequência de transações do contrato inteligente. Agora você não pode definir um authKey e recoveryKey separados ao criar uma conta. No entanto, se você refinar o contrato inteligente nessa direção, o endereço que criou a conta não será necessariamente associado ao proprietário da conta, o que permitirá que todos protejam seu anonimato.


Para interação do usuário com o contrato inteligente, criamos uma página da web separada. Você pode criar uma conta, alterar suas chaves ou excluí-lo. Para funcionar, o usuário precisará instalar o plug-in do navegador MetaMask. Se você já está usando ativamente a rede Ethereum, provavelmente já instalou esse plug-in, ou seja, a maioria dos usuários que desejam entrar no site pelo Ethereum não encontrará um obstáculo adicional no caminho.


O processo geral de autenticação de usuário usando EtherAuth é semelhante a este:


  • O site (back-end) se transforma em um contrato inteligente e recebe o endereço Ethereum do usuário;
  • O site (back-end) gera e lembra algumas mensagens e solicita ao usuário que assine essa mensagem usando o endereço authKey;
  • O usuário, estando no site (front-end), assina a mensagem usando o plug-in MetaMask e a envia para o back-end;
  • O site (back-end) verifica a assinatura e, se tudo estiver em ordem, ele ativa a sessão do usuário de acordo com a lógica escolhida.

Em nossa solução para o hackathon, por simplicidade, combinamos as partes de back-end e front-end, obtemos um grande front-end. Na vida real, é importante que a verificação da autenticação ocorra em um ambiente não controlado pelo usuário, ou seja, não no navegador, mas no servidor.


Dos problemas que encontramos, podemos observar a verificação da assinatura na parte frontal. Não havia suporte para curvas elípticas no navegador, então eu tive que adicionar uma função ao contrato inteligente que retornasse o resultado da tela de captura de tela da mensagem e aprender como passar parâmetros para ele corretamente (obtenha-os de uma mensagem assinada pelo MetaMask).


Como resultado, em dois dias recebemos uma prova de conceito de autenticação descentralizada usando a rede Ethereum e o plug-in MetaMask. Entendemos como refinar esse sistema para adicionar anonimato ao usuário. O usuário pode restaurar o acesso no caso de vazamento da chave primária (mas não no caso de vazamento da chave de recuperação). Um sistema descentralizado não está sujeito à censura de grandes estruturas, como Google ou Facebook. Se a censura for necessária, o site deve executá-lo por conta própria, mas só pode fazer isso em seu próprio sistema, sem afetar o acesso do usuário a outros sistemas. A rede Ethereum não realiza transações muito rapidamente (ao criar uma conta, o usuário pode ter que esperar alguns minutos), mas é possível obter dados e verificar a autenticação do usuário muito rapidamente. Essa solução é bem dimensionada, pois há muitos nós com dados e qualquer pessoa pode adicionar mais um a qualquer momento. A complexidade da implementação dessa solução para os proprietários de sites não é maior que a complexidade da implementação do suporte ao OAuth 2.0.


Conclusão


É claro que hoje os usuários da rede Ethereum são insignificantes em comparação com o número de usuários do Facebook. No entanto, a popularidade das tecnologias blockchain está crescendo e acredito que, no futuro próximo, haverá mais e mais usuários, o que significa que será possível usar a autenticação descentralizada em sistemas industriais.


Referências


Source: https://habr.com/ru/post/pt423039/


All Articles