Skip to main content

IDataProtector no .NET | CSharp

  • IDataProtector no .NET | CSharp

Visão Geral

O IDataProtector faz parte da Data Protection API do ASP.NET Core e é utilizado para:

  • Proteger (criptografar) dados
  • Desproteger (descriptografar) dados

Seu objetivo é fornecer uma forma segura e padronizada de lidar com dados sensíveis sem precisar implementar criptografia manualmente.


Conceito Central

O fluxo básico é:

string protegido = protector.Protect("valor");
string original = protector.Unprotect(protegido);
  • Protect → transforma o dado em um valor ilegível
  • Unprotect → recupera o valor original
  • Se o dado for alterado → Unprotect lança exceção

Purpose (Escopo Lógico)

Ao criar um IDataProtector, você define um identificador lógico:

var protector = provider.CreateProtector("fila-mensagens");

Esse valor:

  • Isola o contexto de uso
  • Garante que apenas o mesmo "purpose" consiga ler o dado
  • Evita acesso indevido entre partes do sistema

Quando Usar

Use IDataProtector quando:

  • O dado será enviado para fora do backend (cliente, fila, URL)
  • Você precisa recuperar o valor depois
  • Quer garantir integridade + confidencialidade

Exemplos comuns

  • Tokens em query string
  • Dados em cookies
  • Payload enviado para fila (RabbitMQ, Kafka)
  • Dados temporários entre requisições

Quando Não Usar

Não use para:

  • Senhas → use hash (ex: PasswordHasher)
  • Integração com outros sistemas → use criptografia padrão (AES/RSA)
  • Dados que não precisam ser recuperados

Exemplo Completo (Console)

Program.cs

using System;
using System.Text;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;

ServiceCollection services = new();

services.AddDataProtection();

using ServiceProvider serviceProvider = services.BuildServiceProvider();

IDataProtectionProvider provider =
serviceProvider.GetRequiredService<IDataProtectionProvider>();

IDataProtector protector =
provider.CreateProtector("fila-mensagens");

byte[] payload = Encoding.UTF8.GetBytes("{ \"nome\": \"adolfosp\" }");

Console.WriteLine("Original:");
Console.WriteLine(Encoding.UTF8.GetString(payload));
Console.WriteLine();

string protegido = protector.Protect(Convert.ToBase64String(payload));

Console.WriteLine("Protegido:");
Console.WriteLine(protegido);
Console.WriteLine();

string base64 = protector.Unprotect(protegido);

byte[] recuperado = Convert.FromBase64String(base64);

Console.WriteLine("Recuperado:");
Console.WriteLine(Encoding.UTF8.GetString(recuperado));

Dependências

Arquivo .csproj

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
</ItemGroup>

</Project>

Uso em Cenário de Fila

Producer (envio)

string protegido = protector.Protect(Convert.ToBase64String(body));
await fila.EnviarAsync(protegido);

Consumer (leitura)

string base64 = protector.Unprotect(mensagem);
byte[] body = Convert.FromBase64String(base64);

Benefícios

  • Garante integridade da mensagem
  • Evita leitura indevida
  • Não precisa desserializar antes de enviar

Configuração para Produção

Por padrão, as chaves são locais.

Para múltiplas instâncias:

builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo("/keys"))
.SetApplicationName("MinhaApp");

Alternativas de armazenamento

  • File System compartilhado
  • Redis
  • Azure Key Vault
  • Banco de dados

Características Técnicas

  • Usa criptografia simétrica (AES)
  • Usa HMAC para integridade
  • Rotação automática de chaves
  • Proteção contra adulteração
  • Integrado ao pipeline do ASP.NET Core

Fluxo Técnico

  1. Recebe byte[]
  2. Converte para Base64
  3. Aplica Protect
  4. Transmite (fila, cliente, etc.)
  5. Aplica Unprotect
  6. Converte de volta para byte[]