Assinatura da Web JSON (JWS) A decodificação é o processo de análise e verificação dos componentes de um token JWS - cabeçalho, carga útil e assinatura - para extrair os dados assinados e verificar sua integridade. Em contextos de segurança e testes de penetração, a decodificação de um JWS ajuda os analistas a entender quais reivindicações estão incorporadas, detectar configurações incorretas e identificar práticas de assinatura fracas que podem levar a vulnerabilidades, como desvio de assinatura ou falsificação de token.
Este artigo explica Por que a decodificação do JWS é importanteComo decodificar e verificar assinaturas usando código real, armadilhas comuns, implicações de segurança e estratégias de defesa que você deve conhecer em 2025.
O que é JSON Web Signature (JWS)?
Assinatura da Web JSON (JWS) é um meio compacto e seguro de URL para representar uma mensagem assinada. Ele é definido em RFC 7515 e comumente usado para garantir a autenticidade e a integridade dos dados transferidos por APIs REST, logon único (SSO) e fluxos de autenticação de microsserviços.
Um token JWS típico tem a seguinte aparência:
nginx
eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSJ9 . MEUCIQDh...
Cada segmento é Base64URL codificado:
- Cabeçalho - descreve o algoritmo e o tipo de token
- Carga útil (reclamações) - os dados assinados
- Assinatura - prova de integridade
A decodificação de um JWS sem verificar a assinatura revela reivindicações, mas somente a verificação prova que elas vieram de uma fonte confiável.
Padrão de autoridade: RFC 7515 - https://tools.ietf.org/html/rfc7515

Por que decodificar um JWS? Perspectivas de segurança e teste
A decodificação de um JWS tem várias finalidades:
- Entenda as reivindicações incorporadas: Quem é o usuário? O que são permissões?
- Identificar o algoritmo de assinatura: Algoritmos fracos (por exemplo,
nenhumouHS256com chaves previsíveis) - Avaliar a integridade: Detectar tokens adulterados
- Descobrir vulnerabilidades: Ataques de desvio de assinatura e downgrade de algoritmo
Do ponto de vista da segurança ofensiva, a descoberta de práticas fracas de assinatura do JWS pode levar a explorações em que os invasores forjam tokens e aumentam os privilégios.
Anatomia de um token JWS
Aqui está um detalhamento de um token típico:
| Segmento | Significado | Exemplo |
|---|---|---|
| Cabeçalho | Algoritmo e metadados | { "alg": "RS256", "typ": "JWT" } |
| Carga útil | Reclamações | { "sub": "12345", "role": "admin" } |
| Assinatura | Resumo assinado | Base64URL do cabeçalho criptografado + carga de pagamento |
Um JWS decodificado mostra JSON simples para cabeçalho e carga útil:
ini
HeaderJSON = base64url_decode(part1)PayloadJSON = base64url_decode(part2)
A decodificação não prova a autenticidade, apenas a verificação da assinatura.
Decodificação simples do JWS (sem verificação)
Na triagem de segurança, muitas vezes a primeira etapa é ver o que está dentro:
Exemplo de Python (somente decodificação)
python
import base64import json def base64url_decode(input_str): rem = len(input_str) % 4 input_str += "=" * (4 - rem)return base64.urlsafe_b64decode(input_str) token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.SflKxw... "header, payload, signature = token.split('.') header_json = json.loads(base64url_decode(header)) payload_json = json.loads(base64url_decode(payload)) print("Header:", header_json)print("Payload:", payload_json)
Isso gera um JSON legível, mas não valida se a assinatura está correta.
Verificação de uma assinatura JWS (crítica para a segurança)
Para ter certeza de que o token é legítimo, você deve verificar a assinatura usando o algoritmo e a chave esperados. Veja como:
Exemplo de uso de JavaScript (Node.js) jose
javaScript
import { jwtVerify } from "jose"; const token = "eyJ..."; const publicKey = /* carregar a chave pública apropriada, por exemplo, do endpoint JWKS */; async function verifyToken() {try {const { payload } = await jwtVerify(token, publicKey);console.log("Verified payload:", payload); } catch (e) {console.error("Verification failed:", e); } } verifyToken();
Isso garante que o token foi assinado pela chave privada correta correspondente à chave pública.
Exemplo do mundo real: Decodificação de um token OAuth
Muitas APIs emitem tokens JWS para controle de acesso. A decodificação revela informações do usuário e da sessão:
json
{ "iss": "", "sub": "alice", "exp": 1700000000, "scope": "read write" }
As equipes de segurança analisam os tokens decodificados para auditar escopos e tempos de expiração.
Vulnerabilidades comuns nas implementações do JWS
Downgrade de algoritmo
Algumas bibliotecas permitem incorretamente a alteração de alg para nenhumpermitindo que os invasores contornem a verificação.
Exemplo de cabeçalho inseguro:
json
{"alg":"none","typ":"JWT"}
Defesa de ataque: Sempre rejeite tokens com alg: nenhum a menos que explicitamente seguro no contexto.
Chaves simétricas fracas (HS256)
O uso de chaves simétricas fracas ou previsíveis permite que os invasores adivinhem a chave e forjem tokens.
Mitigação:
- Use chaves secretas fortes (≥ 256 bits)
- Prefira algoritmos assimétricos (
RS256,ES256)
Ferramentas CLI para decodificação rápida de JWS
| Ferramenta | Descrição | Oficial |
|---|---|---|
| jwt.io Depurador | Decodificação e verificação baseadas na Web | https://jwt.io |
| jose CLI | Decodificação/verificação baseada em nó | https://github.com/panva/jose |
| jwt-cli | CLI multiplataforma | https://github.com/mike-engel/jwt-cli |
Exemplo de decodificação da CLI:
bash
jwt decode eyJhbGciOi...
Cenário de vulnerabilidade: Falsificação de um token (prova de conceito)
Se um servidor aceitar incorretamente alg: nenhumum invasor pode forjar:
css
Cabeçalho: {"alg":"none","typ":"JWT"} Carga útil: {"sub":"attacker","role":"admin"} Assinatura: ""
Script de prova de conceito (Python):
python
import base64import json def b64url(x): return base64.urlsafe_b64encode(x).rstrip(b'=').decode() header = {"alg": "none", "typ": "JWT"} payload = {"sub": "attacker", "role": "admin"} token = f"{b64url(json.dumps(header).encode())}.{b64url(json.dumps(payload).encode())}. "print("Forged token:", token)
Defesa:
- Rejeitar tokens onde
algénenhuma menos que seja explicitamente seguro - Aplicar lista branca de algoritmos

