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
Um segredo curto na configuração
comumTutoriais usam valores como `MySecretKey12345` ou `supersecret`. Os bytes UTF-8 deles ficam muito abaixo de 32.
Atualização do Microsoft.IdentityModel para além das primeiras versões 6.x
comumVersões até pelo menos a 6.8.0 assinavam com chaves HMAC de 128 bits; as 6.x atuais, a 7.x e a 8.x impõem o mínimo da RFC, por isso uma atualização (muitas vezes trazida por uma atualização do ASP.NET Core) quebra aplicações com segredos curtos.
HS512 com uma chave dimensionada para HS256
ocasionalUma chave de 32 bytes basta para o HS256, mas não para o HS512, que exige 64 bytes.
Como corrigir
- 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.
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