📊 Capítulo 09: Hashing de Senhas & Criptografia
Especialização Backend com Python & FastAPI
🗺️ O Fluxo de Hashing com Salt e Derivação de Chaves
flowchart LR
SENHA["Senha em Texto Claro ('SenhaForte123!')"]
--> SALT["Salt Criptográfico Aleatório (16 bytes)"]
--> KDF["Função KDF Lenta (Argon2id / BCrypt com 12 Rounds)"]
--> HASH_FINAL["$argon2id$v=19$m=65536,t=3,p=4$... (Hash Imutável)"]
--> DB["Persistência Segura no Banco de Dados"]
style SENHA fill:#ffebee,stroke:#d32f2f,stroke-width:2px
style SALT fill:#fff3e0,stroke:#ff9800,stroke-width:1.5px
style KDF fill:#ede7f6,stroke:#512da8,stroke-width:2px
style HASH_FINAL fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style DB fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
🎯 Slide 1: Por Que o Hashing Lento é Obrigatório?
-
Hashes Rápidos (MD5, SHA-1, SHA-256): Uma GPU moderna testa bilhões de hashes por segundo, quebrando senhas em minutos via força bruta.
- Hashes Modernos Lentos (Argon2id, BCrypt):
- Memory-Hardness: O Argon2id consome dezenas de megabytes de RAM propositalmente, inviabilizando ataques paralelos em GPUs e ASICs.
- Work Factor: Permite aumentar o custo computacional conforme os processadores evoluem.
🎯 Slide 2: Implementando com passlib / pwd_context
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["argon2", "bcrypt"], deprecated="auto")
def gerar_hash_senha(senha: str) -> str:
return pwd_context.hash(senha)
def verificar_senha(senha_pura: str, senha_hash: str) -> bool:
return pwd_context.verify(senha_pura, senha_hash)
🎯 Slide 3: Proteção Contra Timing Attacks
- Tempo Constante de Comparação: A função
verifycompara bytes em tempo constante para evitar que invasores meçam milissegundos de resposta para deduzir caracteres corretos!
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim