As mensagens SMS são o método mais popular de autenticação de dois fatores (2FA). É usado por bancos, carteiras eletrônicas e de criptografia, caixas de correio e todos os tipos de serviços;
o número de usuários do método está se aproximando de 100% .
Eu tenho um tal surto de eventos é ultrajante, porque este método é inseguro. Reatribua o número de um cartão SIM para outro iniciado no início da era móvel - é assim que o número é restaurado quando o SIM é perdido. Os “especialistas em desmame de dinheiro digital” perceberam: a opção “substituir cartões SIM” pode ser usada em esquemas fraudulentos. Afinal, quem controla o cartão SIM pode gerenciar serviços bancários on-line, carteiras eletrônicas e até criptomoedas de outras pessoas. E você pode assumir o número de outra pessoa subornando um funcionário de telecomunicações usando fraude ou documentos falsos.

Milhares de episódios de troca de SIM foram descobertos - é assim que esse esquema de fraude foi chamado. A escala do desastre sugere que o mundo em breve abandonará o 2FA via SMS. Mas isso não acontece - o
estudo diz que não são os usuários que escolhem o método 2FA, mas os proprietários do serviço.
Sugerimos o uso do método 2FA seguro com a entrega de códigos únicos via blockchain e informaremos como conectá-lo ao proprietário do serviço.
A conta vai para milhões
Em 2019, a fraude de troca de SIM aumentou 63%, de acordo com a polícia de Londres, e a “verificação média” do atacante foi de 4.000 libras esterlinas. Não encontrei estatísticas na Rússia, mas presumo que seja ainda pior.
A troca de SIM é usada para roubar populares Twitter, Instagram, Facebook, contas VK, contas bancárias e recentemente chegou a criptomoedas,
relata o jornal Times do empresário de bitcoin Joby Weeks. Casos de alto perfil de roubo de criptomoedas com a ajuda da troca de SIM surgiram na imprensa desde 2016; em 2019, chegou um pico real.
Em maio, promotores dos EUA no distrito leste de Michigan
indiciaram nove jovens entre 19 e 26 anos de idade: supostamente eram membros de uma gangue de hackers chamada The Community. A quadrilha é acusada de sete ataques de swap, como resultado dos quais hackers se apropriaram de criptomoedas no valor de mais de US $ 2,4 milhões. E em abril, um estudante da Califórnia, Joel Ortiz, recebeu 10 anos de prisão por troca de SIM; US $ 7,5 milhões em criptomoedas se tornaram sua presa.
Foto de Joel Ortiz em uma conferência de imprensa da universidade. Dois anos depois, ele será detido por fraude cibernética.O princípio da troca de SIM
Swap significa troca. Em todos esses esquemas, os criminosos atribuem o número de telefone da vítima, geralmente através da reemissão de um cartão SIM, e o usam para redefinir uma senha. Uma troca típica de SIM na teoria se parece com isso:
- Inteligência. Os fraudadores descobrem os dados pessoais da vítima: nome e telefone. Eles podem ser encontrados em fontes abertas (redes sociais, amigos) ou obtidas de um cúmplice - um funcionário de uma operadora de celular.
- Bloqueio. O cartão SIM da vítima está desativado; Para fazer isso, basta ligar para o suporte técnico do provedor, informar o número e dizer que o telefone foi perdido.
- Capturar, transferir números para o seu cartão SIM. Normalmente, isso também é feito através de um cúmplice em uma empresa de telecomunicações ou falsificando documentos.
Na vida real, é ainda mais grave. Os invasores selecionam uma vítima e monitoram diariamente a localização do telefone - um pedido de informações que o assinante mudou para roaming custa de 1 a 2 centavos. Assim que o proprietário do cartão SIM for para o exterior, eles concordam com o gerente no salão de comunicação para emitir um novo cartão SIM. Custa cerca de US $ 50 (eu encontrei informações - em diferentes países e de diferentes operadoras, de US $ 20 a US $ 100), enquanto o gerente será demitido na pior das hipóteses - não há responsabilidade por isso.
Agora, todos os invasores receberão todos os SMS e o proprietário do telefone não poderá fazer nada a respeito - ele está no exterior. E então os vilões têm acesso a todas as contas da vítima e, se desejado, alteram as senhas.
Chances de devolver mercadorias roubadas
Às vezes, os bancos vão em direção às vítimas e retiram as transferências de suas contas. Portanto, é possível devolver dinheiro fiduciário, mesmo que o infrator não seja encontrado. Mas com as carteiras de criptomoedas, tudo é mais complicado - tanto
técnica quanto legalmente. Até o momento, nenhuma bolsa / carteira pagou uma compensação para trocar as vítimas.
Se as vítimas querem defender seu dinheiro em juízo, acusam o operador: ele criou as condições para o roubo de dinheiro da conta. Foi exatamente o que
Michael Turpin fez , que perdeu US $ 224 milhões devido à troca e agora está processando a empresa de telecomunicações AT&T.

