◇ OpenCyber Academy
Graduação · Capítulo 9 · Português

Capítulo 9 — Dados e bancos de dados

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

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

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.