Pitch: Redação de dados sensíveis no .NET: logs, JSON, XML, EF e MongoDB cobrindo a LGPD
No trabalho começamos a nos preparar para certificação ISO27001 e me deparei com um dilema: Redigir dados sensíveis em vários pontos da aplicação usando helpers e replicando para outros projetos OU usar/aplicar já táticas mais robustas e seguras existentes no ecossistema .NET?
Até então não encontrei nenhuma solução pronta que fosse simples de configurar e que entendesse o contexto brasileiro (CPF, CNPJ, CNH, Placa Mercosul, etc.) e que principalmente tivesse uma documentação legal.
Lembrei em algum canto do meu cerébro que a Microsoft dispunha de um nuget de compliance, mas de novo não queria ficar repetindo código em cada projeto pra fazer anonimização dos dados, então resolvi criar o EZ.Redact.Lgpd e seus nugets derivados.
O que é o EZ.Redact.Lgpd?
É um conjunto de pacotes .NET construído sobre o Microsoft.Extensions.Compliance.Redaction que cobre os principais pontos onde dados sensíveis podem vazar numa aplicação:
- EZ.Redact.Lgpd.Core — base de redação com suporte a masking e HMAC, zero allocation com
Span<char>, cobrindo CPF, CNPJ, CNH, Email, Telefone, Placa Mercosul, PIX, entre outros dados brasileiros - EZ.Redact.Lgpd.Json — redação na serialização JSON com suporte a System.Text.Json e Newtonsoft.Json
- EZ.Redact.Lgpd.Xml — redação na serialização XML com suporte a XmlSerializer e DataContractSerializer
- EZ.Redact.Lgpd.EntityFramework — redação opt-in na leitura de dados via EF Core, ideal para aplicações MAUI, WinForms e SignalR
- EZ.Redact.Lgpd.MongoDb — redação opt-in na leitura de documentos no MongoDB
Dois modos de redação
O Core suporta dois modos configuráveis por tipo de dado:
- Masking — preserva parte do dado para facilitar debugging:
123.***.***-01 - HMAC — hash determinístico irreversível, útil para logs de auditoria onde você quer correlacionar sem expor o dado original:
1:8fLm3q...==
Uso nos logs
Com o Core e o ILogger da Microsoft, basta decorar os parâmetros com os atributos de taxonomia:
public static partial class TesteLog
{
[LoggerMessage(Message = "Cpf anonimizado: {Cpf}")]
public static partial void LogAcesso(this ILogger logger, [CPFData] string cpf);
}
E no seu ILogger (funciona também com ILogger<\T>)
_logger.LogInformation("Cpf não anonimizado: {Cpf}", "111.111.111-11");
_logger.LogAcesso("111.111.111-11");
O dado já sai redigido automaticamente no log, independente do provider (console, Application Insights, etc.).
O Que inclusive já vai até redigido para o OpenTelemetry ou outra solução de análise de log!
info: Program[0]
Cpf não anonimizado: 111.111.111-11 11111111111
info: Program[158633788]
Cpf anonimizado: 111.***.***-11
A Lista de atributos suportados que cobrem os principais dados sensíveis você encontra no repositório do EZ.Redact.Lgpd.Core.
Links
Também tenho um outro projeto de source generator pra registro de minimal api usando um estilo controller usando atributos
Feedback é muito bem-vindo, especialmente se você tem casos de uso que os pacotes ainda não cobrem!