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
Ein kurzes Secret in der Konfiguration
häufigTutorials verwenden Werte wie `MySecretKey12345` oder `supersecret`. Als UTF-8 ergeben sie weit weniger als 32 Byte.
Upgrade von Microsoft.IdentityModel über frühe 6.x-Versionen hinaus
häufigReleases bis mindestens 6.8.0 signierten mit 128-Bit-HMAC-Schlüsseln; aktuelle 6.x-, 7.x- und 8.x-Versionen erzwingen das Minimum aus dem RFC, deshalb lässt ein Upgrade (oft durch ein Upgrade von ASP.NET Core mitgezogen) Anwendungen mit kurzen Secrets scheitern.
HS512 mit einem Schlüssel in HS256-Größe
gelegentlichEin 32-Byte-Schlüssel reicht für HS256, aber nicht für HS512, das 64 Byte braucht.
So behebst du den Fehler
- 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.
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