◇ OpenCyber Academy
Técnico · Capítulo 17 · Português

Capítulo 17 — Laboratório isolado II

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 17 — Laboratório isolado II

Mapa da aula

Aula 17 publicada. Mapa, exemplo, EX065.

flowchart TD
  N0["17.1 Por que o hash de senhas é diferente"]
  N1["17.2 Laboratório com scrypt"]
  N2["Laboratório — Vetor do scrypt e armazenamento com sa"]
  N3["17.3 Detectar, corrigir, verificar"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX065"]

Desenho lógico

flowchart LR
  N0["17.1 Por que o hash de senhas é diferente"]
  N1["17.2 Laboratório com scrypt"]
  N2["Laboratório — Vetor do scrypt e armazenamento com sa"]
  N3["17.3 Detectar, corrigir, verificar"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX065"]
[17.1 Por que o hash de senhas é diferente]
    |
    v
[17.2 Laboratório com scrypt]
    |
    v
[Laboratório — Vetor do scrypt e armazenamento com sa]
    |
    v
[17.3 Detectar, corrigir, verificar]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX065]

Objetivos de aprendizagem

Você vai (1) armazenar senhas corretamente com uma função resistente em memória num laboratório; (2) contrastar os hashes rápidos com o hash de senhas; (3) executar um ciclo completo de detectar, corrigir e verificar num serviço de laboratório.

17.1 Por que o hash de senhas é diferente

O portal de clientes da Lumen armazena senhas, e Priya pede que Tomás confira como. Armazená-las em claro ou cifrá-las de forma reversível permite que qualquer um com acesso ao banco de dados as recupere. Um SHA-256 simples é melhor, mas ainda fraco, porque os atacantes podem testar bilhões de palpites por segundo em placas de vídeo. O armazenamento de senhas precisa de uma função deliberadamente lenta e com salt, como o scrypt, definido na RFC 7914, ou o Argon2id, definido na RFC 9106. Um salt aleatório e único por usuário impede as tabelas pré-calculadas e faz com que senhas idênticas produzam valores armazenados diferentes. Tomás vai configurar essas funções por meio de bibliotecas, e nunca inventar seu próprio esquema.

17.2 Laboratório com scrypt

No laboratório isolado, Tomás usa o hashlib.scrypt da biblioteca padrão do Python. Ele primeiro o confere contra o vetor de teste da RFC 7914, com a senha password e o salt NaCl, para saber que a chamada está correta. Em seguida, armazena dois usuários sintéticos com a mesma senha e salts diferentes e mostra que os valores armazenados diferem, enquanto a verificação funciona com a senha certa e falha com uma errada. A saída do laboratório abaixo registra esses resultados. Parâmetros como o fator de custo e a memória são escolhidos pela política; os valores pequenos do vetor existem apenas para tornar o teste rápido.

Laboratório — Vetor do scrypt e armazenamento com salt

# hashlib.scrypt: RFC 7914 test vector, then salted storage for synthetic users. Teaching only.
import hashlib, hmac, secrets
v = hashlib.scrypt(b"password", salt=b"NaCl", n=1024, r=8, p=16, dklen=64).hex()
print("RFC 7914 vector match:", v.startswith("fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b373162"))
P = dict(n=2**14, r=8, p=1, dklen=32)   # lab parameters; production values come from policy
def store(pw):
    salt = secrets.token_bytes(16); return salt, hashlib.scrypt(pw, salt=salt, **P)
def check(pw, rec): return hmac.compare_digest(hashlib.scrypt(pw, salt=rec[0], **P), rec[1])
ana, ben = store(b"Depot-Spring-26"), store(b"Depot-Spring-26")
print("same password, stored values differ:", ana[1] != ben[1])
print("ana correct password:", check(b"Depot-Spring-26", ana))
print("ana wrong password:", check(b"Depot-Spring-27", ana))

Execute com python3 lab_scrypt.py. Saída verificada:

RFC 7914 vector match: True
same password, stored values differ: True
ana correct password: True
ana wrong password: False

17.3 Detectar, corrigir, verificar

Tomás executa o ciclo completo numa cópia de laboratório do portal. Detectar: o banco de dados do laboratório armazena hashes SHA-256 sem salt. Corrigir: a aplicação é alterada para calcular o scrypt com os parâmetros da política no próximo login bem-sucedido e substituir o hash antigo, para que os usuários não precisem redefinir a senha. Verificar: ele faz login com uma conta sintética, confere que o valor armazenado agora tem o formato do scrypt e que uma senha errada falha. Ele registra cada passo como evidência. O mesmo plano vai depois para a equipe de desenvolvimento, para o portal real, pelo processo normal de versões dela.

Exemplo resolvido

Tomás confirma o vetor da RFC 7914, mostra hashes com salt distintos para senhas idênticas e documenta no laboratório uma correção de atualização no login.

Caso sintético. Os usuários, as senhas e a cópia do portal são sintéticos; a RFC 7914 e a RFC 9106 são reais.

Erros e limites

Os parâmetros do laboratório são deliberadamente pequenos; a produção precisa do custo definido pela política. A atualização no login deixa as contas inativas com os hashes antigos até serem tratadas separadamente.

Exercícios

Síntese

O armazenamento de senhas precisa de funções padronizadas, lentas e com salt, verificadas contra vetores e implantadas por um ciclo de detectar, corrigir e verificar.

Continue estudando — aula 17 (capítulo 17 de 18)

← Capítulo 16 · Índice das aulas · Capítulo 18 →

Continue para a próxima aula já escrita.