DEV Community

Cover image for 🚀 JWT sem hash forte de senha é armadilha — Argon2 + .NET fecham o ciclo

🚀 JWT sem hash forte de senha é armadilha — Argon2 + .NET fecham o ciclo

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

Aspecto Argon2 (senha) JWT (sessão)
Foco Resistir a offline cracking Autorizar requests após login
Onde vive Coluna password_hash na BD Header Authorization: Bearer
Algoritmo Argon2id (OWASP) HMAC-SHA256 ou RSA (config)
Ferramenta de estudo argon2.online docs Microsoft JWT Bearer
Runtime Biblioteca .NET (ex.: Konscious Argon2) Microsoft.AspNetCore.Authentication.JwtBearer
Erro clássico MD5/SHA rápido na senha Token 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);
Enter fullscreen mode Exit fullscreen mode

✅ 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
Enter fullscreen mode Exit fullscreen mode

Com JWT Bearer (API stateless):

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

📌 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,
};
Enter fullscreen mode Exit fullscreen mode

✅ 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)
Enter fullscreen mode Exit fullscreen mode

📌 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
Enter fullscreen mode Exit fullscreen mode

Certo

// BD: Argon2
var hash = hasher.Hash(password);

// Login OK → JWT
var token = tokens.CreateToken(userId, email, roles);
Enter fullscreen mode Exit fullscreen mode

🧩 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

Top comments (0)