LGPD / Compliance

Detecção e anonimização de dados pessoais em PHP

PHPOpen Source

Biblioteca PHP para identificar e mascarar CPF, CNPJ, chaves PIX, e-mail, telefone e cartão de crédito. Conformidade com LGPD e GDPR em poucas linhas de código.

O que é este projeto

Privacy Shield BR é uma biblioteca PHP focada em detecção e anonimização de dados pessoais (PII) em textos, formulários, logs e bases de dados. Ela foi criada para ajudar empresas brasileiras a cumprir a LGPD sem reescrever seus sistemas do zero.

A abordagem é simples: você passa um texto ou array de dados, a biblioteca identifica automaticamente os campos sensíveis e retorna uma versão anonimizada preservando o formato original. Funciona com CPF, CNPJ, chaves PIX, e-mail, telefone, cartão de crédito e nomes próprios.

Multas LGPD: A ANPD pode aplicar sanções de até 2% do faturamento bruto da empresa, limitadas a R$ 50 milhões por infração. Em 2025, as primeiras multas significativas foram aplicadas a empresas que expunham dados pessoais em logs e relatórios internos.

Detecção automática

O motor de detecção combina expressões regulares otimizadas com validação algorítmica. Não basta o formato parecer um CPF — a biblioteca valida o dígito verificador antes de classificar como dado pessoal.

  • CPF — formato XXX.XXX.XXX-XX com validação de dígitos verificadores
  • CNPJ — formato XX.XXX.XXX/XXXX-XX com validação completa
  • Chaves PIX — CPF, CNPJ, e-mail, telefone e chave aleatória
  • E-mail — detecção RFC 5322 com domínios válidos
  • Telefone — fixo e celular com DDD, formatos brasileiro e internacional
  • Cartão de crédito — Visa, Mastercard, Elo e Amex com validação Luhn

Exemplo: Padrões de detecção

// Padrões de regex para dados pessoais brasileiros private const PATTERNS = [ 'cpf' => '/\b(\d{3}\.?\d{3}\.?\d{3}-?\d{2})\b/', 'cnpj' => '/\b(\d{2}\.?\d{3}\.?\d{3}\/?\d{4}-?\d{2})\b/', 'email' => '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/', 'phone' => '/\(?\d{2}\)?\s?9?\d{4}-?\d{4}/', 'card' => '/\b(\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4})\b/', ]; // Validação de CPF com dígito verificador private function validateCpf(string $cpf): bool { $cpf = preg_replace('/\D/', '', $cpf); if (strlen($cpf) !== 11) return false; for ($t = 9; $t < 11; $t++) { $sum = 0; for ($i = 0; $i < $t; $i++) { $sum += $cpf[$i] * (($t + 1) - $i); } $digit = ((10 * $sum) % 11) % 10; if ($cpf[$t] != $digit) return false; } return true; }

Anonimização

A anonimização preserva o formato original do dado, mantendo a estrutura legível mas tornando impossível recuperar a informação real. Isso é essencial para logs de auditoria, relatórios e ambientes de homologação.

  • Mascaramento parcial123.456.789-09 vira 123.***.***-09
  • Substituição completajoao@email.com vira ***@***.com
  • Tokenização — substitui por token reversível (para casos que exigem recuperação)
  • Hash determinístico — mesmo dado gera mesmo hash (útil para joins em bases anonimizadas)

Exemplo: Uso da biblioteca

use Sakaguchi\PrivacyShield\Anonymizer; use Sakaguchi\PrivacyShield\Detector; // Inicializa o detector e o anonimizador $detector = new Detector(); $anonymizer = new Anonymizer(); // Texto com dados pessoais misturados $texto = 'Cliente João Silva, CPF 123.456.789-09, e-mail joao@empresa.com, tel (11) 99876-5432. Chave PIX: joao@empresa.com'; // Detecta todos os dados pessoais $findings = $detector->scan($texto); // Retorna: [cpf => ['123.456.789-09'], email => [...], phone => [...]] // Anonimiza preservando formato $resultado = $anonymizer->mask($texto); // 'Cliente João Silva, CPF 123.***.***-09, // e-mail ***@***.com, tel (11) ****-5432. // Chave PIX: ***@***.com' // Anonimização completa (irreversível) $limpo = $anonymizer->redact($texto); // 'Cliente [NOME], CPF [CPF], // e-mail [EMAIL], tel [TELEFONE]. // Chave PIX: [PIX]'

