1001Ferramentas
🔑Geradores

Gerador de Chave Secreta JWT HS256

Gera uma chave secreta forte (256 bits) em Base64 ou Hex, pronta para usar como segredo HMAC-SHA256 em JWT.


  

Como gerar um secret JWT do jeito certo

Um JSON Web Token (RFC 7519, 2015) é um container compacto e URL-safe formado por três segmentos codificados em Base64url — header.payload.signature — separados por ponto. A assinatura é o que torna o token infalsificável; tudo antes do segundo ponto é JSON em texto claro, legível por qualquer um. O algoritmo de assinatura é declarado no campo alg do header e se divide em três famílias: HMAC (HS256, HS384, HS512 — simétrico, secret compartilhado), RSA (RS256, RS384, RS512 — par de chaves assimétrico, PKCS#1 v1.5) e as variantes de curva elíptica ECDSA (ES256/384/512) e EdDSA (Ed25519). HS256 é de longe o mais comum porque é o mais rápido, o mais simples e suficiente quando emissor e verificador são o mesmo serviço.

Para HMAC, a RFC 7518 §3.2 exige que o secret seja no mínimo do tamanho da saída do hash: 256 bits (32 bytes) para HS256, 384 para HS384, 512 para HS512. Qualquer coisa menor é trivialmente atacável offline: ferramentas como hashcat -m 16500 testam milhões de candidatos por segundo em uma GPU. Gere o secret com CSPRNG — crypto.randomBytes(32).toString('base64') no Node, secrets.token_urlsafe(32) no Python, openssl rand -base64 32 no shell.

Erros frequentes

  • Usar uma senha humana como secret. "supersecret123" tem algumas dezenas de bits de entropia; ataque de dicionário termina antes do almoço.
  • Regerar o secret a cada deploy. Todos os tokens existentes são invalidados instantaneamente e o usuário precisa fazer login de novo — quase nunca o comportamento desejado.
  • Embarcar o secret no frontend. Se o cliente precisa verificar tokens, mude para RS256/ES256 e distribua apenas a chave pública. Secret HMAC pertence ao servidor.
  • Confiar em decode() sem verify(). Categoria famosa de bug no jsonwebtoken e similares: jwt.decode não confere assinatura; só jwt.verify faz isso.

Ataques históricos que vale conhecer

Três vulnerabilidades clássicas ainda aparecem em auditorias. O ataque alg=none: o atacante forja um token com header {"alg":"none"} e assinatura vazia; uma biblioteca mal configurada aceita. O key confusion: o servidor espera RS256 (chave pública); o atacante troca o header para HS256 e assina o token usando a chave pública como secret HMAC — a mesma biblioteca valida porque só pega os bytes da chave configurada e roda HMAC. A injeção de jku / x5u: o header aponta para uma URL controlada pelo atacante que devolve a chave pública dele. Mitigação em todos os casos: fixar uma whitelist de algoritmos no verify ({ algorithms: ['HS256'] }), nunca confiar em URLs vindas do header e nunca compartilhar chaves entre algoritmos.

Rotação e revogação

Para rotação suave, sirva múltiplas chaves via JWKS (/.well-known/jwks.json) com um kid (key id) por entrada; assine com o kid mais novo mas aceite tokens assinados com qualquer chave ainda não expirada. Revogação é o ponto fraco famoso: JWTs não têm revogação nativa. Padrões práticos: deny-list server-side de valores de jti até o vencimento, access tokens de curta duração (5–15 min) com refresh tokens mais longos, ou rotação da chave de assinatura para invalidar tudo em lote.

Perguntas frequentes

HS256 ou RS256? HS256 quando o mesmo serviço assina e verifica (backend único, microsserviço interno com infra compartilhada). RS256 quando um lado assina e vários verificam, quando você não quer que o verificador seja capaz de cunhar tokens ou quando a chave pública precisa ser exposta.

JWT expira? Só quando você define o claim exp. O verificador precisa conferir exp (e idealmente nbf e iat) em toda requisição — exp ausente ou não conferido significa token eterno.

Dá para revogar um JWT? Não nativamente. É preciso deny-list, TTLs curtos com refresh token ou rotação de chave.

Qual biblioteca usar? No Node, jose é a escolha moderna; jsonwebtoken funciona mas teve vários CVEs ligados a tratamento de algoritmo. No Python, PyJWT com lista explícita em algorithms=; no Java, JJWT.

A chave gerada aqui é enviada para algum lugar? Não. A geração roda no seu navegador via crypto.getRandomValues() e os bytes não saem da página.

Ferramentas Relacionadas