IDX10632:SymmetricSecurityKey.GetKeyedHashAlgorithm('HS512') 在使用 HS512 ALGO 验证 JWT 时抛出异常
IDX10632: SymmetricSecurityKey.GetKeyedHashAlgorithm( 'HS512' ) threw an exception when validating JWT using HS512 ALGO
我正在使用 NuGet 包 System.IdentityModel.Tokens.Jwt 版本 4.0.4.403061554。
我有一个验证 JWT 的实现,它适用于算法 HS256。
但是,如果我将我的 JWT 更改为使用算法 HS512 生成,那么我会在验证期间收到错误消息。
System.IdentityModel.SignatureVerificationFailedException
HResult=0x80131501
Message=IDX10503: Signature validation failed. Keys tried: 'System.IdentityModel.Tokens.InMemorySymmetricSecurityKey
'.
Exceptions caught:
'System.InvalidOperationException: IDX10632: SymmetricSecurityKey.GetKeyedHashAlgorithm( 'HS512' ) threw an exception.
SymmetricSecurityKey: 'System.IdentityModel.Tokens.InMemorySymmetricSecurityKey'
SignatureAlgorithm: 'HS512', check to make sure the SignatureAlgorithm is supported.
我试过生成 512 位密钥,我也尝试过更小的密钥,如 256 位密钥(与算法 HS256 一起使用的密钥)但没有任何效果。
我的实现是这样的:
InMemorySymmetricSecurityKey signingKey = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes("secretsigningkey"));
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
ValidAudiences = validAudiences,
ValidIssuers = validIssuers,
IssuerSigningKey = signingKey
};
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
var claimsPrincipal = tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
并且这个方法抛出了异常tokenHandler.ValidateToken.
如何更改我的代码以允许 HS512(以及任何其他类型的 JWT 支持的算法)?
- 根据此 MSDN 文档,
SecurityAlgorithms
不支持验证 HS512 算法。
- 安装 jwt decode/validation 库:
JWT
及其项目站点:https://github.com/jwt-dotnet/jwt
PM> Install-Package JWT -Version 7.2.1
- 使用
JWT
官方文档,修改你的示例代码,使用HS512算法,将是这样的:
try
{
IJsonSerializer serializer = new JsonNetSerializer();
var provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtAlgorithm algorithm = new HMACSHA512Algorithm();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
json = decoder.Decode(token, "secretsigningkey", verify: true);
Console.WriteLine(json);
}
catch (TokenExpiredException)
{
Console.WriteLine("Token has expired");
}
catch (SignatureVerificationException)
{
Console.WriteLine("Token has invalid signature");
}
catch (Exception ex)
{
Console.WriteLine("Other exception: " + ex.Message);
}
我着手将软件包 System.IdentityModel.Tokens.Jwt 的版本升级到 6.7.1(可能没有必要)。
真正的解决办法是改变这个:
InMemorySymmetricSecurityKey signingKey = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes("secretsigningkey"));
至此
SecurityKey signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(domainJWTParams.IssuerSigningKey));
这适用于 HS256、HS384、HS512(可能更多),但此实现的真正优点在于不需要硬编码算法。
我正在使用 NuGet 包 System.IdentityModel.Tokens.Jwt 版本 4.0.4.403061554。
我有一个验证 JWT 的实现,它适用于算法 HS256。
但是,如果我将我的 JWT 更改为使用算法 HS512 生成,那么我会在验证期间收到错误消息。
System.IdentityModel.SignatureVerificationFailedException
HResult=0x80131501
Message=IDX10503: Signature validation failed. Keys tried: 'System.IdentityModel.Tokens.InMemorySymmetricSecurityKey
'.
Exceptions caught:
'System.InvalidOperationException: IDX10632: SymmetricSecurityKey.GetKeyedHashAlgorithm( 'HS512' ) threw an exception.
SymmetricSecurityKey: 'System.IdentityModel.Tokens.InMemorySymmetricSecurityKey'
SignatureAlgorithm: 'HS512', check to make sure the SignatureAlgorithm is supported.
我试过生成 512 位密钥,我也尝试过更小的密钥,如 256 位密钥(与算法 HS256 一起使用的密钥)但没有任何效果。
我的实现是这样的:
InMemorySymmetricSecurityKey signingKey = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes("secretsigningkey"));
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
ValidAudiences = validAudiences,
ValidIssuers = validIssuers,
IssuerSigningKey = signingKey
};
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
var claimsPrincipal = tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
并且这个方法抛出了异常tokenHandler.ValidateToken.
如何更改我的代码以允许 HS512(以及任何其他类型的 JWT 支持的算法)?
- 根据此 MSDN 文档,
SecurityAlgorithms
不支持验证 HS512 算法。
- 安装 jwt decode/validation 库:
JWT
及其项目站点:https://github.com/jwt-dotnet/jwt
PM> Install-Package JWT -Version 7.2.1
- 使用
JWT
官方文档,修改你的示例代码,使用HS512算法,将是这样的:
try
{
IJsonSerializer serializer = new JsonNetSerializer();
var provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtAlgorithm algorithm = new HMACSHA512Algorithm();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
json = decoder.Decode(token, "secretsigningkey", verify: true);
Console.WriteLine(json);
}
catch (TokenExpiredException)
{
Console.WriteLine("Token has expired");
}
catch (SignatureVerificationException)
{
Console.WriteLine("Token has invalid signature");
}
catch (Exception ex)
{
Console.WriteLine("Other exception: " + ex.Message);
}
我着手将软件包 System.IdentityModel.Tokens.Jwt 的版本升级到 6.7.1(可能没有必要)。
真正的解决办法是改变这个:
InMemorySymmetricSecurityKey signingKey = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes("secretsigningkey"));
至此
SecurityKey signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(domainJWTParams.IssuerSigningKey));
这适用于 HS256、HS384、HS512(可能更多),但此实现的真正优点在于不需要硬编码算法。