Zum Inhalt springen
ecdsa.com
JJWT (Java)Java

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

So behebst du den Fehler

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen