Fehlermeldung
The specified key byte array is 96 bits which is not secure enough for any JWT HMAC-SHA algorithm.
Auch ausgegeben als
- 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.
Die Bitzahl spiegelt deinen Schlüssel wider. `Keys.hmacShaKeyFor` meldet „…not secure enough for any JWT HMAC-SHA algorithm“. Signierst du mit einem explizit angegebenen Algorithmus, für den der Schlüssel zu kurz ist, nennt die Meldung den Algorithmus: JJWT 0.12+ verpackt sie als „SignatureException: Unable to compute HS512 signature. Cause: The signing key's size is 256 bits…“, 0.11 wirft sie direkt als `WeakKeyException`.
JJWT (Java) — io.jsonwebtoken.security.WeakKeyException from Keys.hmacShaKeyFor / signWith
Was der Fehler bedeutet
JJWT weigert sich, einen HMAC-Schlüssel aus weniger Bits zu bauen, als die Hash-Ausgabe des Algorithmus hat: mindestens 256 Bit (32 Byte) für HS256, 384 für HS384, 512 für HS512. RFC 7518 §3.2 schreibt das als MUST vor, weil sich ein kurzes gemeinsames Geheimnis aus jedem damit signierten Token offline per Brute Force ermitteln lässt – danach kann jeder gültige Tokens erzeugen. Die Zahl in der Meldung ist die Größe der Bytes, die du übergeben hast.
Warum der Fehler auftritt
Ein für Menschen lesbares Secret
häufigWerte wie `secret`, `changeme` oder eine kurze Passphrase aus einem Tutorial liegen weit unter 32 Byte. Die Länge dieser Werte ist außerdem ein Hinweis darauf, dass sie nie für die Produktion gedacht waren.
Upgrade von JJWT 0.9
häufigJJWT 0.9 akzeptierte kurze Schlüssel, die als Strings übergeben wurden. 0.10+ erzwingt die Schlüssellängen aus RFC 7518, deshalb scheitert dieselbe Konfiguration nach einem Upgrade.
Schlüssel lang genug für HS256, aber nicht für HS512
gelegentlichEin 32-Byte-Schlüssel genügt für HS256, aber nicht für HS384/HS512. `signWith(key)` wählt den stärksten Algorithmus, den der Schlüssel zulässt; gibst du explizit einen stärkeren an, scheitert das.
So behebst du den Fehler
- 1.
Zufälliges Secret in der richtigen Länge generieren
Verwende einen kryptografisch zufälligen Wert (64 Byte reichen für alle HMAC-Varianten) und speichere ihn base64-kodiert in einem Secrets-Manager.
bash # 64 random bytes, base64-encoded: enough for HS256, HS384 and HS512 openssl rand -base64 64 | tr -d '\n' - 2.
Gespeichertes Secret in Bytes dekodieren
Erzeuge den Schlüssel aus den dekodierten Bytes, nicht aus dem base64-Text, damit jeder Dienst denselben Schlüssel ableitet.
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();