验证jwt令牌[rsa]

时间:2017-03-07 09:41:56

标签: cryptography jwt digital-signature

一位同事和我本人一直试图了解jwt令牌如何验证令牌,但从我们的阅读中我们似乎对此感到困惑。

请有人帮助确认我的想法是否正确

  • 使用私钥对令牌进行签名。签名是使用私钥加密的头和有效负载的组合,并作为最后一部分签名添加到jwt。
  • 为了验证令牌,接收者可以使用公钥复制此过程。它们对头和有效负载进行加密,以查看它是否与签名相同。请注意,这不是解密。接收方没有解密令牌(这是我们不确定的主要内容)。 - 接收方无法发布新令牌,因为它们没有私钥来加密新令牌。

我已经阅读了RS256和HS256上的jwt文档,但仍然在努力确认我的想法,因此发布了帖子。

3 个答案:

答案 0 :(得分:5)

令牌可以使用密钥对进行数字签名,私有和公共,或使用密钥进行散列:

  • Id:带有SHA256的RSA KeyPair。令牌使用私钥签名并使用公共

  • 进行验证
  • <PropertyEditor Removed="True" Id>:使用SHA256的HMAC密钥。签名和验证的关键是相同的

紧凑型JWT看起来像RS256

  • HS256:JWT的标头,包括用于对令牌进行签名的算法。例如hhhhh.ppppp.sssss。编码在base64url

  • hhhhh:JWT的有效负载,包含一些有用的声明,例如{"alg":"RS256","typ":"JWT"}pppppsub。编码在base64url

  • iss:JWT的签名,使用指定的算法在base64 url​​编码的头和有效负载的串联上执行,并在base64中编码。 E.g exp

回答您的问题,您使用密钥对引用sssss,客户端使用公钥验证令牌(使用HMAC密钥进行验证意味着客户端和服务器共享密钥)

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

不同

答案 1 :(得分:3)

我在学习倍数签名算法时遇到了同样的问题。因此,当我们在 JWT 中使用 RSASHA256 进行歌唱和验证歌唱时,过程如下:

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

有关详细信息,请访问此链接: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

答案 2 :(得分:-1)

您可以在官方网站上获得JWT授权令牌的详细说明 https://jwt.io/introduction/