A proteção de dados pessoais é uma prioridade no desenvolvimento de software, especialmente quando lidamos com informações sensíveis como CPF. Ofuscar esses dados é uma prática essencial para exibi-los de forma segura em interfaces sem comprometer a privacidade do usuário.
Neste artigo, vamos explorar técnicas robustas para ofuscar CPF em PHP, garantindo conformidade com as melhores práticas de segurança e tratamento de dados.
Por Que Ofuscar o CPF?
O CPF (Cadastro de Pessoas Físicas) é um dado pessoal crítico, e sua exposição indevida pode facilitar fraudes e violações de privacidade. A ofuscação ajuda a:
✅ Minimizar riscos de vazamento – Exibindo apenas parte dos dígitos.
✅ Manter a usabilidade – Permitindo que o usuário identifique parcialmente seu CPF sem expô-lo por completo.
✅ Atender à LGPD – Cumprindo regulamentações de proteção de dados.
Solução Básica: Ofuscando um CPF em PHP
Vamos começar com uma função simples que recebe um CPF (formatado ou não) e retorna uma versão ofuscada:
/**
* Ofusca um CPF, mantendo apenas os 3 primeiros e os 2 últimos dígitos visíveis.
*
* @param string $cpf CPF a ser ofuscado (pode conter pontos e traço).
* @return string CPF no formato 123.***.***-45 ou mensagem de erro.
*/
function ofuscarCPF(string $cpf): string {
// Remove caracteres não numéricos
$cpfNumerico = preg_replace('/\D/', '', $cpf);
// Verifica se tem 11 dígitos
if (strlen($cpfNumerico) !== 11) {
throw new InvalidArgumentException("CPF deve ter 11 dígitos.");
}
// Formata com ofuscação
return sprintf(
'%s.***.***-%s',
substr($cpfNumerico, 0, 3), // Primeiros 3 dígitos
substr($cpfNumerico, -2) // Últimos 2 dígitos (DV)
);
}
// Exemplo de uso:
echo ofuscarCPF('123.456.789-09'); // Saída: 123.***.***-09
Como Funciona?
preg_replace('/\D/', '', $cpf)
→ Remove tudo que não for número.strlen($cpfNumerico) !== 11
→ Valida se o CPF tem 11 dígitos.substr
+sprintf
→ Formata o CPF, substituindo dígitos intermediários por***.***
.
Melhorando a Solução: Validação de CPF + Tratamento de Erros
Para uma abordagem mais segura, podemos integrar uma validação real do CPF (verificando dígitos verificadores) antes da ofuscação:
/**
* Verifica se um CPF é válido.
*
* @param string $cpf CPF a ser validado (apenas números).
* @return bool True se válido, False caso contrário.
*/
function validarCPF(string $cpf): bool {
if (strlen($cpf) !== 11 || preg_match('/^(\d)\1+$/', $cpf)) {
return false;
}
// Cálculo dos dígitos verificadores (DV)
for ($t = 9; $t < 11; $t++) {
$soma = 0;
for ($i = 0; $i < $t; $i++) {
$soma += $cpf[$i] * (($t + 1) - $i);
}
$resto = $soma % 11;
$dv = ($resto < 2) ? 0 : 11 - $resto;
if ($cpf[$t] != $dv) {
return false;
}
}
return true;
}
/**
* Ofusca um CPF apenas se ele for válido.
*
* @param string $cpf CPF a ser ofuscado.
* @return string CPF ofuscado ou mensagem de erro.
* @throws InvalidArgumentException Se CPF for inválido.
*/
function ofuscarCPFSeguro(string $cpf): string {
$cpfNumerico = preg_replace('/\D/', '', $cpf);
if (!validarCPF($cpfNumerico)) {
throw new InvalidArgumentException("CPF inválido.");
}
return substr($cpfNumerico, 0, 3) . '.***.***-' . substr($cpfNumerico, -2);
}
// Exemplo:
try {
echo ofuscarCPFSeguro('529.982.247-25'); // Válido → 529.***.***-25
echo ofuscarCPFSeguro('111.111.111-11'); // Inválido → Exception
} catch (InvalidArgumentException $e) {
echo "Erro: " . $e->getMessage();
}
Vantagens dessa Abordagem
✔ Validação matemática do CPF → Garante que o número existe antes de ofuscar.
✔ Tratamento de erros explícito → Usa exceções para CPFs inválidos.
✔ Imunidade a CPFs óbvios (como 111.111.111-11
).
Alternativas de Ofuscação
Dependendo do caso, podemos variar o formato de ofuscação:
1. Ofuscar com XXXXX
em vez de ***
return substr($cpf, 0, 3) . '.XXXXX.XXX-' . substr($cpf, -2);
// Exemplo: 123.XXXXX.XXX-45
2. Manter apenas o último dígito visível (para logs)
return '***.***.***-' . substr($cpf, -2);
// Exemplo: ***.***.***-45
3. Ofuscar aleatoriamente alguns dígitos
$ofuscado = $cpf[0] . $cpf[1] . 'X' . rand(0,9) . 'X.' .
'XXX.' .
'XX' . $cpf[9] . $cpf[10];
// Exemplo: 12X5X.XXX.XX-45
Boas Práticas ao Manipular CPFs
- Nunca armazene CPFs em texto puro → Use hash ou criptografia se necessário.
- Evite logs completos → Sempre ofusque antes de registrar em logs.
- Não transmita CPFs sem necessidade → Use tokens ou IDs internos quando possível.
- Siga a LGPD → Tenha consentimento para coletar e processar CPFs.
Conclusão
Ofuscar CPFs é uma medida simples, mas crucial para proteger a privacidade dos usuários. A implementação em PHP apresentada aqui garante:
🔒 Segurança – Validação e mascaramento corretos.
📝 Legibilidade – Código limpo e bem documentado.
⚡ Eficiência – Processamento rápido e sem overhead desnecessário.
Se você lida com dados sensíveis, sempre ofusque antes de exibi-los e considere técnicas adicionais como criptografia para armazenamento seguro.
Gostou do artigo? Compartilhe e comente suas técnicas para proteger dados sensíveis! 🚀