Pular para o conteúdo
ecdsa.com
Microsoft.IdentityModel.Tokens (.NET).NET

Mensagem de erro

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

Também aparece 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.

O algoritmo e as contagens de bits refletem sua configuração; apesar de “must be greater than”, uma chave com exatamente o tamanho exigido é aceita. Verificado em várias versões: a 6.8.0 e anteriores aceitavam chaves HMAC de 128 bits; as 6.x posteriores (6.36.0) e as 7.x/8.x as rejeitam com IDX10720 (a 6.x inclui um link para “UnsafeRelaxHmacKeySizeValidation”). Chaves com menos de 128 bits falham antes, com IDX10653 “The encryption algorithm 'HS256' requires a key size of at least '128' bits”.

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

O que significa

O IdentityModel se recusa a usar uma chave HMAC mais curta que a saída do hash do algoritmo: o HS256 exige pelo menos 256 bits (32 bytes); o HS384, 384; e o HS512, 512 — como exige a RFC 7518 §3.2. A chave da mensagem tem 128 bits — 16 bytes, um tamanho típico de segredo digitado à mão no `appsettings.json`. Segredos HMAC curtos podem ser quebrados por força bruta offline a partir de um único token, o que permitiria a qualquer pessoa emitir tokens que sua API aceita.

Por que acontece

Como corrigir

  1. 1.

    Gerar uma chave aleatória do tamanho certo

    Use um valor criptograficamente aleatório, guardado nos segredos do usuário (user secrets) ou em um cofre e nunca incluído no controle de versão.

    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 o segredo para bytes

    Monte a chave a partir dos bytes decodificados, para que toda a entropia seja aproveitada e todos os serviços derivem a mesma chave.

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

Erros relacionados

Ver toda a base de erros de assinatura