Mensaje de error
IDX10720: Unable to create KeyedHashAlgorithm for algorithm 'HS256', the key size must be greater than: '256' bits, key has '128' bits.
También se muestra como
- 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.
El algoritmo y los números de bits reflejan tu configuración; pese a «must be greater than», se acepta una clave del tamaño exacto requerido. Comprobado en varias versiones: la 6.8.0 y anteriores aceptaban claves HMAC de 128 bits; las 6.x posteriores (6.36.0) y las 7.x/8.x las rechazan con IDX10720 (la 6.x añade un enlace a «UnsafeRelaxHmacKeySizeValidation»). Las claves de menos de 128 bits fallan antes, con IDX10653 «The encryption algorithm 'HS256' requires a key size of at least '128' bits».
Microsoft.IdentityModel.Tokens (.NET) — ArgumentOutOfRangeException from SymmetricSignatureProvider
Qué significa
IdentityModel se niega a usar una clave HMAC más corta que la salida del hash del algoritmo: HS256 necesita al menos 256 bits (32 bytes), HS384 necesita 384 y HS512, 512, como exige el RFC 7518 §3.2. La clave del mensaje tiene 128 bits, es decir, 16 bytes: una longitud típica de un secreto escrito a mano en `appsettings.json`. Los secretos HMAC cortos pueden averiguarse por fuerza bruta sin conexión a partir de un solo token, lo que permitiría a cualquiera emitir tokens que tu API aceptaría.
Por qué ocurre
Un secreto corto en la configuración
frecuenteLos tutoriales usan valores como `MySecretKey12345` o `supersecret`. Sus bytes UTF-8 se quedan muy por debajo de 32.
Actualización de Microsoft.IdentityModel más allá de las primeras versiones 6.x
frecuenteLas versiones hasta al menos la 6.8.0 firmaban con claves HMAC de 128 bits; las 6.x, 7.x y 8.x actuales aplican el mínimo del RFC, así que una actualización (a menudo arrastrada por una actualización de ASP.NET Core) rompe las aplicaciones con secretos cortos.
HS512 con una clave dimensionada para HS256
ocasionalUna clave de 32 bytes basta para HS256, pero no para HS512, que necesita 64 bytes.
Cómo solucionarlo
- 1.
Generar una clave aleatoria del tamaño adecuado
Usa un valor criptográficamente aleatorio, guardado en los secretos de usuario o en un almacén de secretos, y que nunca se suba al control de código fuente.
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.
Decodificar el secreto a bytes
Construye la clave a partir de los bytes decodificados para que se aproveche toda la entropía y todos los servicios obtengan la misma clave.
csharp var keyBytes = Convert.FromBase64String(builder.Configuration["Jwt:KeyBase64"]!); var signingKey = new SymmetricSecurityKey(keyBytes); // 64 bytes