Aller au contenu
ecdsa.com
JJWT (Java)Java

Message d’erreur

The specified key byte array is 96 bits which is not secure enough for any JWT HMAC-SHA algorithm.

Également affiché sous la forme

  • 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.

Le nombre de bits correspond à votre clé. `Keys.hmacShaKeyFor` indique « …not secure enough for any JWT HMAC-SHA algorithm ». Si vous signez en indiquant explicitement un algorithme pour lequel la clé est trop courte, le message nomme l’algorithme : JJWT 0.12+ enveloppe l’exception sous la forme « SignatureException: Unable to compute HS512 signature. Cause: The signing key's size is 256 bits… », tandis que 0.11 la lève directement en tant que `WeakKeyException`.

JJWT (Java) — io.jsonwebtoken.security.WeakKeyException from Keys.hmacShaKeyFor / signWith

Ce que cela signifie

JJWT refuse de construire une clé HMAC comptant moins de bits que le condensat produit par l’algorithme : au moins 256 bits (32 octets) pour HS256, 384 pour HS384, 512 pour HS512. La RFC 7518 §3.2 en fait une exigence absolue (MUST), car un secret partagé trop court peut être retrouvé hors ligne par recherche exhaustive à partir de n’importe quel jeton signé avec lui – après quoi n’importe qui peut fabriquer des jetons valides. Le nombre indiqué dans le message correspond à la taille des octets que vous avez fournis.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Générer un secret aléatoire de la bonne taille

    Utilisez une valeur aléatoire de qualité cryptographique (64 octets couvrent toutes les variantes HMAC) et stockez-la dans un gestionnaire de secrets, encodée en base64.

    bash
    # 64 random bytes, base64-encoded: enough for HS256, HS384 and HS512
    openssl rand -base64 64 | tr -d '\n'
  2. 2.

    Décoder le secret stocké en octets

    Créez la clé à partir des octets décodés, et non à partir du texte base64, afin que chaque service dérive la même clé.

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

Erreurs associées

Parcourir toute la base de données des erreurs de signature