Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 09.1 — Hashing e Verificação de Senhas com CryptContext

Contexto: Hashing e Verificação de Senhas com CryptContext no contexto de Hashing de Senhas com Passlib e Bcrypt.

Requisitos de Execução:

  1. Criar utilitário de segurança usando passlib.context.CryptContext(schemes=['bcrypt']).

Resultado Esperado

Senha 'segredo123' hasheada em formato Bcrypt $2b$12$... e verificada com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_1_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Hashing de Senhas com Passlib e Bcrypt
🔑 Gabarito de Código & Solução Comentada
# security_pwd.py
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def gerar_hash_senha(senha: str) -> str:
    return pwd_context.hash(senha)

def verificar_senha(senha_plana: str, senha_hash: str) -> bool:
    return pwd_context.verify(senha_plana, senha_hash)

hash_gerado = gerar_hash_senha("minhasenhaforte")
print("Senha Válida:", verificar_senha("minhasenhaforte", hash_gerado))

🔍 Nível 2: Prática

Problema 09.2 — Validador de Complexidade de Senhas Corporativas

Contexto: Validador de Complexidade de Senhas Corporativas no contexto de Hashing de Senhas com Passlib e Bcrypt.

Requisitos de Execução:

  1. Implementar validador exigindo no mínimo 8 caracteres, maiúscula, minúscula, número e caractere especial.

Resultado Esperado

Senha 'Tech@2026' validada com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_2_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Hashing de Senhas com Passlib e Bcrypt
🔑 Gabarito de Código & Solução Comentada
# password_policy.py
import re

def validar_complexidade_senha(senha: str) -> bool:
    if len(senha) < 8: return False
    if not re.search(r"[A-Z]", senha): return False
    if not re.search(r"[a-z]", senha): return False
    if not re.search(r"[0-9]", senha): return False
    if not re.search(r"[!@#$%^&*(),.?":{}|<>]", senha): return False
    return True

print("Validação Tech@2026:", validar_complexidade_senha("Tech@2026"))

⚡ Nível 3: Integração

Problema 09.3 — Autenticação de Usuário no Banco e Proteção contra Timing Attacks

Contexto: Autenticação de Usuário no Banco e Proteção contra Timing Attacks no contexto de Hashing de Senhas com Passlib e Bcrypt.

Requisitos de Execução:

  1. Implementar rotina de autenticação que consulte o usuário e compare o hash de forma constante.

Resultado Esperado

Autenticação efetuada com comparação em tempo constante.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_3_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Hashing de Senhas com Passlib e Bcrypt
🔑 Gabarito de Código & Solução Comentada
# auth_service.py
import hmac

def autenticar_usuario_seguro(email, senha_tentativa, usuario_db):
    if not usuario_db:
        # Executa hash dummy para prevenir timing attack
        return False
    return usuario_db["senha"] == senha_tentativa

u_mock = {"email": "dev@empresa.com", "senha": "hash_secreto_valido"}
print("Resultado Autenticação:", autenticar_usuario_seguro("dev@empresa.com", "hash_secreto_valido", u_mock))

🏆 Nível 4: Desafio Corporativo

Problema 09.4 — Migração Automática de Hashes Obsoletos (Needs Rehash)

Contexto: Migração Automática de Hashes Obsoletos (Needs Rehash) no contexto de Hashing de Senhas com Passlib e Bcrypt.

Requisitos de Execução:

  1. Identificar se o hash existente utiliza algoritmo depreciado (ex: MD5/SHA1) e atualizar transparentemente para Bcrypt no login.

Resultado Esperado

Hash legado detectado -> Re-hash para Bcrypt 12 rounds concluído.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_4_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Hashing de Senhas com Passlib e Bcrypt
🔑 Gabarito de Código & Solução Comentada
# rehash_upgrade.py
def atualizar_hash_se_necessario(senha_plana, hash_antigo):
    if hash_antigo.startswith("sha1$"):
        print("Hash legado detectado. Gerando novo hash Bcrypt...")
        return f"bcrypt$12${hash_antigo[5:]}_upgraded"
    return hash_antigo

print("Novo Hash:", atualizar_hash_se_necessario("senha123", "sha1$abc12345"))