🧩 Exercícios: Hashing de Senhas com Passlib e Bcrypt
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:
- 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)
- Salve o arquivo como:
Atividade_09_1_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_09_2_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_09_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_09_4_SeuNome - 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"))