Zum Inhalt springen
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

Fehlermeldung

IDX10720: Unable to create KeyedHashAlgorithm for algorithm 'HS256', the key size must be greater than: '256' bits, key has '128' bits.

Auch ausgegeben als

  • System.ArgumentOutOfRangeException: IDX10720: Unable to create KeyedHashAlgorithm for algorithm 'HS256', the key size must be greater than: '256' bits, key has '128' bits. (Parameter 'keyBytes')
  • IDX10653: The encryption algorithm 'HS256' requires a key size of at least '128' bits.

Algorithmus und Bitzahlen spiegeln deine Konfiguration wider; trotz „must be greater than“ wird ein Schlüssel mit genau der verlangten Größe akzeptiert. Über Versionen hinweg geprüft: 6.8.0 und älter akzeptierten 128-Bit-HMAC-Schlüssel; spätere 6.x (6.36.0) sowie 7.x/8.x lehnen sie mit IDX10720 ab (6.x ergänzt einen Link zu „UnsafeRelaxHmacKeySizeValidation“). Schlüssel unter 128 Bit scheitern schon vorher mit IDX10653 „The encryption algorithm 'HS256' requires a key size of at least '128' bits“.

Microsoft.IdentityModel.Tokens (.NET) — ArgumentOutOfRangeException from SymmetricSignatureProvider

Was der Fehler bedeutet

IdentityModel weigert sich, einen HMAC-Schlüssel zu verwenden, der kürzer ist als die Hash-Ausgabe des Algorithmus: HS256 braucht mindestens 256 Bit (32 Byte), HS384 384 und HS512 512, wie es RFC 7518 §3.2 verlangt. Der Schlüssel in der Meldung hat 128 Bit – 16 Byte, eine typische Länge für ein von Hand eingetipptes Secret in `appsettings.json`. Kurze HMAC-Secrets lassen sich anhand eines einzigen Tokens offline per Brute Force ermitteln, und dann könnte jeder Tokens erzeugen, die deine API akzeptiert.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Zufälligen Schlüssel in der richtigen Länge generieren

    Verwende einen kryptografisch zufälligen Wert, gespeichert in User Secrets oder einem Vault und niemals in die Versionsverwaltung eingecheckt.

    bash
    # 64 random bytes, base64: valid for HS256, HS384 and HS512
    openssl rand -base64 64 | tr -d '\n'
    dotnet user-secrets set "Jwt:KeyBase64" "<the value above>"   # development; use a vault in production
  2. 2.

    In Bytes dekodieren

    Baue den Schlüssel aus den dekodierten Bytes, damit die volle Entropie genutzt wird und jeder Dienst denselben Schlüssel ableitet.

    csharp
    var keyBytes = Convert.FromBase64String(builder.Configuration["Jwt:KeyBase64"]!);
    var signingKey = new SymmetricSecurityKey(keyBytes); // 64 bytes

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen