我正在使用服务器证书签名的JWT来保护一组API,并注意到一个奇怪的“bug”。对于大多数令牌,我可以更改令牌的最后几个字符(“签名”),并且请求成功!
并非每个字符组合都有效(令牌必须仍然是有效的base64),但我希望签名验证能够解决这个问题。这是我的API令牌设置
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = EnvironmentVariables.LoadFromAppSettingValue(Configuration["AppSettings:" + EnvironmentVariables. AUTH_URL]),
Audience = EnvironmentVariables.LoadFromAppSettingValue(Configuration["AppSettings:" + EnvironmentVariables.API_NAME]),
AutomaticAuthenticate = true,
RequireHttpsMetadata = false,
AutomaticChallenge = true,
TokenValidationParameters = new TokenValidationParameters()
{
RequireSignedTokens = true,
IssuerSigningKey = key,
ValidateIssuer = true,
ValidIssuer = EnvironmentVariables.LoadFromAppSettingValue(Configuration["AppSettings:" + EnvironmentVariables. AUTH_URL])
}
});
上面的“key”参数是RSASecurityKey
,使用服务器证书中的值。
关于为什么签名验证没有抓住这一点的任何想法,或者我如何检查签名验证是否正在发生?
我的客户希望他们的令牌系统是防弹的(谁不会)所以如果这是JWT的正常怪癖,我需要知道为什么这样我就可以解除他们的任何顾虑。
答案 0 :(得分:1)
我开始尝试通过交换有效的签名和正文值来构建自己的令牌。我不能,这太好了!在某种程度上,签名验证工作正常。
我解码了两个有效的base64签名(我为1个令牌生成并且都是后续授权),并显示生成的字节数组是相同的。
这使我处于一种非常自信的状态,即我们没有安全漏洞。可以修改Base 64令牌,但前提是它只能解码为完全相同的值。我们不应该冒某个人建造"一个令牌并组成签名。