JWT中的密钥是什么

JWT中的密钥是什么,jwt,Jwt,我无法清楚地理解JWT的工作原理,尤其是签名部分 一旦客户端提交了正确的用户名和密码,身份验证服务器就会创建一个JWT令牌,该令牌由头、有效负载/声明和签名组成 问题1-签名是否是只有身份验证服务器知道的密钥(而不是用户的密码)(某种程度上是服务器的私钥) 问题2-假设我使用单独的应用程序服务器和身份验证服务器,在从客户端接收JWT时,应用程序服务器是否会将JWT发送到身份验证服务器以进行验证?我假设应用服务器无法验证JWT令牌,因为它不知道用于签名头和有效负载的密钥 问题3-我把下面的JWT粘

我无法清楚地理解JWT的工作原理,尤其是签名部分

一旦客户端提交了正确的用户名和密码,身份验证服务器就会创建一个
JWT
令牌,该令牌由头、有效负载/声明和签名组成

问题1-签名是否是只有身份验证服务器知道的密钥(而不是用户的密码)(某种程度上是服务器的私钥)

问题2-假设我使用单独的应用程序服务器和身份验证服务器,在从客户端接收
JWT
时,应用程序服务器是否会将
JWT
发送到身份验证服务器以进行验证?我假设应用服务器无法验证
JWT
令牌,因为它不知道用于签名头和有效负载的密钥

问题3-我把下面的
JWT
粘贴到
JWT.io
上。我看到消息
签名已验证
。jwt.io如何知道签名是正确的,因为它不知道密钥

EYJZDWIYIYIXLs9TsJvTnyC09Qwct2VitpagZrMwLcJuTrO9RsFsNezTdFnTl2Vw9Iq1ZlUhVyMdLwHyQm0T3Bhy4Se1RahngDnJbLgLgLgLgLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLzLNdBlzWu2NdWu2NdWyZxOd3NzMnZu1Me2JLNtVmZmZmWi1Zja3ZwzlowVkNt0Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2Y2YWnjMzMu4ZD4N2N2NzBJ0OdZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZ

问题1-签名是否是只有身份验证服务器知道的密钥(而不是用户的密码)(某种程度上是服务器的私钥)

不,电子签名是一种数学计算,使用密钥应用于JWT的有效载荷。目的是确保消息未被更改,并识别签名者以验证JWT

问题2-假设我使用一个单独的应用服务器和身份验证服务器,在从客户端接收JWT时,应用服务器是否会将JWT发送到身份验证服务器以进行验证?我假设应用服务器无法验证JWT令牌,因为它不知道用于签名头和负载的密钥

不一定。如果使用对称密钥(HMAC),则签名和验证密钥相同。在这种情况下,授权服务器必须知道密钥或发送令牌进行验证。但是,如果使用非对称密钥(RSA、ECDSA),则签名密钥与验证密钥不同。授权服务器可以安全地拥有公钥的副本

问题3-我取了下面的JWT并将其粘贴到JWT.io上。我看到消息签名已验证。jwt.io如何知道签名是正确的,因为它不知道密钥


jwt.io或任何想要验证令牌的人都需要密钥。请注意,如果您复制并粘贴jwt.io中的令牌,签名将不会被验证,但如果您更改密钥,编辑器将自动更改签名创建新令牌时的签名

签名只是使用身份验证服务器生成的密钥进行散列,使用头中指定的算法,标题、有效负载和密码的组合

只有身份验证和/或应用服务器知道该秘密。JWT是编码和签名的,但不是加密的。要了解签名/哈希和加密之间的区别,请检查

签名只是验证或验证消息在使用头中指定的相同算法之前是否已经散列,该算法的秘密只有服务器知道

要了解它在AuthenitAction中的工作原理,以下是一个流程:

  • 用户登录时,通过https以加密方式向服务器发送用户/通行证
  • 服务器验证数据库中的用户名/密码
  • 服务器生成一个JWT并将其发送回您,这里的签名用于验证消息在发送过程中没有更改
  • 服务器将JWT保存在会话存储中的某个位置
  • 稍后,用户请求服务器(每次需要服务器上的东西时发送JWT)
  • 服务器使用头中存储的相同类型的哈希算法和其中存储的机密对其进行验证
  • 服务器检查会话存储中是否已经存在该文件
  • 服务器授权并授予您该请求

我建议您阅读更具描述性的内容,以便更好地理解其工作原理

谢谢。关于你对问题3的回答,我添加了我在
jwt.io
上看到的内容的快照。您说过
jwt.io
需要密钥,但我可以看到屏幕上的消息是
Signature Verified
,即使我没有在
jwt.io
中指定密钥,但您插入了一个空密钥来验证令牌。空字符串
也可用作键。在生成令牌时尝试使用其他密钥,您将看到JWT.io不会验证itI在右侧的验证签名框中添加的随机字符串
dfds
,但消息保持不变!我也检查和取消检查了这个框。签名已更改,但消息未更改。这是一个关于jwt.io编辑器的问题。当您输入新密钥时,签名将自动更改,因此它将始终正确!要检查令牌是否与密钥对应,请执行以下操作1)打开新的jwt.io窗口2)插入密钥3)复制令牌
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)