为什么在jwt中发送算法header

Why send algorithm in jwt header

在 JWT 令牌中,我们发送用于在 header 中签署 JWT 的算法类型,它只是 base64 编码。任何人都可以知道算法easily.eg

{ "alg":"HS256" }

为什么要发给客户,客户不需要知道。 发送算法不是更安全吗?

HS256 是一种签名算法,因此客户端(如您所描述的)无论如何都可以读取令牌的内容,而无需验证签名(除非内容被单独加密)。

这是一个很好的观点,如果令牌的接收者需要它,那么没有充分的理由在令牌中发送它的副本。事实上,JWT 批评该算法包含在 header 中,这导致实现该标准的库中存在各种漏洞,特别是因为它包含签名算法的 none 选项,允许如果接收方仅使用 JWT header 中的信息,则令牌的发送方可以完全绕过验证(有关详细信息,请参阅 this article)。这还详细说明了由于弱类型签名密钥导致的另一个漏洞。

现在通常建议令牌的验证者指定它期望使用的算法(因为在许多情况下这是已知的),而不是依赖 JWT header 中的信息。

所以问题不在于公开有关所用算法的信息(算法应该足够健壮以使其没有区别),而是关于接收无效的算法信息,这些信息可用于欺骗接收者证明它在实际伪造时是有效的。

Why do we send it to the client

明显的、迂腐的原因很简单,标准需要它:

RFC 7515 4.1.1
This Header Parameter MUST be present and MUST be understood and processed by implementations.

虽然我不确定这一点,因为我找不到任何 IETF meeting notes discussing it, I believe the algorithm is required because of historical precedent. These standards did not just appear over-night, on their own, in the form we know them today. Rather they evolved from the XML dsig 技术,其中算法是作为嵌入式 public 密钥的一部分专门发送的。

Isn't not sending the algorithm more secure ?

要求实现根据客户端输入更改行为是值得怀疑的。 alg header 是 client-provided,这意味着即使它是有效的,它也可以用来诱使实现进入开放式故障模式。 Two critical vulnerabilities 在 JWT 标准化后几乎立即被利用,基于允许客户端指导服务器选择算法。

这是否是 design bug or an implementation bug 一直存在争议。

最重要的是,JOSE 系列 (JWT, JWS, JWE, JWK, and JWA) 允许实施者和用户混合和匹配密码算法,它提供了大量 use-case 功能。不幸的是,这也意味着用户应该对他们的 JWT 库处理 client-provided 算法非常挑剔。

如果您正在研究其他 bearer-token 类型的选项,没有这种不寻常(奇怪?)要求的选项,check-out: