Capítulo 9 — Dados e bancos de dados
Mapa da aula
Aula 09 publicada. Mapa, exemplo, EX025.
flowchart TD
N0["9.1 Armazenamento de senhas"]
N1["Laboratório — Hash de senhas com salt"]
N2["9.2 Ler a execução"]
N3["9.3 Escolhas por campo"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX025"]
Desenho lógico
flowchart LR
N0["9.1 Armazenamento de senhas"]
N1["Laboratório — Hash de senhas com salt"]
N2["9.2 Ler a execução"]
N3["9.3 Escolhas por campo"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX025"]
[9.1 Armazenamento de senhas]
|
v
[Laboratório — Hash de senhas com salt]
|
v
[9.2 Ler a execução]
|
v
[9.3 Escolhas por campo]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX025]
Objetivos de aprendizagem
Você vai (1) armazenar senhas com hash lento e com salt; (2) explicar por que os salts e os fatores de trabalho importam; (3) escolher proteções por campo num banco de dados.
9.1 Armazenamento de senhas
O portal antigo da Tidewell armazenava as senhas com SHA-256 puro, o que Priya explica ser inseguro: o SHA-256 é rápido, então um atacante com uma tabela roubada pode testar bilhões de palpites por segundo, e senhas idênticas produzem hashes idênticos. Um esquema adequado acrescenta um salt aleatório único por usuário e usa uma função deliberadamente lenta. A RFC 9106 especifica o Argon2id, a escolha preferida; o PBKDF2, disponível no hashlib do Python, é uma alternativa mais antiga que precisa de um número alto de iterações. O laboratório demonstra o uso de salt com o PBKDF2 porque ele está na biblioteca padrão.
Laboratório — Hash de senhas com salt
"""Salted password hashing with hashlib.pbkdf2_hmac on synthetic passwords (prefer Argon2id, RFC 9106)."""
import hashlib, hmac
def h(pw, salt, n=600_000):
return hashlib.pbkdf2_hmac("sha256", pw.encode(), salt, n).hex()
def main():
s1, s2 = bytes.fromhex("a1" * 16), bytes.fromhex("b2" * 16) # fixed demo salts for reproducible output
a, b = h("correct horse 42", s1), h("correct horse 42", s2)
print("same password, different salts differ:", a != b)
print("stored:", a[:24], "...")
print("login with right password:", hmac.compare_digest(a, h("correct horse 42", s1)))
print("login with wrong password:", hmac.compare_digest(a, h("correct horse 43", s1)))
if __name__ == "__main__":
main()
Execute com python3 lab_pbkdf2.py. Saída verificada:
same password, different salts differ: True
stored: c96866459ba12d6a7bc6285d ...
login with right password: True
login with wrong password: False
9.2 Ler a execução
A mesma senha com dois salts diferentes produz valores armazenados diferentes, de modo que um atacante não consegue ver quais leitores compartilham uma senha nem usar tabelas pré-calculadas. Entrar com a senha certa recalcula o mesmo valor, e compare_digest devolve True; a mudança de um caractere devolve False. Os salts fixos de demonstração existem apenas para tornar a saída repetível; os salts reais vêm de secrets.token_bytes. As 600.000 iterações desaceleram cada palpite. Priya recomenda migrar para o Argon2id, refazendo o hash de cada senha no próximo login bem-sucedido do leitor.
9.3 Escolhas por campo
Além das senhas, Priya classifica os campos do banco de dados: nomes e endereços são cifrados no nível do campo, com chaves do serviço de chaves do consórcio; o histórico de empréstimos com mais de noventa dias é apagado, seguindo o princípio de privacidade de guardar apenas o necessário; e os números dos cartões dos leitores são tokenizados para os sistemas de relatórios. Ela registra que apagar dados antigos costuma ser a proteção mais forte, já que dados que não existem não podem vazar. Grace concorda e agenda a mudança de retenção depois da aprovação do conselho. A política é publicada para os leitores.
Exemplo resolvido
Priya substitui o SHA-256 puro por um hash lento com salt, planeja a migração para o Argon2id no próximo login, cifra os campos pessoais e apaga o histórico de empréstimos depois de noventa dias.
Caso sintético. O banco de dados da Tidewell é inventado; a RFC 9106 é real.
Erros e limites
O hash lento não salva senhas muito fracas. Chaves de cifração guardadas ao lado do banco de dados oferecem pouca proteção.
Exercícios
-
EX025 — Por que o SHA-256 falha. Por que o SHA-256 puro é inseguro para senhas? Rubrica: 3 = é rápido, permitindo bilhões de palpites, e senhas idênticas dão hashes idênticos;; 2 = rápido;; 1 = está bom;; 0 = nenhuma.
-
EX026 — Efeito do salt. O que o laboratório mostrou sobre os salts? Rubrica: 3 = a mesma senha com salts diferentes dá valores armazenados diferentes;; 2 = diferem;; 1 = iguais;; 0 = nenhuma.
-
EX027 — Proteção mais forte. O que Priya diz ser, muitas vezes, a proteção mais forte? Rubrica: 3 = apagar os dados que não são necessários;; 2 = apagar;; 1 = cifração;; 0 = nenhuma.
Síntese
O hash de senhas lento e com salt, a cifração de campos e a minimização de dados protegem os dados dos leitores nos bancos de dados.
Continue estudando — aula 09 (capítulo 09 de 40)
← Capítulo 08 · Índice das aulas · Capítulo 10 →
Continue para a próxima aula já escrita.