Por que a verificação de assinaturas é importante em 2025
Nos microsserviços modernos e nas APIs distribuídas, os tokens orientam as decisões de acesso. Uma verificação inadequada pode levar a:
- Aumento de privilégios
- Acesso não autorizado
- Sequestro de sessão
Os testadores de penetração e os defensores devem ser capazes de decodificar e validar tokens de forma programática e em escala.
Detecção de verificação interrompida em APIs
Os scanners automatizados podem verificar se uma API tenta aceitar assinaturas JWS inválidas.
Pseudocódigo Python (verificação de segurança)
python
def test_broken_verification(api_url, forged_token): headers = {"Authorization": f "Bearer {forged_token}"} response = requests.get(api_url, headers=headers)return response.status_code bad_api = test_broken_verification("", forged_token)if bad_api == 200:print("Potencialmente vulnerável à falsificação do JWS")
Se a API responder com 200 OKSe o token for aceito, a lógica de aceitação do token pode ser falha.
Práticas recomendadas defensivas
| Defesa | Descrição |
|---|---|
| Use chaves assimétricas | Prefira RS256, ES256 em vez de chaves simétricas |
| Aplicar a lista branca de algoritmos | Rejeitar valores alg inesperados |
| Vida útil curta do token | Minimizar o risco de repetição |
| Rotação de teclas | Atualize as chaves de assinatura regularmente |
| Bibliotecas de tokens de auditoria | Mantenha as dependências atualizadas |
Integração da decodificação de tokens à segurança de CI/CD
Em 2025, os pipelines de segurança geralmente validam automaticamente as práticas de JWS:
- Linting automatizado de configurações de JWT
- Teste de CI que rejeita bibliotecas inseguras
- Monitoramento de tempo de execução para aceitação de token incorreto
Exemplo de snippet de script de CI (Bash):
bash
#Rejeite se algum código usar "alg: none "grep -R '"alg": *"none"' ./src && exit 1
Conceitos relacionados: JWE vs JWS
| Prazo | Significado |
|---|---|
| JWS | Assinatura da Web JSON (somente assinada) |
| JWE | Criptografia da Web JSON (criptografada) |
O JWE protege a confidencialidade; o JWS protege a integridade e a autenticidade. Muitos sistemas usam os dois juntos.
Ferramentas e bibliotecas (pilha de segurança 2025)
- Node.js
jose- Decodificação e verificação de JWT/JWS - Python
python-jose- Suporte flexível à criptografia - OpenSSL - Verificação de criptografia de baixo nível
- jwt.io - Decodificador rápido da Web

