# 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.

**Publicado:** 27/01/2025
**Autor:** Redação CPFHub.io
**URL:** https://cpfhub.io/blog/como-criptografar-dados-de-cpf-em-transito-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**](https://www.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](https://www.gov.br/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**](https://www.cpfhub.io/), todas as requisições já trafegam por HTTPS:

```bash
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):

```python
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:

```python
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://owasp.org/www-project-top-ten/).

### 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.

### Leia também

- [LGPD: CPF é dado pessoal sensível ou não? Entenda a classificação correta](https://cpfhub.io/blog/lgpd-cpf-e-dado-pessoal-sensivel-ou-nao-entenda-a-classificacao-correta)
- [Vazamento de CPF: responsabilidades da empresa e como prevenir](https://cpfhub.io/blog/vazamento-de-cpf-responsabilidades-da-empresa-e-como-prevenir)
- [KYC no Brasil: quais setores são obrigados a validar CPF por lei](https://cpfhub.io/blog/kyc-no-brasil-quais-setores-sao-obrigados-a-validar-cpf-por-lei)
- [Como atender às exigências do COAF para PLD/FT usando validação de CPF](https://cpfhub.io/blog/como-atender-as-exigencias-do-coaf-para-pld-ft-usando-validacao-de-cpf)

---

## 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](https://www.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.

