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=Empresapara 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
- Geração de tokens de 6 dígitos compatível com Google Authenticator.
- Validação com tolerância a desvios de relógio de +/- 30 segundos.
- Armazenamento de segredos em Base32 padronizado.