Conformidade LGPD

A biblioteca foi projetada para atender diretamente aos requisitos da Lei Geral de Proteção de Dados (Lei 13.709/2018). Cada funcionalidade mapeia para artigos específicos da lei:

  • Art. 5o (Definições) — a detecção classifica corretamente o que é dado pessoal, dado pessoal sensível e dado anonimizado, conforme os incisos I, II e III
  • Art. 6o (Princípios) — o método redact() implementa o princípio da necessidade (inciso III), garantindo que apenas os dados estritamente necessários sejam mantidos
  • Art. 18 (Direitos do titular) — o módulo de tokenização permite atender ao direito de eliminação (inciso VI) e ao direito de anonimização (inciso IV) sem quebrar a integridade referencial do banco de dados
  • Art. 46 (Segurança) — a anonimização em logs e relatórios atende à obrigação de adotar medidas técnicas para proteger dados pessoais
  • Art. 48 (Incidentes) — dados já anonimizados reduzem drasticamente o impacto de vazamentos, simplificando a comunicação à ANPD

Integração

A instalação é via Composer e a integração com qualquer projeto PHP leva menos de 5 minutos. Para Laravel, incluímos um middleware pronto que anonimiza automaticamente dados sensíveis nos logs da aplicação.

Instalação via Composer

# Instalar via Composer $ composer require sakaguchi/privacy-shield-br # Publicar configuração (Laravel) $ php artisan vendor:publish --tag=privacy-shield-config

Middleware para Laravel

// app/Http/Middleware/AnonymizeLogData.php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Sakaguchi\PrivacyShield\Anonymizer; class AnonymizeLogData { public function handle(Request $request, Closure $next) { $response = $next($request); // Anonimiza dados sensíveis antes de logar $anonymizer = new Anonymizer(); $logData = $anonymizer->maskArray($request->all()); logger()->info('Request processada', $logData); return $response; } }

Performance

A detecção é otimizada para processar grandes volumes de texto sem impacto perceptível na aplicação. Benchmarks em um servidor com 2 vCPUs e 4GB de RAM:

  • 1.000 registros — 45ms (detecção + anonimização completa)
  • 10.000 registros — 380ms com cache de padrões compilados
  • 100.000 registros — 3.2s usando processamento em batch

As técnicas de otimização incluem:

  • Regex compilado — padrões são pré-compilados e cacheados na inicialização
  • Early exit — se o texto não contém dígitos, pula validação de CPF/CNPJ/cartão
  • Batch processing — método scanBatch() processa arrays em uma única passada
  • Lazy detection — modo que para no primeiro match (útil para validação rápida)

Como usar

Instale o pacote, configure as regras de detecção e integre no fluxo da sua aplicação. Cada projeto pode customizar quais tipos de dados detectar e qual estratégia de anonimização aplicar.

  • composer.json — dependência do pacote
  • config/privacy-shield.php — tipos habilitados, estratégia de mascaramento, exceções
  • Detector — classe principal de detecção de PII
  • Anonymizer — classe de anonimização com múltiplas estratégias
  • Middleware — integração automática com Laravel (opcional)
# Instalar e configurar $ composer require sakaguchi/privacy-shield-br $ cp vendor/sakaguchi/privacy-shield-br/config/privacy-shield.php config/ # Uso rápido em 3 linhas require 'vendor/autoload.php'; $shield = new Sakaguchi\PrivacyShield\Shield(); echo $shield->protect('CPF: 123.456.789-09'); // Saída: CPF: 123.***.***-09

Quer implementar algo parecido?

Entendemos o seu contexto antes de apresentar qualquer solução.

Fale conosco