Pular para conteúdo

Aula 16 – Projeto Final: Sistema de Autenticação Seguro 🎓

Parabéns por chegar até aqui! Nesta aula final, você vai consolidar tudo o que aprendeu construindo um sistema de autenticação completo, aplicando as boas práticas de cada aula anterior.


🎯 O Cenário

Você foi contratado para implementar o backend de autenticação de uma nova aplicação. O sistema precisa ser resistente às vulnerabilidades mais comuns e seguir os princípios de segurança estudados no curso.


🛠️ Requisitos do Projeto

Seu sistema (em Python ou JavaScript, à sua escolha) deve implementar:

  1. Cadastro de usuário (Aula 13): senha armazenada com hash + salt via bcrypt (nunca em texto puro).
  2. Login com verificação segura (Aula 13): comparação da senha usando a função apropriada da biblioteca de hash (nunca == direto).
  3. Autenticação multifator opcional (Aula 08): geração e verificação de código TOTP.
  4. Controle de acesso por papéis (Aula 08): pelo menos 2 papéis (admin, usuario) com permissões diferentes.
  5. Proteção contra força bruta (Aula 15): bloqueio temporário após N tentativas de login falhas.
  6. Logging seguro (Aula 15): registrar tentativas de login (sucesso/falha, IP, timestamp) sem nunca logar a senha.
  7. Prevenção de SQL Injection (Aula 12): se usar banco de dados, todas as consultas devem ser parametrizadas.

📊 Arquitetura Proposta

graph TD
    A["Cliente"] -- "HTTPS - Aula 09" --> B["API de Autenticação"]
    B --> C["Cadastro: bcrypt hash+salt - Aula 13"]
    B --> D["Login: verifica hash + rate limiting - Aula 13/15"]
    D --> E{"MFA habilitado?"}
    E -- Sim --> F["Verifica codigo TOTP - Aula 08"]
    E -- Nao --> G["Gera sessao/token"]
    F --> G
    G --> H["Controle de acesso por papel - Aula 08"]
    D -.-> I["Log de tentativas (sem senha!) - Aula 15"]

💻 Ponto de Partida Sugerido (Python)

import bcrypt
import time
from datetime import datetime

usuarios = {}  # em produção, seria um banco de dados real
tentativas_falhas = {}  # controle de rate limiting

def cadastrar(usuario, senha, papel="usuario"):
    hash_senha = bcrypt.hashpw(senha.encode(), bcrypt.gensalt())
    usuarios[usuario] = {"hash": hash_senha, "papel": papel}
    print(f"[LOG] Usuário '{usuario}' cadastrado às {datetime.now()}")

def login(usuario, senha_digitada):
    if tentativas_falhas.get(usuario, 0) >= 5:
        print(f"[LOG] Login BLOQUEADO para '{usuario}' - excesso de tentativas")
        return False

    dados = usuarios.get(usuario)
    if dados and bcrypt.checkpw(senha_digitada.encode(), dados["hash"]):
        tentativas_falhas[usuario] = 0
        print(f"[LOG] Login OK para '{usuario}' às {datetime.now()}")
        return True

    tentativas_falhas[usuario] = tentativas_falhas.get(usuario, 0) + 1
    print(f"[LOG] Login FALHOU para '{usuario}' às {datetime.now()} (tentativa {tentativas_falhas[usuario]})")
    return False

Ponto de partida, não a solução completa

Este código cobre cadastro, login e rate limiting básico. Sua missão é completar os requisitos restantes: MFA, controle de acesso por papel e consultas parametrizadas (se usar banco de dados de verdade).


✅ Checklist de Entrega

  • Senhas nunca armazenadas em texto puro
  • Rate limiting funcionando (teste com 6+ tentativas erradas seguidas)
  • Pelo menos 2 papéis com permissões diferentes implementadas
  • Logs registram tentativas de login, mas nunca a senha digitada
  • MFA (TOTP) implementado, mesmo que opcional para o usuário
  • Testado com pelo menos 3 cenários: cadastro, login correto, login incorreto

🎨 Conclusão do Curso

Você percorreu uma jornada completa em Segurança e Criptografia — dos fundamentos da tríade CID até a construção de um sistema de autenticação real. Agora você sabe:

  • Os fundamentos: confidencialidade, integridade, disponibilidade e como ameaças reais exploram suas falhas.
  • A criptografia por trás de tudo: simétrica, assimétrica, hash, assinaturas digitais e certificados.
  • Como aplicar na prática: em Python, JavaScript, e nas conexões TLS que protegem a Internet inteira.
  • Como pensar como defensor: OWASP Top 10, gestão de senhas, LGPD, pentest e auditoria.

Segurança não é um destino, é um processo contínuo — continue praticando, mantenha-se atualizado sobre novas vulnerabilidades, e leve esses princípios para todo sistema que você construir daqui em diante! 🛡️