Mensaje de error
The specified key byte array is 96 bits which is not secure enough for any JWT HMAC-SHA algorithm.
También se muestra 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.
El número de bits refleja tu clave. `Keys.hmacShaKeyFor` dice «…not secure enough for any JWT HMAC-SHA algorithm». Si firmas con un algoritmo explícito para el que la clave es demasiado corta, el mensaje nombra el algoritmo: JJWT 0.12+ lo envuelve como «SignatureException: Unable to compute HS512 signature. Cause: The signing key's size is 256 bits…», y la 0.11 lo lanza directamente como `WeakKeyException`.
JJWT (Java) — io.jsonwebtoken.security.WeakKeyException from Keys.hmacShaKeyFor / signWith
Qué significa
JJWT se niega a construir una clave HMAC con menos bits que la salida del hash del algoritmo: al menos 256 bits (32 bytes) para HS256, 384 para HS384 y 512 para HS512. El RFC 7518 §3.2 lo establece como requisito obligatorio (MUST), porque un secreto compartido corto se puede recuperar offline por fuerza bruta a partir de cualquier token firmado con él, y a partir de ahí cualquiera puede emitir tokens válidos. El número del mensaje es el tamaño de los bytes proporcionados.
Por qué ocurre
Un secreto legible para personas
frecuenteValores como `secret`, `changeme` o una frase de contraseña corta de un tutorial quedan muy por debajo de 32 bytes. Su longitud también indica que nunca se pensaron para producción.
Actualización desde JJWT 0.9
frecuenteJJWT 0.9 aceptaba claves cortas pasadas como cadenas. La 0.10+ impone los tamaños de clave del RFC 7518, así que la misma configuración falla tras actualizar.
Clave lo bastante larga para HS256, pero no para HS512
ocasionalUna clave de 32 bytes cumple con HS256, pero no con HS384/HS512. `signWith(key)` elige el algoritmo más fuerte que permite la clave; indicar explícitamente uno más fuerte falla.
Cómo solucionarlo
- 1.
Generar un secreto aleatorio del tamaño adecuado
Usa un valor criptográficamente aleatorio (64 bytes cubren todas las variantes de HMAC) y guárdalo codificado en base64 en un gestor de secretos.
bash # 64 random bytes, base64-encoded: enough for HS256, HS384 and HS512 openssl rand -base64 64 | tr -d '\n' - 2.
Decodificar a bytes el secreto guardado
Crea la clave a partir de los bytes decodificados, no del texto base64, para que todos los servicios obtengan la misma clave.
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();