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:

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.JwtBearerSystem.IdentityModel.Tokens.JwtKonscious.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
HttpOnlyou memória volátil aolocalStoragese 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 correta — argon2.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