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
Un secret lisible par un humain
fréquenteDes valeurs comme `secret`, `changeme` ou une courte phrase de passe tirée d’un tutoriel sont bien en dessous de 32 octets. Leur longueur indique aussi qu’elles n’ont jamais été destinées à la production.
Mise à niveau depuis JJWT 0.9
fréquenteJJWT 0.9 acceptait les clés courtes passées sous forme de chaînes. Les versions 0.10+ imposent les tailles de clé de la RFC 7518 : la même configuration échoue donc après une mise à niveau.
Clé assez longue pour HS256, mais pas pour HS512
occasionnelleUne clé de 32 octets suffit pour HS256, mais pas pour HS384/HS512. `signWith(key)` choisit l’algorithme le plus fort que la clé autorise ; si vous en indiquez explicitement un plus fort, l’appel échoue.
Comment corriger l’erreur
- 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.
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();