Saltar al contenido
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

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

Cómo solucionarlo

  1. 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. 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

Errores relacionados

Explorar toda la base de datos de errores de firma