🎫
← Voltar aos guias

Como Verificar Assinaturas JWT: HS256, RS256 e ES256

· Tags: jwt-verification, jwt-signature, hs256, rs256, token-validation

Como Verificar Assinaturas JWT

Um JWT transporta suas claims (declarações) em texto simples. A única coisa que impede a falsificação é a assinatura. Sem verificação, um invasor pode criar tokens arbitrários e se passar por qualquer usuário. Este guia aborda os três algoritmos de assinatura JWT mais comuns e como verificar cada um deles.

O Processo de Verificação

Independentemente do algoritmo, a verificação de assinatura JWT segue os mesmos passos:

  1. Divida o token pelo . para extrair o header, o payload e a assinatura.
  2. Decodifique o header em base64url para ler o campo alg.
  3. Recalcule a assinatura a partir do header e do payload usando o algoritmo e a chave.
  4. Compare a assinatura recalculada com a assinatura do token.
  5. Se forem iguais, o token é autêntico.

HS256 (HMAC-SHA256)

HS256 é um algoritmo simétrico — a mesma chave secreta cria e verifica a assinatura.

signature = HMACSHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  secret
)

Para verificar, recalcule o HMAC com o segredo compartilhado e compare:

Token:   header.payload.sig
Secret:  "my-shared-secret"

1. Compute: HMACSHA256("header.payload", "my-shared-secret")
2. Compare: computedSignature === sig

Considerações de segurança: O segredo deve ser confidencial, rotacionado periodicamente e ter pelo menos 256 bits de entropia. HS256 não é ideal para arquiteturas de microsserviços em que muitos serviços precisam do segredo compartilhado.

RS256 (RSA-SHA256)

RS256 é assimétrico. O emissor assina com uma chave privada; os verificadores conferem com a chave pública correspondente.

signature = RSASHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

Para verificar, use a chave pública:

Token:   header.payload.sig
Public:  "-----BEGIN PUBLIC KEY-----..."

1. Load the RSA public key
2. Verify: RSA_SHA256_verify("header.payload", sig, publicKey)

Vantagens: As chaves de assinatura e verificação são separadas. Qualquer serviço pode verificar sem reter um segredo. As chaves públicas podem ser servidas a partir de um endpoint JWKS para facilitar a rotação.

ES256 (ECDSA-SHA256)

ES256 usa ECDSA com a curva P-256. Assim como RS256, é assimétrico.

signature = ECDSA_SHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

A verificação usa a chave pública ECDSA P-256. ES256 produz assinaturas muito menores (64 bytes vs. 256 bytes para RSA-2048) e oferece verificação mais rápida.

Comparação de Algoritmos

| Propriedade | HS256 | RS256 | ES256 | |-------------|-------|-------|-------| | Tipo de chave | Simétrica (segredo compartilhado) | Assimétrica (par RSA) | Assimétrica (par EC) | | Tamanho da assinatura | 32 bytes | 256 bytes | 64 bytes | | Distribuição de chaves | Compartilhada em segredo | A chave pública é pública | A chave pública é pública | | Rotação | Moderada | Fácil (JWKS) | Fácil (JWKS) | | Caso de uso | Sistemas internos confiáveis | APIs distribuídas | Mobile, IoT |

Armadilhas Comuns na Verificação

  • Ataque de confusão de algoritmo. Se o seu código lê alg do token sem impor restrições, um invasor pode alterar o algoritmo. Sempre valide se o algoritmo corresponde ao valor esperado.
  • Aceitar alg: "none". Algumas bibliotecas aceitam tokens não assinados. Rejeite alg: "none" explicitamente.
  • Truncamento de assinatura. Comparações que não usam tempo constante podem vazar informações por meio de ataques de temporização. Use a comparação integrada da sua biblioteca JWT.

Verifique Tokens JWT Online

Use a ferramenta de decodificador de JWT para decodificar e validar qualquer token. Cole o token, visualize o header e o payload e verifique a assinatura fornecendo a chave secreta ou pública apropriada. Todo o processamento acontece no seu navegador.

Como Verificar Assinaturas JWT: HS256, RS256 e ES256 - CoolTool