◇ OpenCyber Academy
Tecnólogo · Capítulo 17 · Português

Capítulo 17 — Pseudonimização para extrações

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 — Pseudonimização para extrações

Mapa da aula

Aula 17 publicada. Mapa, exemplo, EX049.

flowchart TD
  N0["17.1 A necessidade"]
  N1["17.2 Como funciona"]
  N2["17.3 Protegendo a chave"]
  N0 --> N1 --> N2
  N2 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX049"]

Desenho lógico

flowchart LR
  N0["17.1 A necessidade"]
  N1["17.2 Como funciona"]
  N2["17.3 Protegendo a chave"]
  N0 --> N1 --> N2 --> Q["EX049"]
[17.1 A necessidade]
    |
    v
[17.2 Como funciona]
    |
    v
[17.3 Protegendo a chave]
    |
    v
[Exemplo resolvido] --> [Exercício EX049]

Objetivos de aprendizagem

Você vai (1) pseudonimizar identificadores com hashes com chave; (2) preservar a ligação entre registros para análise; (3) explicar os limites da pseudonimização.

17.1 A necessidade

Um analista quer estudar se alguns inquilinos relatam o mesmo problema repetidas vezes, o que poderia indicar reparos malfeitos. O estudo precisa ligar as ordens de um mesmo inquilino, mas não precisa saber quem ele é. Ravi propõe substituir os identificadores dos inquilinos por pseudônimos na extração. Ele explica que a pseudonimização reduz o risco caso a extração seja perdida ou mal usada, e ainda permite ao analista contar as ordens por inquilino e procurar padrões. O dono dos dados de locação aprova a extração com os pseudônimos, e Ravi registra a aprovação junto da descrição do estudo.

"""Mask tenant identifiers in a synthetic extract with keyed hashes and check linkage (stdlib only)."""
import hmac, hashlib
key = b"synthetic-teaching-key"
def p(t): return hmac.new(key, t.encode(), hashlib.sha256).hexdigest()[:12]
rows = [("T1001", "leak"), ("T1002", "boiler"), ("T1001", "damp"), ("T1003", "lock"), ("T1001", "leak")]
masked = [(p(t), j) for t, j in rows]
print(f"rows {len(rows)}; distinct tenants {len({t for t,_ in rows})}; distinct pseudonyms {len({t for t,_ in masked})}")
print(f"T1001 pseudonym {p('T1001')}; jobs linked {sum(1 for t,_ in masked if t == p('T1001'))}")

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

rows 5; distinct tenants 3; distinct pseudonyms 3
T1001 pseudonym 083752155d81; jobs linked 3

17.2 Como funciona

O laboratório usa os módulos hmac e hashlib do Python para criar um hash com chave de cada identificador de inquilino, com uma chave secreta guardada pela equipe de dados. Em uma extração sintética de cinco linhas com três inquilinos distintos, o resultado tem três pseudônimos distintos. O inquilino T1001 vira 083752155d81, e as três ordens desse inquilino compartilham o mesmo pseudônimo, de modo que o analista vê que um inquilino teve três ordens, incluindo dois vazamentos, sem conhecer o identificador. O analista confirma que essa ligação atende às necessidades do estudo.

17.3 Protegendo a chave

É a chave que torna os pseudônimos difíceis de reverter. Sem ela, alguém com uma lista de identificadores de inquilinos não consegue recalcular os pseudônimos. Ravi guarda a chave no cofre restrito da equipe de dados, e não no script, e limita o acesso a duas pessoas. Ele define a regra de que cada chave serve a um único projeto, para que terceiros não consigam ligar pseudônimos de extrações diferentes. Cada uso da chave fica registrado. O dono revisa o acesso ao cofre a cada trimestre e confirma que apenas as duas pessoas autorizadas continuam com acesso.

17.4 Limites

Ravi explica que os dados pseudonimizados continuam sendo dados pessoais segundo o GDPR, porque a equipe de dados consegue reidentificar os inquilinos com a chave e porque outros detalhes, como um reparo raro em um imóvel específico, podem identificar alguém. Na LGPD, a pseudonimização é definida no art. 13, § 4º, e só os dados anonimizados deixam de ser pessoais (art. 12). A extração, portanto, continua precisando de controles de acesso e de uma data de retenção. A Sra. Moreau observa que a pseudonimização é uma salvaguarda valiosa, mas não é anonimização, e que a NIST SP 800-188 discute por que a desidentificação precisa considerar todos os campos em conjunto.

Exemplo resolvido

Ravi pseudonimiza os identificadores dos inquilinos com hashes com chave, mantém três inquilinos como três pseudônimos, com as três ordens de T1001 ligadas, protege a chave em um cofre, uma por projeto, e explica que a extração continua sendo de dados pessoais.

Caso sintético. A extração e a chave são sintéticas; as saídas vêm de lab_mask.py; o GDPR, a LGPD e a NIST SP 800-188 são reais.

Erros e limites

Hashes simples, sem chave, podem ser revertidos calculando o hash de identificadores conhecidos.

Exercícios

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

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

Continue para a próxima aula já escrita.