JWT如何实现公钥加密?

5
这实际上可以分解为很多单独的问题来理解整个过程。
1. 据我所知,JWT只是将三个JSON对象分别编码为base64。然后这些Base64字符串由句点分隔。这纯粹是为了“更短的消息”吗?
2. 这些包括标头、“有效负载”和签名。标头和有效负载对任何拦截它们的人都是100%可读的。它们只是可以解码成JSON并阅读的base64字符串。
3. 然后是关键的部分:服务器接收到无法解码的SIGNATURE。签名实际上是标头、有效负载和一个密钥的哈希值。因此,服务器获取标头、有效负载和自己的密钥,并生成哈希值。如果此哈希值与消息一起发送的签名匹配,则信任该消息。如果签名不匹配,则消息无效。
我的问题是什么?这里有两个单独的密钥在哪里?似乎用于加密消息和解密消息的密钥相同。这是我的问题的根源——如果您没有回答其他问题,请帮助解决此问题。
除此之外,我想知道是否正确理解了整个过程?还有,“协商公共密钥”然后交换“公钥/私钥混合物”的标准在哪里?我只看到相同的密钥用于编码/解码。但是协商是何时发生的?顺便提一下,这是在.NET和Auth0中查看的,但是总的来说是一个问题。
随机资料,如果有人以后感兴趣:
JWT摘要:https://scotch.io/tutorials/the-anatomy-of-a-json-web-token 公钥/非对称加密:https://youtu.be/3QnD2c4Xovk 哈希:http://www.webopedia.com/TERM/H/hashing.html Base64:http://en.wikipedia.org/wiki/Base64
2个回答

3
首先,JSON对象签名和加密标准(JOSE)使用的是base64url编码而不是直接的base64编码,两者略有不同。
  1. JWT头部和有效载荷是JSON对象,但签名不是,它是一个base64url编码的二进制块。

  2. 任何拦截JWT的人都可以获得整个JWT,包括其三个部分。

  3. 您正在描述一种对称密钥算法,其中发送方和接收方使用相同的共享密钥;这只是JWTS的一种选项,另一种选项是使用公共/私有密钥对进行签名/验证/加密/解密。

与所有加密技术一样,关于密钥的协议需要在带外进行。


3
  1. 接下来是魔法环节:服务器收到无法解码的签名。实际上,签名是标题、有效载荷和一个秘密密钥的哈希值。所以服务器取标题、有效载荷和自己的秘密密钥,并生成一个哈希值。如果这个哈希值与消息一起发送的签名匹配,则消息被信任。如果签名不匹配,则消息无效。

这里没有什么神奇的地方。JWT支持四种众所周知的签名和MAC(消息认证码)构造:HMAC(对称算法)、ECDSA、RSASSA-PKCS-v1.5和RSASSA-PSS(公钥算法)。每种算法都可以使用SHA-256、SHA-384或SHA-512加密摘要。另请参阅RFC 7518 - JSON Web Algorithms(JWA)中的数字签名和MAC的加密算法表

我的问题在于?这里的两个单独的密钥在哪里?看起来用于加密消息和用于解密消息的密钥是相同的。这是我的问题的根源——如果您没有回答其他问题,请帮助解决这个问题。

并不一定需要两个单独的密钥——如果使用公钥算法,则签名将使用服务器的私钥创建,并使用相应的公钥进行验证。但是,如果使用HMAC算法,则必须使用共享秘密密钥进行签名和验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接