我无法清楚地了解JWT
的工作原理,尤其是签名部分。
一旦客户端提交了正确的用户名和密码,身份验证服务器就会创建一个JWT
令牌,其中包含标头,有效负载/声明和签名。
问题1 - 签名是否只有认证服务器知道的密钥(不是用户的密码)(服务器的私钥类型)?
问题2 - 假设我在从客户端接收JWT
时使用单独的应用程序服务器和身份验证服务器,应用程序服务器是否会将JWT
发送到身份验证服务器以验证它?我想应用服务器无法验证JWT
令牌,因为它不知道用于签署标头和有效负载的密钥。
问题3 - 我使用了以下JWT
并将其粘贴在jwt.io
上。我看到了消息Signature Verified
。 jwt.io如何知道签名是正确的,因为它不知道密钥。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxLS9tSjVsVTNYc09QWCt2VitpaGZRMWlCUDVjUTROQm1hNDluOE9rS1FFSnEzTDFNOTl2VW9iQ1ZLUHVYMmdlWWhYaHJQM0t3bHY4SE1RaHNGdnFjbllIeGxGSHM9IiwiaXNzIjoicGxheS1zaWxob3VldHRlIiwiZXhwIjoxNTI2MjgxMDU1LCJpYXQiOjE1MjYyMzc4NTUsImp0aSI6IjhmOGM3YTVmYWRkNTE5MjUxNzQ5NGE4N2Q1ODcxZjJjZGUxZDkzMDdkOTY1MThjNjg2NzExOTc1YjU3M2I5NDBlZWU2NGY0NDUwYzcxODI3NGZmNzU1MmE2Y2JlNTVmZmZhMWI1ZjA3ZWZlOWVkNTE0Y2Y4YTViOTZlM2ExYjI0ODRmYTI5NjZiYjA0ODlmODIwZjMyMzM5YWVhNjM3NWRkZmU4ZDE4N2E2NzBjMzg0ODgwZGIyMzQ1ZTFkMzRkYWNjZmY2MTdkMDY1NzU3YmEwZTQzNDg4YWFhZmZmNDNjYWZlZGY0OTFlODU1YTA0NWM0NmJjNDY4NGYzODlmY2YifQ.GwN6TSNd426xpc3Y02eRXHbrmSr_61MMBqrmx66Ofqs
答案 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中的工作原理,这里有一个流程:
我建议您阅读this article更具描述性的内容,以便更好地了解其工作原理。