Verificador de assinatura JWT HS256 | Confirme a assinatura de um token com seu segredo
Recalcule o HMAC-SHA-256 de header.payload com seu segredo compartilhado e compare o resultado com a terceira parte do token. A verificação de assinatura mostra um de três estados — válida, divergente ou um alg diferente de HS256 — enquanto o cabeçalho e a carga útil são decodificados e exibidos como JSON formatado.
💡 Sobre esta ferramenta
A parte difícil de depurar um JWT não é lê-lo, e sim saber se a assinatura realmente confere. Um decodificador abre os segmentos base64url e mostra os dados, mas uma carga útil decodificada não diz nada sobre a assinatura estar correta: isso exige recalculá-la com o segredo.
Esta ferramenta pega a parte header.payload, executa HMAC-SHA-256 sobre ela com o segredo que você informar, codifica o MAC em base64url e o compara como string com a assinatura no fim do token. Se baterem, mostra válida; qualquer diferença mostra divergente; e um cabeçalho cujo alg não seja HS256 é rejeitado como alg não suportado. Mude um caractere do segredo ou altere a carga útil e o veredito vira, o que facilita isolar qual valor está quebrando a assinatura.
O escopo é apenas HS256 (a família HMAC). RS256 e ES256 são esquemas de chave pública e curva elíptica verificados com um par de chaves em vez de um segredo compartilhado, então ficam de fora desta ferramenta; quando o alg é um desses, você recebe o estado de alg não suportado em vez de um resultado enganoso.
🧐 Perguntas frequentes
P. Qual a diferença para um decodificador? Um decodificador faz a decodificação base64url do cabeçalho e da carga útil e os exibe. Ele nunca recalcula a assinatura. Esta ferramenta executa o HMAC e informa se a assinatura confere.
P. Por que meu token sai como divergente?
Quase sempre por segredo trocado, carga útil editada, uma cópia truncada que perdeu os caracteres finais ou um . fora de lugar entre os segmentos. Desfaça uma alteração de cada vez para achar a causa.
P. Qual o formato do segredo? Informe o segredo compartilhado HS256 como a mesma string UTF-8 usada por quem assina. Se sua stack guarda a chave em base64, cole a string exata que o emissor passa como chave em vez de recodificá-la.
P. Ele verifica a expiração (exp)?
Não: ele só verifica a igualdade da assinatura. A validação de claims como exp e nbf está fora do escopo, então leia-as você mesmo no JSON da carga útil decodificada.
P. E um token com alg igual a none?
Qualquer alg diferente de HS256, incluindo none, retorna alg não suportado. Aceitar none é uma vulnerabilidade conhecida, então os verificadores deveriam recusá-lo de imediato.
📚 Curiosidades
O "HS" de HS256 significa HMAC using SHA-256, e a especificação de algoritmos JWA (RFC 7518, §3.1) o define como o único algoritmo de implementação obrigatória — toda biblioteca JWT em conformidade precisa suportá-lo. Um mesmo segredo compartilhado assina e verifica, o que explica sua popularidade em serviços pequenos, mas significa que emissor e verificador têm a mesma chave: se vazar, qualquer um cria tokens válidos. Um detalhe que costuma passar batido é que a assinatura é calculada sobre o signing input — o cabeçalho e a carga útil unidos por um . —, de modo que o terceiro segmento é um MAC derivado dessa string, e não a carga útil em si.
O JWT e o segredo que você cola permanecem no seu navegador e nunca são enviados a um servidor; o HMAC roda localmente pela API Web Crypto padrão.