Pular para conteúdo

Projeto 08: Autenticação Multifator (MFA) e TOTP RFC 6238 📱

Escopo do Projeto

Objetivo: Desenvolver um subsistema completo de Autenticação Multifator (MFA) implementando o algoritmo Time-Based One-Time Password (TOTP - RFC 6238) em Python, integrando com geradores QR Code para aplicativos como Google Authenticator.


🎯 1. Contexto & Desafio Prático

Senhas estáticas são insuficientes para conter credenciais vazadas em ataques de phishing e credential stuffing. Você construirá um módulo de segurança MFA que gera segredos Base32 compartilhados, emite URLs otpauth:// legíveis por apps de autenticação e valida tokens dinâmicos de 6 dígitos com janela de tolerância de tempo.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Algoritmo TOTP RFC 6238): Implementar a computação matemática do token: extração do contador de tempo (30s) e hash HMAC-SHA1 com truncamento dinâmico.
  • R2 (Geração de QR Code de Pareamento): Gerar URI padronizada otpauth://totp/Empresa:usuario@empresa.com?secret=...&issuer=Empresa para leitura por smartphone.
  • R3 (Janela de Deriva de Relógio / Drift): Aceitar tokens da janela de tempo corrente (\(T_0\)) e adjacentes (\(T_{-1}\) e \(T_{+1}\)) para acomodar pequenas diferenças de relógio no celular.
  • R4 (Prevenção de Ataques de Replay): Impedir que um mesmo token de 6 dígitos seja reutilizado duas vezes dentro da mesma janela de 30 segundos.

📐 3. Diagrama Conceitual & Arquitetura

sequenceDiagram
    autonumber
    participant Server as Servidor de Autenticação
    participant App as App Authenticator (Celular)
    participant User as Usuário
    Server->>User: Exibe QR Code com Segredo Base32 (otpauth://)
    User->>App: Escaneia QR Code
    Note over App,Server: Relógios Sincronizados em Janelas de 30 Segundos
    App->>User: Exibe Token Rotativo de 6 Dígitos (ex: 492105)
    User->>Server: Submete Senha + Token 492105
    Server->>Server: Calcula HMAC-SHA1 local e valida janela [-1, 0, +1]
    Server-->>User: Autenticação Aprovada com MFA!

💻 4. Especificação Técnica & Código de Referência

// totp_mfa_engine.py
import hmac
import hashlib
import time
import struct
import base64

def generate_totp_token(secret_base32: str, interval: int = 30) -> str:
    """Implementação pura do algoritmo TOTP (RFC 6238 / RFC 4226)."""
    key = base64.b32decode(secret_base32, casefold=True)
    # Contador de passos de tempo em 8 bytes (Big-Endian)
    counter = int(time.time() // interval)
    counter_bytes = struct.pack(">Q", counter)

    # HMAC-SHA1
    mac = hmac.new(key, counter_bytes, hashlib.sha1).digest()

    # Truncamento Dinâmico (Dynamic Truncation)
    offset = mac[-1] & 0x0F
    binary = struct.unpack(">I", mac[offset:offset + 4])[0] & 0x7FFFFFFF

    token = binary % 1_000_000
    return f"{token:06d}"

if __name__ == '__main__':
    secret = "JBSWY3DPEHPK3PXP" # Segredo Base32 de teste
    token_atual = generate_totp_token(secret)
    print(f"Token TOTP de 6 dígitos gerado: {token_atual} (Válido por 30s)")

📦 5. Critérios de Avaliação e Entrega

  1. Geração de tokens de 6 dígitos compatível com Google Authenticator.
  2. Validação com tolerância a desvios de relógio de +/- 30 segundos.
  3. Armazenamento de segredos em Base32 padronizado.