【问题标题】:JWT confusing. How does the application server authenticate?智威汤逊令人困惑。应用服务器如何进行身份验证?
【发布时间】:2018-07-23 03:09:37
【问题描述】:

JWT 上的This article 超级清晰,除了最后一部分。

我理解的部分: 1. 编码不同于加密。 2. token 的部分(header base64 编码,payload base64 编码,header+payload 用公钥和指定算法加密的签名)

但我不明白第 5 部分中令牌验证是如何处理的。我也不明白为什么标头和有效负载需要进行 Base64 编码。鉴于它不安全或不加密......编码的部分是什么?

*****编辑****

我的理解是否正确,因为 JWT 包含 encoded 标头和有效负载...应用程序服务器可以只使用其密钥(可能是非对称加密机制中的公钥)进行加密包含的有效负载和标头,如果它到达相同的包含 JWT 签名......那么应用程序服务器知道数据没有被篡改,并且用户确实通过身份验证服务器进行了身份验证。是这样吗?

如果签名不匹配。这意味着什么?

【问题讨论】:

  • 你明白了。如果签名不匹配,应用程序不应创建任何会话。除了签名之外,应用程序还应该验证 JWT 的过期时间。每个平台上都有许多库可以为您做到这一点。查看此页面:jwt.io

标签: jwt


【解决方案1】:

JWT 使用base64Url 编码(参见https://www.rfc-editor.org/rfc/rfc7519#section-3),它避免了字符+/=,它们是URI 的保留字符(参见https://www.ietf.org/rfc/rfc2396.txt 中的第2.2 节) 这是有道理的,因为在某些情况下,令牌会作为 url 中的参数传输。

如果使用非对称算法,则使用私钥进行散列,因此任何知道公钥的人都无法创建新签名。

本教程中的第 5 步只是告诉您,应用程序服务器将使用与身份验证服务器相同的密钥从标头和有效负载创建一个哈希,并比较它是否获得与它在接收到的 JWT 中相同的值要求。 不匹配签名的含义是有人更改了令牌,因此令牌被视为无效并且授权将被拒绝。 从技术上讲,操作JWT 的标头和有效负载非常容易,只需解码base64url 编码部分,更改JSON 结构中的一些值,例如。到期时间exp,然后再次编码。但是如果不知道私钥,您就无法为其创建有效的签名。

查看https://jwt.o并在调试窗口中使用示例令牌来查看效果。

【讨论】:

  • “使用与认证服务器相同的密钥”是什么意思?假设身份验证服务器使用其私钥创建 JWT 的签名,应用程序服务器将需要拥有身份验证服务器的私钥才能从 Payload + Header 创建相同的签名,对吗?这是否意味着应用服务器与认证服务器共享相同的私钥?
  • 问题中提到的 OP 的原始教程不再可用,但我相信它是在谈论使用对称密钥算法 (HS256) 进行签名。然后,您只需要一个密钥来进行签名和验证。在非对称密钥算法的情况下,哈希在签名期间用私钥加密,然后用公钥解密以进行验证。我会看看如何编辑问题和答案,以便在没有链接的情况下它们仍然有意义。
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 2017-04-25
  • 1970-01-01
  • 2016-09-21
  • 2018-07-14
  • 2015-10-16
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多