为什么用 AES_128_CBC_HMAC_SHA_256 加密 JWT 也会更改其 "alg" header 参数?

Why does encrypting a JWT with AES_128_CBC_HMAC_SHA_256 also change its "alg" header parameter?

我正在使用 HMAC + SHA-256 创建对称签名的令牌。正如预期的那样,header 看起来像这样:

{
  "alg": "HS256",
  "typ": "JWT"
}

但是当我用AES_128_CBC_HMAC_SHA_256加密令牌时,header变成了这个:

{
  "alg": "A128KW",
  "enc": "A128CBC-HS256",
  "typ": "JWT"
}

“enc”参数看起来像预期的那样,但为什么“alg”参数在加密后会发生变化?

根据我对加密 JWT 的理解:

但这似乎并不适用。潜在的接收者如何知道解密的令牌现在是用 HMAC + SHA-256 签名的? 签名和加密不是以这种方式完成的吗?我还注意到不同的“。”分离签名和有效载荷仍然存在于加密令牌中,考虑到整个内容应该作为一个加密(不包括 header),这似乎很奇怪。

如果重要的话,我正在使用 Microsoft.IdentityModel 生成令牌。

The "enc" parameter looks like expected, but why does the "alg" parameter change when encrypted?

header声明algJWS(签名令牌)和JWE(加密令牌)中使用时具有不同的含义。

使用 JWS(摘自 RFC7515 section 4.1.1

The "alg" (algorithm) Header Parameter identifies the cryptographic algorithm used to secure the JWS.

使用 JWE(摘自 RFC7516 section 4.1.1

This parameter has the same meaning, syntax, and processing rules as the "alg" Header Parameter defined in Section 4.1.1 of [JWS], except that the Header Parameter identifies the cryptographic algorithm used to encrypt or determine the value of the CEK.

关于你的假设

From what I understand about encrypting JWTs:
* The payload is signed (or symmetrically encrypted) and appended to the token;
* payload + signature are encrypted with the algorithm specified in "enc" if applicable.

这是不正确的。使用 JWE,有效负载不会由发行者进行数字签名。 如果您同时需要加密和签名,则必须发布 JWS(例如 {"alg":"HS256","typ":"JWT"})。 此 JWS 将被加密(例如使用 {"alg": "A128KW","enc": "A128CBC-HS256","typ": "JWT"}

I also noted that the distinct "." separating the signature and the payload is still present in the encrypted token

JWS和JWE的区别在于.的个数不一样:

  • 2 . 为 JWS
  • 4 . 为 JWE

两种令牌类型之间的区别在 RFC7516 section 9

中有详细说明