为什么在 JWT 中使用 Base64?

abi*_*24m 6 authentication json token session-cookies jwt

我试图了解 JSON Web Tokens 并了解到 Base64 是其中使用的编码。由于 base64 可以轻松解码,我的问题是为什么要使用它们。为什么不使用单向哈希函数来生成令牌?

如果问题看起来很愚蠢,请原谅我

cas*_*lin 19

JSON Web Token (JWT) 是一种开放标准,它定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。

事实上,JWT 是以下类型令牌的通用名称:

  • JSON Web 签名(JWS):有效负载经过编码和签名,以便验证声明的完整性。

  • JSON Web 加密(JWE):它们的有效负载经过加密,因此对其他方隐藏声明。

由于 Base64 可以轻松解码,我的问题是为什么要使用它们。

JWT 使用Base64url ,与Base64略有不同。

使用 Base64 的可能原因之一:它是一种非常流行的编码格式,并且在大多数编程语言中都很容易使用它。此外,Base64url 是URL 安全的,因此可以在 URL 中发送令牌。

为什么不使用单向哈希函数来生成令牌呢?

它违背了签名 JWT 的目的,因为接收者将无法解析令牌的内容。

  • 我遇到了同样的问题,我问自己为什么在 JWT 中使用 base64,因为它会放大字符串。然而,您提到的事实“[...]此外,Base64url 是 URL 安全的,因此可以在 URL 中发送令牌。[...]”在我看来,这是以这种格式使用它的唯一点。 (2认同)

Ter*_*iel 5

你是对的,base 64 很容易解码,但是基于 64 编码的 2 个部分(标头和有效负载)并不意味着被隐藏。

只是一般性介绍,JWT 令牌由 3 个部分 nl 组成。1. header(算法) 2. Payload(用户数据) 3. 签名

标头和负载包含非敏感数据,但此数据提供了足够的信息来帮助您识别向您提供令牌的用户。因此,为了能够授予他刷新令牌或允许他访问某些资源,您需要了解有关他的一些信息,而无需用户在每次调用时提供他的凭据。

所以是的,它很容易解码,但这就是签名的第 3 部分。签名采用标头和有效负载的 base64 编码值,并使用一些密钥对它们进行哈希处理。这样做是为了当密钥从客户端进入您的后端时,我们可以首先检查有效负载(可能包含权限)是否已更改或更改,如果它们的令牌的哈希值不是不再一样了。

有关更多信息,请查看以下资源: https://jwt.io/(查看结构) https://jwt.io/introduction/(一般信息)