
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:
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.
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!