Saltar al contenido
ecdsa.com
JJWT (Java)Java

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

Cómo solucionarlo

  1. 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. 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();

Errores relacionados

Explorar toda la base de datos de errores de firma