Utilia

Gerador e verificador de JWT

Cria e verifica JSON Web Tokens com HS256, RS256, PS256, ES256 ou EdDSA. Edita as claims, define exp e iat e verifica assinaturas no teu navegador.

As chaves e os tokens são segredos. Tudo é assinado e verificado localmente com a API Web Crypto do teu navegador: nada é enviado.

Criar um JWT assinado

Claims de tempo:

Verificar um JWT

Como criar um JWT assinado

  1. Escolhe o Algoritmo: HS256/384/512 (segredo partilhado), RS256/384/512 ou PS256/384/512 (RSA), ES256/384/512 (ECDSA nas curvas P-256, P-384 ou P-521) ou EdDSA (Ed25519, se o teu navegador o suportar).
  2. Edita o Cabeçalho (JSON) e o Payload (claims JSON). O campo alg acompanha sempre o algoritmo escolhido e typ vale JWT por omissão.
  3. Usa os botões das claims de tempo para acrescentar datas: iat = agora, nbf = agora, ou escolhe um prazo como «daqui a 1 hora» e clica em Definir exp. Os valores são NumericDates: segundos desde 1 de janeiro de 1970 UTC.
  4. Introduz o Segredo (algoritmos HS, como texto ou Base64/Base64url em Formato do segredo) ou a Chave privada (PEM ou JWK). Ainda não tens chave? Clica em Gerar chave de teste.
  5. Clica em Assinar token e depois em Copiar, ou em Verificar este token para o testar logo a seguir.

Como verificar um JWT

  1. Cola o token em Token a verificar.
  2. Escolhe o Algoritmo esperado. Se deixares «Do cabeçalho do token», é aceite o que o cabeçalho disser, exceto none; se escolheres um algoritmo concreto, a ferramenta recusa qualquer token assinado de outra forma, como faria um servidor bem configurado.
  3. Introduz o segredo ou a Chave pública (PEM ou JWK): um bloco PEM PUBLIC KEY, RSA PUBLIC KEY ou CERTIFICATE, um JWK ou um JWK Set (é usada a chave cujo kid coincide com o do cabeçalho).
  4. Se quiseres, define uma Tolerância de relógio (segundos) para aceitar pequenas diferenças entre relógios e clica em Verificar token.

O resultado indica se a assinatura é válida e depois compara exp (expiração) e nbf (não antes de) com a hora atual do teu computador. Um token com assinatura correta mas com expiração no passado é apresentado como expirado, não como válido.

Chaves e formatos

Para assinar, a ferramenta aceita blocos PKCS#8 PRIVATE KEY, PKCS#1 RSA PRIVATE KEY e SEC1 EC PRIVATE KEY (convertidos internamente para PKCS#8), bem como JWK privados. As chaves protegidas por palavra-passe têm de ser exportadas primeiro sem palavra-passe. Gerar chave de teste cria um segredo aleatório do tamanho do hash para os algoritmos HS, um par de chaves RSA de 2048 bits para RS e PS, a curva correspondente para ES ou um par Ed25519. Recebes as chaves em PEM e JWK, e elas são preenchidas dos dois lados para que possas assinar e verificar de imediato.

As assinaturas seguem o RFC 7515 e o RFC 7518: o RSA-PSS usa um salt do comprimento do hash e as assinaturas ECDSA são a concatenação bruta r||s. A implementação reproduz o exemplo HS256 do RFC 7515, anexo A.1.

Notas de segurança

  • Tudo corre no teu navegador com a API Web Crypto. Nem os tokens nem as chaves são enviados para lado nenhum, mas prefere mesmo assim chaves de teste a segredos de produção.
  • alg: none nunca é assinado nem aceite.
  • Os segredos HMAC devem ter pelo menos o comprimento do hash (32 bytes para HS256). Um segredo mais curto gera um aviso.
  • Uma assinatura prova a integridade e a origem, não que as claims sejam adequadas: os servidores têm ainda de verificar iss, aud e os scopes.

Perguntas frequentes

Qual é a diferença entre HS256 e RS256?

O HS256 usa um único segredo partilhado para assinar e verificar, por isso qualquer verificador também poderia forjar tokens. O RS256 (e também PS256, ES256 e EdDSA) assina com uma chave privada e verifica com uma chave pública que pode ser publicada sem risco.

Porque é que uma assinatura válida ainda mostra um erro?

Porque o token está fora do período de validade: exp está no passado ou nbf está no futuro. A verificação da assinatura e a verificação do tempo são apresentadas em separado.

Porque é que alg «none» é recusado?

Qualquer pessoa pode criar um token sem assinatura. Aceitá-lo foi uma vulnerabilidade clássica das bibliotecas JWT, por isso esta ferramenta rejeita-o tanto ao assinar como ao verificar.

Posso usar a minha própria chave RSA ou EC?

Sim. Cola a chave privada em PEM ou JWK para assinar e a chave pública para verificar. A ferramenta confirma que o tipo de chave e a curva correspondem ao algoritmo escolhido.

Porque é que o EdDSA está desativado?

O teu navegador ainda não suporta Ed25519 na Web Crypto. As versões recentes do Chrome, Edge, Firefox e Safari já o suportam.