LGPD e CPF: Guia Prático para Desenvolvedores
A LGPD (Lei nº 13.709/2018) classifica o CPF como dado pessoal. Para o desenvolvedor, isso tem implicações práticas em como coletar, armazenar, processar, registrar em logs e excluir esse dado. Este guia traduz os artigos da lei em decisões técnicas.
CPF como dado pessoal
O artigo 5º, inciso I da LGPD define dado pessoal como “informação relacionada a pessoa natural identificada ou identificável”. O CPF identifica diretamente uma pessoa, pois é o identificador fiscal único atribuído pela Receita Federal.
Consequência prática: toda operação com CPF está sujeita à LGPD, incluindo coleta, armazenamento, consulta, compartilhamento, transferência e exclusão.
Bases legais para tratar CPF
Você precisa de uma base legal (art. 7º) para processar CPFs. As mais comuns para desenvolvedores:
| Base legal | Quando usar | Exemplo |
|---|---|---|
| Consentimento (art. 7º, I) | Quando o titular autoriza | Formulário de newsletter com CPF |
| Execução de contrato (art. 7º, V) | Necessário para o serviço | E-commerce que emite nota fiscal |
| Obrigação legal (art. 7º, II) | Exigido por lei | Instituição financeira (KYC) |
| Legítimo interesse (art. 7º, IX) | Interesse do controlador | Analytics internos com CPF pseudonimizado |
A base legal não é uma escolha livre, depende do contexto. Se a lei exige o CPF (ex: emissão de nota fiscal), a base é obrigação legal, não consentimento.
Minimização de dados
O artigo 6º, inciso III exige que os dados sejam “adequados, pertinentes e limitados ao mínimo necessário”.
Na prática:
- Não peça CPF se não precisa: formulário de contato não precisa de CPF; cadastro para emissão de nota fiscal precisa
- Não armazene se não vai usar: se o CPF serve apenas para autenticação, armazene um HMAC, não o número completo
- Não replique em múltiplos sistemas: centralize o CPF em um serviço e distribua tokens ou identificadores internos para os demais
Armazenamento seguro
O artigo 46 exige “medidas de segurança, técnicas e administrativas aptas a proteger os dados pessoais”. Para CPF, isso significa:
- Nunca em texto plano: use HMAC ou AES-256
- Tipo de coluna correto: CHAR(11), não BIGINT
- Chaves em KMS: não no código-fonte ou variáveis de ambiente em repositórios
- Acesso restrito: apenas os serviços que precisam acessam a tabela com CPFs
CPF em logs
Logs de aplicação frequentemente contêm CPF acidentalmente: em payloads de requisição, mensagens de erro, ou logs de debug. Isso é um problema porque:
- Logs geralmente têm retenção longa (30 a 90 dias ou mais)
- Equipes inteiras têm acesso a ferramentas de log (Datadog, CloudWatch, ELK)
- Logs são exportados para sistemas de terceiros sem controle de acesso granular
Como evitar
Filtro no logger:
function sanitizeLog(data) {
const cpfPattern = /\d{3}\.?\d{3}\.?\d{3}-?\d{2}/g;
return JSON.stringify(data).replace(cpfPattern, "***CPF***");
}
logger.info(sanitizeLog({ user: "João", cpf: "529.982.247-25" }));
// {"user":"João","cpf":"***CPF***"}Middleware de sanitização:
function sanitizeRequest(req, res, next) {
if (req.body?.cpf) {
req.sanitizedBody = { ...req.body, cpf: "***" };
}
next();
}
// Logar req.sanitizedBody, não req.bodyCampo explícito no ORM:
class Pessoa:
cpf_hmac: str # indexável, logável
cpf_enc: str # nunca vai para log
def __repr__(self):
return f"Pessoa(cpf=***)" # impede leak em logs/debugRegra prática
Se o campo se chama cpf, documento, ou cpf_number, não deve aparecer em logs. Configure filtros globais no logger para mascarar esses campos automaticamente.
Anonimização e pseudonimização
A LGPD distingue dois conceitos (art. 5º, III e art. 13, §4º):
| Técnica | Definição | Reversível | Sujeito à LGPD |
|---|---|---|---|
| Anonimização | Dado não pode ser re-identificado | Não | Não (art. 12) |
| Pseudonimização | Dado pode ser re-identificado com chave | Sim | Sim |
Anonimização
Dado anonimizado não é dado pessoal e sai do escopo da LGPD. Mas para CPF, a anonimização real é difícil:
- Trocar por hash (SHA-256)? Reversível em minutos, o keyspace é pequeno
- Trocar por HMAC? Se você tem a chave, é pseudonimização, não anonimização
- Trocar por token sem mapeamento reverso? Agora sim é anônimo, mas você perdeu o vínculo com o titular
Quando usar: relatórios agregados, datasets de treinamento de ML, análises estatísticas onde o CPF individual é irrelevante.
-- Anonimizar para relatório: substituir por NULL
SELECT
estado,
COUNT(*) AS total_cadastros
FROM pessoas
GROUP BY estado;
-- CPF nunca aparece na query → dado efetivamente anônimo no resultadoPseudonimização
Mais prática para sistemas em produção: o dado pode ser re-identificado quando necessário, mas está protegido no dia a dia.
- HMAC com chave separada → busca por CPF sem expor o número
- Tokenização → serviços usam token em vez de CPF
Ambas as técnicas estão detalhadas em como armazenar CPF com segurança.
Direito à exclusão
O artigo 18, inciso VI garante ao titular o direito de “eliminação dos dados pessoais tratados com o consentimento do titular”. Na prática:
- Mapeie onde o CPF está: banco principal, backups, logs, caches, serviços de terceiros
- Implemente exclusão real:
DELETEno banco, não soft delete (ou garanta que o soft delete não expõe o CPF) - Logs: se o CPF está em logs, a sanitização preventiva evita o problema. Se já está registrado, a retenção do log determina quando será eliminado
- Backups: documente a política de retenção de backups. Se o backup é mantido por 30 dias, o CPF será eliminado em até 30 dias após a exclusão no banco
async function deletePessoa(id) {
// 1. Excluir do banco principal
await db.query("DELETE FROM pessoas WHERE id = $1", [id]);
// 2. Invalidar cache
await cache.del(`pessoa:${id}`);
// 3. Registrar a exclusão (sem o CPF)
logger.info(`Pessoa ${id} excluída a pedido do titular`);
}Incidentes de segurança
O artigo 48 exige que o controlador comunique à ANPD “a ocorrência de incidente de segurança que possa acarretar risco ou dano relevante aos titulares”. Se CPFs vazarem:
- Comunique a ANPD em prazo razoável (a lei não define prazo exato)
- Comunique os titulares se houver risco relevante
- Documente o incidente: o que vazou, quantos registros, medidas tomadas
Se os CPFs estavam criptografados (AES-256) e a chave não vazou, o risco real é baixo, pois o dado cifrado é inútil sem a chave. Isso não elimina a obrigação de comunicar, mas demonstra medidas técnicas adequadas.
Checklist para o desenvolvedor
- Base legal definida: saiba por que você processa CPFs
- Minimização: não colete CPF se não precisa
- Criptografia: HMAC + AES-256 no banco
- Tipo de coluna: CHAR(11), nunca BIGINT
- Logs limpos: filtro global para mascarar CPF
- Exclusão implementada: rota ou processo para deletar dados do titular
- Backups documentados: política de retenção clara
- Terceiros mapeados: saiba quais serviços recebem CPFs
Para ambientes de desenvolvimento e testes, use o gerador de CPF em vez de dados reais. CPFs gerados pelo algoritmo de módulo 11 são válidos matematicamente, mas não pertencem a ninguém.
Veja também: como armazenar CPF com segurança e validar CPF no cadastro.