Mensagem de erro
The specified key byte array is 96 bits which is not secure enough for any JWT HMAC-SHA algorithm.
Também aparece como
- io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 96 bits which is not secure enough for any JWT HMAC-SHA algorithm.
- io.jsonwebtoken.security.SignatureException: Unable to compute HS512 signature. Cause: The signing key's size is 256 bits which is not secure enough for the HS512 algorithm.
- io.jsonwebtoken.security.WeakKeyException: The signing key's size is 256 bits which is not secure enough for the HS512 algorithm.
A contagem de bits reflete sua chave. `Keys.hmacShaKeyFor` diz “…not secure enough for any JWT HMAC-SHA algorithm”. Assinar com um algoritmo explícito para o qual a chave é curta demais faz a mensagem citar o algoritmo: o JJWT 0.12+ encapsula o erro como “SignatureException: Unable to compute HS512 signature. Cause: The signing key's size is 256 bits…”, e o 0.11 o lança diretamente como `WeakKeyException`.
JJWT (Java) — io.jsonwebtoken.security.WeakKeyException from Keys.hmacShaKeyFor / signWith
O que significa
O JJWT se recusa a criar uma chave HMAC com menos bits que a saída do hash do algoritmo: no mínimo 256 bits (32 bytes) para HS256, 384 para HS384 e 512 para HS512. A RFC 7518 §3.2 torna isso obrigatório (MUST), porque um segredo compartilhado curto pode ser recuperado offline por força bruta a partir de qualquer token assinado com ele — e, a partir daí, qualquer pessoa consegue emitir tokens válidos. O número na mensagem é o tamanho dos bytes que você forneceu.
Por que acontece
Um segredo legível por humanos
comumValores como `secret`, `changeme` ou uma frase-senha curta de um tutorial ficam muito abaixo de 32 bytes. O tamanho deles também indica que nunca foram feitos para produção.
Atualização a partir do JJWT 0.9
comumO JJWT 0.9 aceitava chaves curtas passadas como strings. O 0.10+ impõe os tamanhos de chave da RFC 7518, então a mesma configuração falha depois da atualização.
Chave longa o bastante para HS256, mas não para HS512
ocasionalUma chave de 32 bytes atende ao HS256, mas não ao HS384/HS512. `signWith(key)` escolhe o algoritmo mais forte que a chave permite; especificar explicitamente um algoritmo mais forte falha.
Como corrigir
- 1.
Gerar um segredo aleatório do tamanho certo
Use um valor criptograficamente aleatório (64 bytes cobrem todas as variantes de HMAC) e guarde-o, codificado em base64, em um gerenciador de segredos.
bash # 64 random bytes, base64-encoded: enough for HS256, HS384 and HS512 openssl rand -base64 64 | tr -d '\n' - 2.
Decodificar o segredo armazenado para bytes
Crie a chave a partir dos bytes decodificados, e não do texto em base64, para que todos os serviços derivem a mesma chave.
java import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; javax.crypto.SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(System.getenv("JWT_SECRET_B64"))); String token = io.jsonwebtoken.Jwts.builder().subject("user-42").signWith(key).compact();