← Back to list

JWT com Argon2 no .NET: autenticação segura para APIs modernas

A stack de autenticação em .NET fica sólida quando separamos duas responsabilidades:

Danilo O. Pinheiro · 2026-06-01 00:40 · 0 claps · 3.1 min read
#dotnet #argon2 #csharp #jwt
Open on Medium ↗

JWT com Argon2 no .NET: autenticação segura para APIs modernas

A stack de autenticação em **.NET** fica sólida quando separamos duas responsabilidades:

Argon2id para guardar senhas (hash irreversível, lento, memória-intensivo)

JWT Bearer para provar identidade depois do login

✅ Validação de **iss, `aud**,exp` e assinatura em cada request

✅ Segredos fora do repositório (ambiente / Key Vault)

Se o ecossistema **.NET já oferece hosting, APIs e pacotes maduros, combinar Argon2 (referência da Password Hashing Competition, testável em argon2.online) com JWT** é o caminho natural para microsserviços e Web APIs.

Neste artigo, mostro o fluxo registo → login → token → rotas protegidas com foco no que implementar no dia a dia.

⚠️ Observação importante

JWT não substitui Argon2. Nunca coloque senha ou hash no payload do token. Argon2 protege a credencial na base de dados; JWT é sessão assinada com expiração.

🧠 Visão Geral

AspectoArgon2 (senha)JWT (sessão)FocoResistir a offline crackingAutorizar requests após loginOnde viveColuna password_hash na BDHeader Authorization: BearerAlgoritmoArgon2id (OWASP)HMAC-SHA256 ou RSA (config)Ferramenta de estudoargon2.onlinedocs Microsoft JWT BearerRuntimeBiblioteca .NET (ex.: Konscious Argon2)Microsoft.AspNetCore.Authentication.JwtBearerErro clássicoMD5/SHA rápido na senhaToken sem validar aud/iss

🧩 O que o Argon2 resolve (camada 1)

O Argon2 é o vencedor da Password Hashing Competition — hoje a referência para novas passwords.

1️⃣ Hash irreversível com Argon2id

var hash = hasher.Hash(password);
await store.CreateAsync(email, hash);

✅ Salt único por utilizador

✅ Parâmetros m, t, p documentados no próprio hash

✅ Verificação com tempo constante (FixedTimeEquals)

2️⃣ Calibrar custo com consciência

Em argon2.online podes experimentar memory cost e iterations — útil em laboratório.

📌 Em produção usa biblioteca auditada (.NET), não hashes de utilizadores reais em sites públicos.

3️⃣ O que não fazer na senha

✅ Não “criptografar” senha com AES reversível

✅ Não MD5 / SHA-1 / SHA-256 simples

✅ Não logar password nem hash em erros

🚀 O que o JWT resolve no .NET (camada 2)

Depois de Verify com sucesso, o **.NET** emite um token assinado.

1️⃣ Emissão após login

Sem JWT (só sessão server-side):

Cookie de sessão + estado no servidor

Com JWT Bearer (API stateless):

var jwt = tokens.CreateToken(user.Id, user.Email, user.Roles);
return Results.Ok(new { accessToken = jwt, tokenType = "Bearer" });

📌 Claims mínimos: sub, email, role — sem senha no token.

2️⃣ Validação no pipeline ASP.NET Core

options.TokenValidationParameters = new TokenValidationParameters
{
    ValidateIssuer = true,
    ValidateAudience = true,
    ValidateLifetime = true,
    ValidateIssuerSigningKey = true,
};

✅ Rejeita token expirado

✅ Rejeita iss/aud incorretos

✅ Protege rotas com .RequireAuthorization()

3️⃣ Segredo de assinatura

Jwt:SigningKey → variável de ambiente / Key Vault (NUNCA no Git)

📌 Rotação de chave planeada em produção.

4️⃣ Pacotes no ecossistema .NET

  • Microsoft.AspNetCore.Authentication.JwtBearer
  • System.IdentityModel.Tokens.Jwt
  • Konscious.Security.Cryptography.Argon2 (ou equivalente Argon2id)

➡️ Alinhado ao stack oficial em dotnet.microsoft.com

➡️ APIs, cloud e tooling no mesmo SDK

5️⃣ Hardening obrigatório

  • Rate limit em /auth/login
  • HTTPS em produção
  • Mensagem genérica em falha de login (não revelar se email existe)

📌 Ideal para APIs expostas na internet e microsserviços.

🏗️ Impacto Arquitetural

🔹 APIs ASP.NET Core

  • Login local com Argon2 + JWT para o resto da API
  • Gateway (YARP) pode reencaminhar o Bearer token

🔹 SPAs e Blazor WASM

  • Login via API — hash de senha no servidor, não só no browser
  • Preferir cookie HttpOnly ou memória volátil ao localStorage se XSS for risco

🔹 Equipas de segurança

  • ADR: Argon2id + validação JWT completa
  • argon2.online apenas para testes de parâmetros

📊 Comparação prática

Errado

new Claim("password", password) // NUNCA no JWT

Certo

// BD: Argon2
var hash = hasher.Hash(password);
// Login OK → JWT
var token = tokens.CreateToken(userId, email, roles);

🧩 Quando adotar JWT + Argon2?

✅ Adote se:

  • Expõe REST/Minimal API em .NET
  • Precisa de auth stateless entre serviços
  • Controla login local (email/senha)

⚠️ Avalie com cautela se:

  • Só login corporativo → OpenID Connect / Entra ID
  • Monólito com sessão simples → cookies + Identity pode bastar

🔮 Direção da autenticação .NET

  • Menos hashes fracos em legado
  • Mais Argon2id + políticas OWASP
  • JWT com validação estrita e refresh tokens rotativos
  • MFA além de senha forte
  • Integração cloud nativa no .NET

✅ Conclusão

JWT com Argon2 no .NET não é moda: é separação corretaargon2.online e a documentação Argon2 ajudam a entender o hash; dotnet.microsoft.com é a base para APIs e pacotes JWT.

O resultado é login defensável e APIs autorizadas sem confundir «token» com «senha guardada».

Artigo completo: https://dopme.io/centro-conhecimento/artigos/seguranca/jwt-argon2-dotnet

🤝 Conecte-se comigo

Se você trabalha com .NET moderno e quer evoluir em temas como arquitetura, C#, DevOps, segurança e interoperabilidade, vamos conversar:

💼 Linkedin 💻 Devto ✍️ Medium 📰 Substack

Não vos escrevi porque não soubésseis a verdade, mas porque a sabeis, e porque nenhuma mentira é da verdade. 1 João 2:21


메타데이터
post_id
b6f5cf97ca52
slug
jwt-com-argon2-no-net-autenticação-segura-para-apis-modernas-b6f5cf97ca52
url
https://medium.com/@daniloopinheiro/jwt-com-argon2-no-net-autentica%C3%A7%C3%A3o-segura-para-apis-modernas-b6f5cf97ca52
canonical_url
https://medium.com/@daniloopinheiro/jwt-com-argon2-no-net-autentica%C3%A7%C3%A3o-segura-para-apis-modernas-b6f5cf97ca52
author_url
https://medium.com/@daniloopinheiro
status
ok
fetched_at
2026-07-10 08:43:10