Até o momento, nenhum estado possui esquemas de trabalho para proteger legalmente os proprietários de criptomoedas. É impossível segurar seu capital ou receber uma compensação por sua perda. Portanto, impedir um ataque de troca é mais fácil do que combater suas consequências. A maneira mais óbvia é usar um "segundo fator" mais confiável para o 2FA.
A troca de SIM não é o único problema 2FA via SMS
Os códigos de confirmação no SMS também não são seguros do ponto de vista técnico. As mensagens podem ser interceptadas devido a vulnerabilidades fatais no Sistema de Sinalização 7 (SS7). O 2FA por SMS é oficialmente reconhecido como inseguro (o Instituto Nacional de Padrões e Tecnologia dos EUA fala sobre isso em seu
Guia de autenticação digital ).
Além disso, a presença do 2FA geralmente inspira o usuário com uma sensação de falsa segurança e ele escolhe uma senha mais simples. Portanto, essa autenticação não complica, mas facilita o acesso de um invasor à conta.
E, muitas vezes, os SMS vêm com um longo atraso ou nem chegam.
Outros métodos 2FA
Obviamente, em smartphones e SMS, a luz não converge. Existem outros métodos 2FA. Por exemplo, códigos TAN únicos: o método é primitivo, mas está funcionando - ainda é usado em alguns bancos. Existem sistemas que usam dados biométricos: impressões digitais, exames de retina. Outra opção que parece um compromisso razoável em termos de conveniência, confiabilidade e preço são aplicativos especiais para o 2FA: RSA Token, Google Authenticator. E existem chaves físicas e outros métodos.
Em teoria, tudo parece lógico e confiável. Mas, na prática, as soluções modernas de 2FA têm problemas e, por causa deles, a realidade é diferente das expectativas.
De acordo com o
estudo , o uso do 2FA é um inconveniente em princípio, e a popularidade do 2FA via SMS é explicada por “menos inconveniente em comparação com outros métodos” - o recebimento de códigos únicos é compreensível para o usuário.
Muitos usuários de métodos 2FA associam-se ao medo de que o acesso seja perdido. Uma chave física ou uma lista de senhas da TAN podem ser perdidas ou roubadas. Pessoalmente, tenho uma experiência negativa usando o Google Authenticator. Meu primeiro smartphone com esse aplicativo quebrou - avalie meus esforços para restaurar o acesso às contas. Outro problema é a transição para um novo dispositivo. O Google Authenticator não pode exportar devido a problemas de segurança (se as chaves puderem ser exportadas, que tipo de segurança existe?). Uma vez transferi as chaves manualmente e depois decidi que era mais fácil deixar o smartphone antigo em uma caixa na prateleira.
O método 2FA deve ser:
- Seguro - somente você deve obter acesso à sua conta, não invasores
- Confiável - você obtém acesso à sua conta sempre que precisar
- Conveniente e acessível - o uso do 2FA é claro e leva um tempo mínimo
- Barato
Acreditamos que o blockchain é a solução certa.
Use 2FA na blockchain
Para um usuário, o 2FA no blockchain parece o mesmo que receber códigos únicos via SMS. A única diferença está no canal de entrega. A maneira de obter um código 2FA depende do que a blockchain oferece. Em nosso projeto (as informações estão no meu perfil), este é um aplicativo da Web, Tor, iOS, Android, Linux, Windows, MacOS.
O serviço gera um código único e o envia para o messenger no blockchain. Além disso, de acordo com os clássicos: o usuário digita o código recebido na interface de serviço e efetua login.

No artigo
Como um mensageiro descentralizado funciona na blockchain, escrevi que a blockchain garante a segurança e a privacidade das mensagens. Sobre o envio de códigos 2FA, destacarei:
- Um clique para criar uma conta - sem telefones ou e-mails.
- Todas as mensagens com códigos 2FA são criptografadas curva de ponta a ponta25519xsalsa20poly1305.
- O ataque MITM é excluído - cada mensagem com um código 2FA é uma transação no blockchain e é assinada pelo Ed25519 EdDSA.
- Uma mensagem com um código 2FA cai em seu bloco. A sequência e o carimbo de data e hora dos blocos não podem ser fixados e, portanto, a ordem das mensagens.
- Não existe uma estrutura central que verifique a "autenticidade" de uma mensagem. Isso é feito por um sistema de nós distribuídos com base em consenso e pertence aos usuários.
- Incapacidade de desativar - as contas não podem ser bloqueadas e as mensagens podem ser excluídas.
- Acesse códigos 2FA de qualquer dispositivo a qualquer momento.
- Mensagem de confirmação de entrega com código 2FA. Um serviço que envia uma senha de uso único sabe com certeza que foi entregue. Não há botões "Enviar novamente".
Para comparação com alguns outros métodos 2FA, compilei uma tabela:

