Google Authenticator

Há uma variedade de estratégias para proteger suas credenciais on-line importantes. Ouvimos com frequência sobre gerenciadores e geradores de senhas, mas, para mim, a estratégia mais importante é usar a autenticação de dois fatores (2FA). As senhas podem ser adivinhadas, os números de telefone podem ser falsificados, mas o uso da autenticação de dois fatores exige essencialmente que o usuário esteja de posse de um dispositivo físico com um aplicativo como o Google Authenticator, carregado com uma chave secreta para o aplicativo em questão, o que proporciona uma camada extra de segurança.


Eu não costumava levar a sério a autenticação de dois fatores, até que o alguém roubou meu nome de domínio e tentou lavá-lo em um local seguro para domínios roubados. Embora eu não saiba exatamente como eles fizeram isso, tenho quase certeza de que tiveram acesso ao meu endereço de e-mail, criaram filtros para que eu não visse os e-mails etc. Se eu tivesse usado a autenticação de dois fatores, nem meu e-mail nem as contas da GoDaddy poderiam ter sido acessadas. Ou o senhor pode usar o exemplo de Cody Brown, que teve US$ 8.000 em criptomoedas roubadas em minutos porque o fornecedor usou a validação do número de telefone para permitir que as transações fossem aprovadas. Atualmente, uso a autenticação de dois fatores para todas as minhas contas importantes de e-mail, trabalho e financeiras.


Como uso a 2FA com muita frequência, eu queria ver como o processo é gerenciado por um desenvolvedor para seus usuários. Isso incluiria a geração da chave secreta, a criação da representação do código QR, a digitalização do código no Google Authenticator (feita pelo usuário) e a validação do código fornecido pelo GA com a chave do usuário. Encontrei uma biblioteca Node.js fácil de usar, speakeasypara fazer isso!


Etapa 1 da configuração: gerar uma chave secreta


Supondo que o senhor tenha instalado o speakeasy via npm install speakeasy, a configuração da autenticação de dois fatores é iniciada com a geração de uma chave secreta exclusiva para o usuário:



var speakeasy = require('speakeasy');

var secret = speakeasy.generateSecret({length: 20});
console.log(secret.base32); // Save this value to your DB for the user

// Example:  JFBVG4R7ORKHEZCFHZFW26L5F55SSP2Y


Essa chave secreta deve ser armazenada com o registro do usuário em seu banco de dados, pois será usada como referência para validar os códigos 2FA no futuro.


Etapa 2 da configuração: gerar uma imagem QR


Aplicativos como o Google Authenticator permitem que os usuários digitalizem um código QR ou digitem a chave de texto. A leitura de uma imagem é muito mais rápida, portanto, oferecer o código QR será muito conveniente para o usuário:



var QRCode = require('qrcode');

QRCode.toDataURL(secret.otpauth_url, function(err, image_data) {
  console.log(image_data); // A data URI for the QR code image
});


QRCode.toDataURL fornece uma URI de dados de imagem que o senhor pode usar para o img src . Se o senhor não estiver familiarizado com um código QR, ele terá a seguinte aparência:


Código QR


Etapa 1 do usuário: escanear o código QR / adicionar site ao autenticador


Nesse momento, o usuário deve ter aberto o Google Authenticator (ou Authy, etc.) e escaneado o código QR; uma entrada para o seu aplicativo Web será adicionada ao aplicativo do dispositivo. Desse ponto em diante, sempre que o usuário quiser fazer login (ou realizar qualquer ação que o senhor queira proteger), seu sistema deverá reconhecer que o usuário deseja usar a 2FA e o senhor deverá exigir que ele insira o token do aplicativo.


Google Authenticator



Para fins de depuração, o senhor pode obter o que deve ser o valor do código do usuário em um determinado momento por meio de:



// Load the secret.base32 from their user record in database
var secret = ...

var token = speakeasy.totp({
  secret: secret,
  encoding: 'base32'
});


Etapa 2 do usuário: fornecimento do token / validação do token


Quando seu aplicativo Web solicita ao usuário o token 2FA atual e o usuário fornece um token de 6 dígitos, o aplicativo Web deve validar esse token:



// This is provided the by the user via form POST
var userToken = params.get('token');

// Load the secret.base32 from their user record in database
var secret = ...

// Verify that the user token matches what it should at this moment
var verified = speakeasy.totp.verify({
  secret: secret,
  encoding: 'base32',
  token: userToken
});



Se o token corresponder, o usuário pode ser confiável; se o token não corresponder, o aplicativo Web deve solicitar que o usuário tente novamente. Lembre-se de que o Authenticator fornece um novo token a cada {x} segundos, portanto, um token incorreto não deve levantar imediatamente uma bandeira vermelha; o token pode simplesmente ter expirado no momento em que o usuário enviou o formulário.


Demonstração ao vivo


Os desenvolvedores do speakeasy criaram um demonstração ao vivo do speakeasy 2FA para que o senhor possa brincar e entender as etapas envolvidas, tanto do ponto de vista do usuário quanto do desenvolvedor.


Esta postagem pretende ser apenas uma visão geral breve e de alto nível da implementação da autenticação de dois fatores – leia o documentação do speakeasy para obter uma explicação mais detalhada, além de conhecer opções mais específicas de 2FA. Em um mundo ideal, a autenticação de dois fatores seria ativada por padrão para a maioria dos logins; no entanto, ela pode ser confusa para a maioria dos usuários da Web (pense no usuário não técnico), portanto, posso entender por que a 2FA é considerada uma medida de segurança extra por enquanto. Um grande agradecimento aos desenvolvedores do speakeasy pela biblioteca Node.js fácil de usar, pela documentação incrível e pela demonstração simples!