Como Verificar Assinaturas JWT: HS256, RS256 e ES256
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:
- Divida o token pelo
.para extrair o header, o payload e a assinatura. - Decodifique o header em base64url para ler o campo
alg. - Recalcule a assinatura a partir do header e do payload usando o algoritmo e a chave.
- Compare a assinatura recalculada com a assinatura do token.
- 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ê
algdo 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. Rejeitealg: "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.