O usuário recebe uma conta no messenger blockchain para receber códigos em uma segunda senha - apenas é usada para inserir. Portanto, os métodos de aplicação podem ser diferentes: você pode usar uma conta para obter códigos para todos os serviços ou criar uma conta separada para cada serviço.
Há também uma desvantagem - uma conta deve ter pelo menos uma transação. Para que o usuário receba uma mensagem criptografada com um código, você precisa conhecer sua chave pública, e ele aparece no blockchain apenas com a primeira transação. Nós saímos dessa maneira: eles nos deram a oportunidade de receber tokens gratuitos em nossa carteira. No entanto, uma solução mais correta é nomear a conta como uma chave pública. (Para comparação, nosso número de conta
U1467838112172792705 é um derivado da chave pública
cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada . Para o mensageiro, isso é mais conveniente e legível, mas para os códigos 2FA do sistema de envio). Acho que no futuro alguém tomará essa decisão e transferirá "Conveniência e acessibilidade" para a zona verde.
O custo do envio de um código 2FA é realmente baixo - 0,001 ADM, agora é 0,00001 USD. Mais uma vez, você pode aumentar sua blockchain e fazer o preço zero.
Como conectar o 2FA no blockchain ao seu serviço
Espero ter conseguido interessar alguns leitores para adicionar autorização de blockchain aos seus serviços.
Vou lhe dizer como fazer isso usando o exemplo do nosso messenger e, por analogia, você pode usar outra blockchain. No aplicativo de demonstração 2FA, usamos o postgresql10 para armazenar informações da conta.
Etapas de conexão:
- Crie uma conta no blockchain a partir da qual você enviará códigos 2FA. Você receberá uma senha, usada como chave privada para criptografar mensagens com códigos e para assinar transações.
- Adicione um script ao seu servidor para gerar códigos 2FA. Se você já usa outro método 2FA com entrega de senha única, esta etapa já foi concluída.
- Adicione um script ao seu servidor para enviar códigos para o usuário no messenger blockchain.
- Crie uma interface de usuário para enviar e inserir o código 2FA. Se você já usa outro método 2FA com entrega de senha única, esta etapa já foi concluída.
1 Crie uma contaCriar uma conta na blockchain é a geração de uma chave privada, uma chave pública e um endereço de conta derivado dela.

Primeiro, é gerada a senha BIP39, a partir da qual o hash SHA-256 é considerado. O hash é usado para gerar a chave privada ks e a chave pública kp. Da chave pública com o mesmo SHA-256 com inversão, obtemos o endereço no blockchain.
Se você deseja enviar códigos 2FA sempre de uma nova conta, o código para criar uma conta precisará ser adicionado ao servidor:
import Mnemonic from 'bitcore-mnemonic' this.passphrase = new Mnemonic(Mnemonic.Words.ENGLISH).toString() … import * as bip39 from 'bip39' import crypto from 'crypto' adamant.createPassphraseHash = function (passphrase) { const seedHex = bip39.mnemonicToSeedSync(passphrase).toString('hex') return crypto.createHash('sha256').update(seedHex, 'hex').digest() } … import sodium from 'sodium-browserify-tweetnacl' adamant.makeKeypair = function (hash) { var keypair = sodium.crypto_sign_seed_keypair(hash) return { publicKey: keypair.publicKey, privateKey: keypair.secretKey } } … import crypto from 'crypto' adamant.getAddressFromPublicKey = function (publicKey) { const publicKeyHash = crypto.createHash('sha256').update(publicKey, 'hex').digest() const temp = Buffer.alloc(8) for (var i = 0; i < 8; i++) { temp[i] = publicKeyHash[7 - i] } return 'U' + bignum.fromBuffer(temp).toString() }
No aplicativo de demonstração, nós o simplificamos - criamos uma conta no aplicativo da Web e enviamos os códigos a partir dele. Na maioria dos casos, isso é mais conveniente para o usuário: ele sabe que o serviço envia códigos 2FA de uma conta específica e pode nomeá-lo.
2 Geração de códigos 2FAO código 2FA precisa ser gerado para cada login do usuário. Usamos a biblioteca
speakeasy , mas você pode escolher qualquer outra.
const hotp = speakeasy.hotp({ counter, secret: account.seSecretAscii, });
Validação do código 2FA do usuário inserido pelo usuário:
se2faVerified = speakeasy.hotp.verify({ counter: this.seCounter, secret: this.seSecretAscii, token: hotp, });
3 Enviar código 2FAVocê pode usar a API do nó blockchain, a biblioteca JS API ou o console para enviar o código 2FA. Neste exemplo, usamos o console - esta é a Command Line Interface, um utilitário que simplifica a interação com o blockchain. Para enviar uma mensagem com um código 2FA, você precisa usar o comando
send message
do console.
const util = require('util'); const exec = util.promisify(require('child_process').exec); … const command = `adm send message ${adamantAddress} "2FA code: ${hotp}"`; let { error, stdout, stderr } = await exec(command);
Uma maneira alternativa de enviar mensagens é usar o método
send
na biblioteca da API JS.
4 interface de usuárioO usuário precisa ter a oportunidade de inserir o código 2FA, isso pode ser feito de várias maneiras, dependendo da plataforma do seu aplicativo. No nosso exemplo, este é o Vue.

O código fonte do aplicativo demo de autorização de dois fatores no blockchain pode ser visualizado no
GitHub . Há um link na demonstração ao vivo no Leia-me para experimentá-lo.