Como criptografar dados de CPF em trânsito e em repouso conforme a LGPD

Aprenda a criptografar dados de CPF em trânsito e em repouso para conformidade com a LGPD. Técnicas práticas com exemplos de código.

Redação CPFHub.io
Redação CPFHub.io
··7 min de leitura
Como criptografar dados de CPF em trânsito e em repouso conforme a LGPD

Para criptografar dados de CPF conforme a LGPD, use HTTPS/TLS 1.2 ou superior para proteger a transmissão e AES-256 no nível da aplicação para proteger o armazenamento — a combinação das duas camadas garante que o dado esteja ilegível tanto em trânsito quanto em caso de acesso indevido ao banco.

Introdução

A criptografia é uma das medidas técnicas mais importantes para proteger dados pessoais, e a LGPD a reconhece como instrumento fundamental de segurança. Quando se trata de dados de CPF, que permitem identificar diretamente uma pessoa e vinculá-la a registros financeiros e fiscais, a criptografia em trânsito e em repouso é indispensável.

Muitas empresas protegem os dados durante a transmissão (em trânsito) com HTTPS, mas esquecem de criptografá-los no banco de dados (em repouso). Essa lacuna pode expor CPFs em caso de vazamento ou acesso indevido ao armazenamento.

A API da CPFHub.io opera exclusivamente sobre HTTPS, garantindo que o CPF enviado na URL e os dados retornados na resposta sejam criptografados durante toda a transmissão.


O que a LGPD diz sobre criptografia

A LGPD, em seu artigo 46, determina que os agentes de tratamento devem adotar medidas de segurança técnicas e administrativas aptas a proteger os dados pessoais de acessos não autorizados e de situações acidentais ou ilícitas de destruição, perda, alteração, comunicação ou difusão.

O artigo 48, paragrafo 3o, menciona que a ANPD pode considerar a adoção de criptografia como fator atenuante na avaliação de incidentes de segurança. Em outras palavras, empresas que criptografam dados de CPF estão melhor posicionadas em caso de vazamento.


Criptografia em trânsito

A criptografia em trânsito protege os dados enquanto são transmitidos entre sistemas, como entre o navegador do usuário e o servidor, ou entre o servidor da aplicação e a API de consulta de CPF.

HTTPS/TLS

O protocolo HTTPS com TLS 1.2 ou superior é o padrão mínimo para criptografia em trânsito. Ao consumir a API da CPFHub.io, todas as requisições já trafegam por HTTPS:

curl -X GET https://api.cpfhub.io/cpf/12345678900 \
    -H "x-api-key: SUA_CHAVE_DE_API" \
    -H "Accept: application/json" \
    --max-time 10

O prefixo https:// garante que o CPF enviado na URL e a resposta da API são criptografados durante a transmissão.

Boas práticas para trânsito

  • Forçar HTTPS -- Redirecione todas as requisições HTTP para HTTPS.

  • TLS 1.2 ou superior -- Desabilite versões anteriores do TLS e SSL.

  • Certificados válidos -- Utilize certificados emitidos por autoridades certificadoras reconhecidas.

  • HSTS -- Implemente o header HTTP Strict Transport Security para forçar conexões seguras.

  • Verificação de certificado -- Nunca desabilite a verificação de certificado nas requisições à API.


Criptografia em repouso

A criptografia em repouso protege os dados armazenados em bancos de dados, arquivos, backups e logs. Mesmo que um invasor obtenha acesso ao armazenamento, os dados permanecem ilegíveis sem a chave de descriptografia.

Criptografia no nível da aplicação

Uma abordagem robusta é criptografar o CPF antes de salvá-lo no banco de dados, usando criptografia simétrica (AES-256):

import os
from cryptography.fernet import Fernet

# Gerar e armazenar a chave de forma segura (variavel de ambiente)
# CHAVE_CRIPTOGRAFIA = Fernet.generate_key()
CHAVE_CRIPTOGRAFIA = os.environ['CHAVE_CRIPTOGRAFIA'].encode()

cipher = Fernet(CHAVE_CRIPTOGRAFIA)

def criptografar_cpf(cpf: str) -> str:
    """Criptografa o CPF antes de armazenar."""
    return cipher.encrypt(cpf.encode()).decode()

def descriptografar_cpf(cpf_criptografado: str) -> str:
    """Descriptografa o CPF quando necessario."""
    return cipher.decrypt(cpf_criptografado.encode()).decode()

# Exemplo de uso
cpf_original = '12345678900'
cpf_cifrado = criptografar_cpf(cpf_original)
print(f'CPF criptografado: {cpf_cifrado}')

cpf_recuperado = descriptografar_cpf(cpf_cifrado)
print(f'CPF descriptografado: {cpf_recuperado}')

Criptografia no nível do banco de dados

Bancos de dados modernos oferecem criptografia transparente de dados (TDE):

  • PostgreSQL -- pgcrypto extension ou TDE em versões enterprise.

  • MySQL -- InnoDB tablespace encryption.

  • MongoDB -- Encryption at rest com WiredTiger.

  • AWS RDS -- Criptografia de armazenamento com KMS.

Gestão de chaves

A segurança da criptografia depende da gestão das chaves:

  • Nunca armazene chaves no código-fonte -- Use variáveis de ambiente ou serviços de gerenciamento de chaves (KMS).

  • Rotação periódica -- Altere as chaves de criptografia periodicamente.

  • Separação de responsabilidades -- Quem tem acesso ao banco de dados não deve ter acesso às chaves.

  • Backup seguro das chaves -- Sem a chave, os dados são irrecuperáveis.


