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ívelUnprotect→ recupera o valor original- Se o dado for alterado →
Unprotectlanç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
- Recebe
byte[] - Converte para Base64
- Aplica
Protect - Transmite (fila, cliente, etc.)
- Aplica
Unprotect - Converte de volta para
byte[]