为什么这个编辑过的JWT签名有效?

时间:2017-09-01 20:16:38

标签: asp.net-core jwt identityserver4

我正在使用服务器证书签名的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的正常怪癖,我需要知道为什么这样我就可以解除他们的任何顾虑。

1 个答案:

答案 0 :(得分:1)

我开始尝试通过交换有效的签名和正文值来构建自己的令牌。我不能,这太好了!在某种程度上,签名验证工作正常。

我解码了两个有效的base64签名(我为1个令牌生成并且都是后续授权),并显示生成的字节数组是相同的。

这使我处于一种非常自信的状态,即我们没有安全漏洞。可以修改Base 64令牌,但前提是它只能解码为完全相同的值。我们不应该冒某个人建造"一个令牌并组成签名。