hashlib, secrets & uuid
hashlib fornece hashes criptográficos e rápidos (SHA-256). secrets gera tokens imprevisíveis. uuid cria identificadores únicos padrão - escolha a ferramenta certa para checksums vs tokens de sessão vs chaves primárias.
Receita
import hashlib
import secrets
digest = hashlib.sha256(b"payload").hexdigest()
token = secrets.token_urlsafe(32)Quando usar isso:
- Checksums de integridade de arquivo -> hashlib
- Tokens de sessão/API -> secrets
- Chaves primárias de banco de dados -> uuid4
- Armazenamento de senhas -> nunca hashlib puro sozinho; use argon2/bcrypt PyPI
- Autenticação de mensagem HMAC -> módulo hmac com chave secreta
Exemplo de Trabalho
import hashlib
import secrets
import uuid
def sha256_hex(data: bytes) -> str:
return hashlib.sha256(data).hexdigest()
def new_session_token() -> str:
return secrets.token_hex(16)
def new_record_id() -> str:
return str(uuid.uuid4())
payload = b"important"
print("sha256", sha256_hex(payload))
print("session", new_session_token())
print("uuid", new_record_id())
# compara digests em tempo constante
a = sha256_hex(b"x")
b = sha256_hex(b"x")
print(secrets.compare_digest(a, b))O que isso demonstra:
- sha256 para impressão digital de conteúdo (não senhas)
- módulo secrets para tokens CSPRNG
- IDs aleatórios uuid4 para sistemas distribuídos
compare_digestevita vazamentos de tempo em comparações
Mergulho Profundo
Guia de Escolha
| Necessidade | Módulo |
|---|---|
| Token de URL aleatório | secrets.token_urlsafe |
| Hash de conteúdo estável | hashlib.sha256 |
| Coluna uuid de DB | uuid.uuid4 |
| Hash de senha | argon2-cffi / bcrypt |
Versões uuid
- uuid4 aleatório - IDs padrão
- uuid7 (3.14+ ordenado por tempo) - amigável para índice onde suportado
Armadilhas
- sha256 para senhas - muito rápido, sem salt. Correção: hashers de senha dedicados.
- módulo random para tokens - previsível. Correção: apenas secrets.
- Vazamento de MAC uuid1 - preocupação com privacidade. Correção: uuid4 para IDs públicos.
- Hex digest case - compare consistentemente; use compare_digest.
- Hashing de arquivos grandes - carga de memória. Correção:
hashlib.file_digestincremental (3.11+) ou loop de atualização.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| argon2 | Armazenamento de senha | Checksum de arquivo |
| ULID PyPI | IDs ordenáveis pré-uuid7 | Apenas stdlib |
| HMAC | Tokens assinados | Digest simples é suficiente |
FAQs
secrets vs os.urandom?
secrets envolve urandom com helpers; ambos CSPRNG para tokens.
algoritmos hashlib?
sha256 comum; evite md5/sha1 para integridade sensível à segurança.
uuid em URLs?
uuid4 ok; use token secrets se URL de capacidade opaca for necessária.
file_digest?
3.11+ lê o arquivo em pedaços: hashlib.file_digest(open(path,"rb"), "sha256").
saltar senhas?
Use biblioteca - nunca salt manual + uma única iteração de hash.
token_hex vs urlsafe?
urlsafe é mais curto para a mesma entropia em caminhos de URL; hex é mais simples para logs.
Tipo de DB UUID?
Coluna UUID nativa no Postgres; armazene como str ou tipo uuid por ORM.
exemplo HMAC?
hmac.new(key, msg, hashlib.sha256).hexdigest() para webhooks assinados.
comprimento da entropia?
mínimo de 16 bytes (128 bits) para tokens de sessão em muitos modelos de ameaça.
benefício do uuid7?
Ordenado por tempo reduz a fragmentação do índice do DB em comparação com uuid4 aleatório.
Relacionado
- json & Serialização - tokens em JSON
- subprocess - verificar checksums de artefatos
- Visão Geral da Biblioteca Padrão - mapa
- Tratamento de Senhas e Credenciais - padrões de autenticação
Versões do Stack: Esta página foi escrita para Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.