验证 jwt 令牌 [rsa]

Verifying jwt tokens [rsa]

我和一个同事一直在试图理解 jwt 令牌如何验证令牌,但从我们的阅读中我们似乎感到困惑。

请大家帮忙确认一下我的想法是否正确

我已经阅读了关于 RS256 和 HS256 的 jwt 文档,但仍在努力确认我的想法,因此 post。

您可以在官网获取JWT auth tokens的详细说明 https://jwt.io/introduction/

令牌可以使用密钥对、私有密钥和 public 进行数字签名,或者使用秘密密钥进行哈希处理:

  • RS256 :RSA 密钥对与 SHA256。令牌使用私钥签名并使用 public

  • 进行验证
  • HS256:使用 SHA256 的 HMAC 密钥。签名和验证密钥相同

紧凑的 JWT 看起来像这样 hhhhh.ppppp.sssss

  • hhhhh:JWT 头部,包括用于对令牌进行签名的算法。例如 {"alg":"RS256","typ":"JWT"}。以 base64url

  • 编码
  • ppppp:JWT 的有效负载,包括一些有用的声明,如 subissexp。以 base64url

  • 编码
  • sssss:JWT 的签名,使用指定算法对 header 和 payload 的 base64 url 编码进行串联,并以 base64 编码。例如 b64(signature(hhhhhh.pppppp))

回答您的问题,您指的是 RS256 使用密钥对,其中客户端使用 public 密钥验证令牌(使用 HMAC 密钥进行验证意味着客户端和服务器共享密钥)

令牌是用我上面写的算法签名的(未加密)。为了验证,客户端使用提供的 public 密钥验证签名与令牌 hhhhhh.pppppp 的第一部分匹配。数字签名验证是所有现代语言都支持的标准操作。请注意,这与 encryption/decryption

不同

我在学习多重签名算法时遇到了同样的问题。所以,当我们在 JWT 中使用 RSASHA256 唱歌和验证唱歌时,是这样的过程:

  1. 符号 = RSA(SHA256(base64(header) + "." + base64(payload)), private_key)
  2. 符号有效,如果 RSA(Sign, public_key) 等于 SHA256(base64(header) + "." + base64(payload))

有关详细信息,请访问此 link:https://www.cs.cornell.edu/courses/cs5430/2015sp/notes/rsa_sign_vs_dec.php#:~:text=RSA%20Digital%20Signatures&text=To%20sign%20a%20message%20m,result%20equals%20the%20expected%20message.&text=That's%20the%20textbook%20description%20of%20RSA%20signatures