Executando verificação de segurança...
3

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.

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!

Carregando publicação patrocinada...
1

Legal o projeto. Vou me aprofundar mais nele.

Estou escrevendo aqui para orientar as pessoas sobre o termo redact que é traduzido errado em muitos lugares. E é assim porque é complicado mesmo, onde achamos uma tradução, vem o termo de forma equivocada.

Da mesma forma que dizem que não existe palavra equivalente a "saudade" em outras línguas (não sei se é verdade), não tem tradução direta para o português (não sei outras línguas) da palavra redact.

Já vi muitas tentativas, como a usada aqui, "redação", ou ainda "edição", "reedição", "reformulação", "reinterprretação", "supressão", até mesmo "censura", entre outras. Nenhuma é boa porque não expressa o que redact realmente é. Então precisamos recorrer a uma expressão que indica o que isso significa.

Podemos usar várias formas diferentes, mas nenhuma é tida com tradução oficial. Redact é a remoção de dados sensíveis. A sensibilidade pode geralmente tem a ver com privacidade, diferente de outras motivações de remoção de um dado. Mas já vi redact sendo usado para a sensibilidade de abuso de texto, não sei se é correto ou não. Já vi o uso de "esconder com tarja preta" e variações. Até o uso sem tradução já vi sendo usado, mas não gosto porque a pessoa que procurar o significado achará definições ruins.

Se a pessoa quiser mesmo usar apenas uma palavra, me parece que "supressão" seja a melhor. Mas ela não exprime exatamente o que se pretende comunicar. Claro que o contexto pode dar um direcionamento melhor para quem consegue fazer um raciocínio sobre o texto como um todo.

Em muitos casos pode-se usar uma palavra que não indique bem o que é, mas deve ter um parágrafo explicando o conceito de "redact* e informando que dali em diante a palavra tal será usada para expressar esse conceito. Não gosto muito da solução mas ela é aceitável. De qualquer forma cabe qualquer coisa que seja compreensível para o público-alvo.

Programação também é entender de letras. Eu entendo só até a página 3 :D

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).

1

A Cara tem palavras que realmente não tem uma tradução certa, acho que expressam mais intenção do que de fato é aquela palavra.

Muitas vezes me peguei usando (e ainda uso), "redação", "redact" mas acho que dentro do contexto da LGPD e do nuget em si acredito que o melhor termo seria mesmo "anonimização" porque é isso que é feito pegar o dado e transformar de um jeito que não de pra identificar o que é.

Mas o que vale é a intenção hehehe, de qualquer forma obrigado pelo esclarecimento, vou tentar padronizar o vocabulário e até colocar um disclaimer indicando o que é o termo e como será tratado dentro dos nugets