我正在尝试了解 JSON Web 令牌,并了解到 Base64 是其中使用的编码。由于 Base64 可以轻松解码,我的问题是为什么要使用它们。为什么不使用单向哈希函数来生成令牌?
JSON Web Token(JWT)是一种开放标准,定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。
事实上,JWT 是以下类型令牌的通用名称:
JSON Web 签名(JWS):有效负载经过编码和签名,因此可以验证声明的完整性。
JSON Web 加密(JWE):它们的有效负载是加密的,因此其他方的声明是隐藏。
由于base64可以轻松解码,我的问题是为什么要使用它们。
JWT 使用 Base64url,与 Base64 略有不同。
使用 Base64 的可能原因之一:它是一种非常流行的编码格式,并且在大多数编程语言中使用它都非常容易。此外,Base64url 是 URL 安全,因此令牌可以 在 URL 中发送。
为什么不使用单向哈希函数来生成令牌?
它违背了签名 JWT 的目的,因为接收者将无法解析令牌的内容。
你是对的,base 64 很容易解码,但是基于 64 编码的 2 个部分(标头和有效负载)并不意味着被隐藏。
只是一般性介绍,JWT 令牌由 3 个部分组成。 1.标题(算法) 2.有效负载(用户数据) 3. 签名
标头和有效负载包含非敏感数据,但此数据提供了足够的信息来帮助您识别向您提供令牌的用户。因此,为了能够授予他刷新令牌或允许他访问某些资源,您需要了解有关他的一些信息,而用户不必在每次调用时提供他的凭据。
是的,它很容易解码,但这就是签名的第 3 部分。签名采用标头和有效负载的 base64 编码值,并使用一些密钥对它们进行哈希处理。这样做是为了当密钥从客户端进入您的后端时,我们可以首先检查有效负载(可能包含权限)是否已被更改或更改,如果它们的令牌的哈希值不是不再一样了。
有关更多信息,请查看以下资源: https://jwt.io/(查看结构) https://jwt.io/introduction/(一般信息)
如果有人想在终端中使用base64url编码。
只需执行以下操作即可:
echo -n 'string' | base64 | tr '/+' '_-' | tr -d '='