为什么要验证这个编辑后的 ​​JWT 签名?

Why is this edited JWT signature validated?

我正在使用服务器证书签名的 JWT 来保护一组 API 并注意到一个奇怪的 "bug"。对于大多数令牌,我可以更改令牌的最后几个字符("signature")并且请求成功!

并非每个字符组合都有效(令牌必须仍然是有效的 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 的正常怪癖我需要知道为什么我可以消除他们的任何担忧。

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

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

这让我非常自信我们没有安全漏洞。可以修改 Base 64 令牌,但前提是它解码为完全相同的值。我们不应该冒有人 "building" 令牌和签名的风险。