JWT中的密钥是什么?

时间:2018-05-14 05:23:52

标签: jwt

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

一旦客户端提交了正确的用户名和密码,身份验证服务器就会创建一个JWT令牌,其中包含标头,有效负载/声明和签名。

问题1 - 签名是否只有认证服务器知道的密钥(不是用户的密码)(服务器的私钥类型)?

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

问题3 - 我使用了以下JWT并将其粘贴在jwt.io上。我看到了消息Signature Verified。 jwt.io如何知道签名是正确的,因为它不知道密钥。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxLS9tSjVsVTNYc09QWCt2VitpaGZRMWlCUDVjUTROQm1hNDluOE9rS1FFSnEzTDFNOTl2VW9iQ1ZLUHVYMmdlWWhYaHJQM0t3bHY4SE1RaHNGdnFjbllIeGxGSHM9IiwiaXNzIjoicGxheS1zaWxob3VldHRlIiwiZXhwIjoxNTI2MjgxMDU1LCJpYXQiOjE1MjYyMzc4NTUsImp0aSI6IjhmOGM3YTVmYWRkNTE5MjUxNzQ5NGE4N2Q1ODcxZjJjZGUxZDkzMDdkOTY1MThjNjg2NzExOTc1YjU3M2I5NDBlZWU2NGY0NDUwYzcxODI3NGZmNzU1MmE2Y2JlNTVmZmZhMWI1ZjA3ZWZlOWVkNTE0Y2Y4YTViOTZlM2ExYjI0ODRmYTI5NjZiYjA0ODlmODIwZjMyMzM5YWVhNjM3NWRkZmU4ZDE4N2E2NzBjMzg0ODgwZGIyMzQ1ZTFkMzRkYWNjZmY2MTdkMDY1NzU3YmEwZTQzNDg4YWFhZmZmNDNjYWZlZGY0OTFlODU1YTA0NWM0NmJjNDY4NGYzODlmY2YifQ.GwN6TSNd426xpc3Y02eRXHbrmSr_61MMBqrmx66Ofqs

enter image description here

2 个答案:

答案 0 :(得分:1)

  

问题1 - 签名是否只有认证服务器知道的密钥(不是用户密码)(服务器的私钥)?

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

  

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

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

  

问题3 - 我使用了以下JWT并将其粘贴在jwt.io上。我看到Signature Verified消息。 jwt.io如何知道签名是正确的,因为它不知道密钥。

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

答案 1 :(得分:1)

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

只有身份验证和/或应用程序服务器知道该秘密。 JWT已编码和签名,但未加密。要了解Sign / Hash和Encryption之间的区别,请检查this

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

签名只是验证或验证消息是否已经过哈希处理,然后再使用标头中指定的同一种算法,该算法只有服务器知道。

要了解它在authenitcation中的工作原理,这里有一个流程:

  • 用户登录后,您通过https
  • 以加密方式将用户/传递发送到服务器
  • 服务器验证来自您的数据库的用户名/传递
  • 服务器生成一个JWT并将其发送回给您。此处使用签名来验证消息在此过程中未被更改。
  • 服务器将JWT保存在会话存储中的某个位置。
  • 稍后,用户请求服务器(每次从服务器需要时发送JWT)
  • 服务器使用相同类型的哈希算法验证它,该算法存储在头部和秘密中。
  • 服务器检查会话存储中是否已存在。
  • 服务器授权并授予您请求。

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