Fluxo completo: consulta, criptografia e armazenamento

Veja um exemplo que integra a consulta à API da CPFHub.io com criptografia antes do armazenamento:

import os
import requests
from cryptography.fernet import Fernet

CPFHUB_API_KEY = os.environ['CPFHUB_API_KEY']
CHAVE_CRIPTOGRAFIA = os.environ['CHAVE_CRIPTOGRAFIA'].encode()
cipher = Fernet(CHAVE_CRIPTOGRAFIA)

def validar_e_armazenar_cpf(cpf: str) -> dict:
    # 1. Consultar a API
    url = f'https://api.cpfhub.io/cpf/{cpf}'
    headers = {
    'x-api-key': CPFHUB_API_KEY,
    'Accept': 'application/json'
    }

    response = requests.get(url, headers=headers, timeout=10)
    resultado = response.json()

    if not resultado.get('success'):
    return {'erro': 'CPF nao encontrado ou invalido'}

    dados = resultado['data']

    # 2. Criptografar antes de armazenar
    registro = {
    'cpf_criptografado': cipher.encrypt(dados['cpf'].encode()).decode(),
    'nome_criptografado': cipher.encrypt(dados['name'].encode()).decode(),
    'validado': True
    }

    # 3. Salvar no banco de dados (simulado)
    # db.usuarios.insert(registro)

    return {'status': 'salvo com sucesso', 'validado': True}

resultado = validar_e_armazenar_cpf('12345678900')
print(resultado)

Criptografia de backups e logs

Backups

Backups de bancos de dados que contêm CPFs devem ser criptografados:

  • Use criptografia AES-256 para arquivos de backup.

  • Armazene backups em locais com controle de acesso restrito.

  • Teste periodicamente a restauração de backups criptografados.

Logs

Logs de auditoria não devem conter CPFs em texto claro. Utilize mascaramento ou hashing:

  • Mascaramento -- 123.***.***-00 para identificação parcial.

  • Hashing -- SHA-256 do CPF para correlação sem exposição do dado.


Erros comuns na criptografia de CPF

  • Criptografar em trânsito, mas não em repouso -- HTTPS protege a transmissão, mas não o armazenamento.

  • Armazenar chaves no código-fonte -- Repositórios podem ser comprometidos, expondo todas as chaves.

  • Usar algoritmos obsoletos -- MD5 e SHA-1 para hashing de CPF são inseguros; prefira SHA-256 ou bcrypt.

  • Não criptografar backups -- Um backup não criptografado é uma cópia completa dos dados expostos.

  • Esquecer logs e arquivos temporários -- CPFs podem vazar por logs, caches e arquivos temporários não protegidos.


Perguntas frequentes

Qual algoritmo de criptografia usar para dados de CPF em repouso?

AES-256 em modo GCM é a escolha recomendada para dados em repouso: oferece criptografia simétrica com autenticação integrada, detectando adulterações no dado cifrado. Para hashing (quando não é necessário descriptografar, como em buscas por igualdade), prefira SHA-256 com sal. Evite MD5 e SHA-1, considerados criptograficamente inseguros pelo OWASP.

HTTPS sozinho é suficiente para conformidade com a LGPD?

Não. O artigo 46 da LGPD exige medidas de segurança tanto para a transmissão quanto para o armazenamento. HTTPS protege apenas o dado em trânsito; um banco de dados comprometido expõe todos os CPFs armazenados em texto claro. A combinação de HTTPS + criptografia em repouso é o padrão mínimo para conformidade.

Como gerenciar chaves de criptografia de forma segura?

Nunca armazene chaves no código-fonte ou em variáveis de ambiente de repositórios públicos. Use serviços gerenciados de chaves como AWS KMS, Google Cloud KMS ou HashiCorp Vault, que oferecem rotação automática, auditoria de acesso e separação de responsabilidades. A chave deve ser acessível apenas pelo serviço que precisa descriptografar — não pelo banco de dados diretamente.

O que fazer com CPFs em logs de auditoria?

Substitua o CPF completo por uma versão mascarada (123.***.***-00) nos logs de acesso e aplique SHA-256 com sal nos logs de auditoria onde é necessário rastrear operações sem expor o dado. Logs que contêm CPFs em texto claro devem ser protegidos com controle de acesso estrito e prazo de retenção documentado, conforme o princípio de minimização de dados da LGPD.


Conclusão

Criptografar dados de CPF em trânsito e em repouso é uma medida técnica essencial para conformidade com a LGPD e para a proteção real dos dados dos titulares. A combinação de HTTPS para comunicação, criptografia AES-256 para armazenamento e gestão adequada de chaves forma a base de uma estratégia de segurança robusta. Cadastre-se em cpfhub.io — 50 consultas mensais gratuitas, sem cartão de crédito — e integre a consulta de CPF já com HTTPS nativo, sem configuração adicional de criptografia em trânsito.

CPFHub.io

Pronto para integrar a API?

50 consultas gratuitas para testar agora. Sem cartão de crédito. Acesso imediato à documentação.

Redação CPFHub.io

Sobre a redação

Redação CPFHub.io

Time editorial especializado em APIs de CPF, identidade digital e compliance no mercado brasileiro. Produzimos guias técnicos, análises regulatórias e tutoriais sobre LGPD e KYC para desenvolvedores e líderes de produto.

WhatsAppFale conosco via WhatsApp