TOTP (algoritmo de senha única com base em tempo)

Com o número crescente de ameaças à segurança cibernética, torna-se cada vez mais importante para os desenvolvedores atualizarem seus padrões de segurança de aplicativos da web, garantindo a segurança das contas dos usuários. Para esse fim, muitos aplicativos online agora estão pedindo aos usuários que adicionem uma camada extra de segurança a suas contas. Eles fazem isso habilitando a autenticação de dois fatores. Existem vários métodos para implementar a autenticação de dois fatores, e a autenticação TOTP (Time Based One Time Password) é um deles.





Para entender o que é TOTP e como é usado, é necessário primeiro revisar brevemente os conceitos mais básicos. O primeiro deles é a autenticação de dois fatores. A autenticação de dois fatores (ou autenticação multifator) é um método de identificação de um usuário em um serviço (geralmente na Internet) solicitando dois tipos diferentes de dados de autenticação, que fornecem duas camadas, o que significa proteção de conta mais eficaz contra entrada não autorizada. Isso significa que, após habilitar a autenticação de dois fatores, o usuário deve passar por mais uma etapa para um login bem-sucedido. As etapas padrão para fazer login em uma conta são login e senha (Figura 1).





Figura 1. Procedimento para fazer login em uma conta sem autenticação de dois fatores
Figura 1. Procedimento para fazer login em uma conta sem autenticação de dois fatores

Habilitar a autenticação de dois fatores adiciona uma etapa extra ao pedido de login (Figura 2). Esse método é mais seguro porque o invasor não pode obter acesso à conta do usuário se não tiver acesso à senha normal do usuário e à senha descartável.





Figura 2. Login em uma conta com autenticação de dois fatores conectada
Figura 2. Login em uma conta com autenticação de dois fatores conectada

Atualmente, existem dois métodos amplamente utilizados para obter uma senha descartável:





  1. Baseado em SMS . Cada vez que o usuário efetua login, ele recebe uma mensagem de texto para o número do celular especificado na conta, que contém uma senha de uso único.





  2. TOTP. QR- , .





SMS . , . , SMS , . . NIST 2016 . SMS, TOTP - .





, , , , . :





  • , ,





  • ( ), ,





  • , , ,





, , , . , SMS , , . . SMS , TOTP , , .





, TOTP, ( ) . , . . , , , , .





TOTP – , .





:





,

















  1. ,





  2. ,





, . , . TOTP – HOTP.





HOTP « HMAC». (IETF) RFC4226. HOTP .





:





  • HMAC ( SHA-1)





hmacHash = HMAC-SHA-1 ( , )
      
      



  • 20 . . , . HOTP





hmacHash[19] means 19th byte of the string.offset = hmacHash[19] & 0xf;
truncatedHash = (hmacHash[offset++] & 0x7f) << 24 | (hmacHash[offset++] & 0xff) << 16 | (hmacHash[offset++] & 0xff) << 8 | (hmacHashh[offset++] & 0xff);
finalOTP = (truncatedHash % (10 ^ numberOfDigitsRequiredInOTP));
      
      



, 4 hmacHash [19]



. hmacHash [offset]



hmacHash [offset + 3]



31 truncatedHash



. , , .





HOTP. RFA4226 , .





, . ? TOTP. TOTP « ». IETF RFC6238. TOTP HOTP . , «» «», . , HOTP OTP. , , . , , Unix, . Unix , . , , . . , Google Authenticator 30 .





counter = currentUnixTime / 30
      
      



, . : . QR-. , , . , , QR-, . , – QR- . (, Google Authenticator App, Authy ..), . . TOTP -.





When user request to enable 2-factor authentication
// Generate a secret key of length 20.secretKey = generateSecretKey (20);
// Save that secret key in database for this particular user. SaveUserSecretKey (userId, secretKey);
// convert that secret key into qr image.qrCode = convertToQrCode (secretKey);
// send the qr image as responseresponse (qrCode);
      
      



QR-. QR-, . , Unix HOTP, . QR-. , , .





User types the code displayed in the application.
// Fetch secret key from database.secretKey = getSecretKeyOfUser (userId);
if (codeTypedByUser == getHOTP (secretKey, currentUnixTime / 30)) {enableTwoFactorAuthentication (userId);}
      
      



HOTP , OTP Unix. OTP , . , , , . , , . , .





User types the code displayed in the phone application to login
// Fetch secret key from database.secretKey = getSecretKeyOfUser (userId);
if (codeTypedByUser == getHOTP (secretKey, currentUnixTime)) {signIn (userId);}
      
      



, . , , QR- . , Google Authenticator App, . , , . SMS, , .





A autenticação de dois fatores está ganhando popularidade. Muitos aplicativos da web o implementam para aumentar a segurança. Ao contrário do método baseado em SMS, o método TOTP também requer pouco esforço. Portanto, vale a pena implementar esse recurso para qualquer aplicativo.








All Articles