11

场景:

我正在此链接(https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec)上阅读有关 JSON Web 令牌的信息。它概述了如何创建 JSON Web 令牌、创建标头和有效负载,然后使用以下伪代码创建签名:

data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
hashedData = hash( data, secret )
signature = base64urlEncode( hashedData )

我的问题:

为什么base64urlEncode在创建dataand时使用伪代码signature

到目前为止我所了解的范围:

Base64 允许您使用 Base64 64 个文本字符集中的文本字符来表示二进制数据。这通常在您有一组数据要通过某个通道传递时使用,这些通道可能会误解某些字符,但不会误解 Base64 字符,因此您使用 Base64 对其进行编码,这样数据就不会被误解。另一方面,Base64 URL 编码类似于 Base64 编码,只是您只使用了 Base64 字符集的一个子集,该子集不包括 URL 中具有特殊含义的字符,因此如果您使用 Base64 URL 编码的字符串URL,其含义不会被误解。

假设我的理解是正确的,我试图理解为什么base64urlEncode()在计算datasignature上面的伪代码中使用。JSON Web 令牌的签名会在 URL 中的某处使用吗?如果是这样,为什么data base64urlEncoded 在散列之前也是如此。为什么不直接对签名进行编码?哈希函数是否需要对其data参数进行 Base64 URL 编码?

4

1 回答 1

2

使用OAuth Implicit Grant时,JWT 可能会作为 URL 片段的一部分进行传输。

这只是一个例子,但我猜一般认为 JWT 可能是通过 URL 传递的,所以base64urlEncode它们是有意义的。

IETF JWT 标准摘要的第一行甚至说: JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.

(请注意,不再建议使用 OAuth 隐式授权。)

于 2021-10-14T10:13:53.697 回答