如何在验证JWT时处理每用户签名密钥?

时间:2016-12-19 13:29:28

标签: javascript spring-mvc jwt

我有一个Web应用程序,用户使用后端Spring MVC服务器登录。我使用JWT实现它,它可以正常工作(

  1. 用户在登录表单中插入用户名和密码。
  2. 我使用sha256哈希密码,并在我的MVC中调用登录端点发送用户名和sha256(密码)。
  3. 端点检查用户是否存在且密码是否正常(密码保存为sha256(密码)),如果是,我生成一个在一小时内到期的JWT,并在其有效负载中设置字段用户名。我用于JWT的密钥是用户相关密钥,它是在创建用户时随机生成的盐并保存在数据库中。最后,我将JWT发送到浏览器
  4. 浏览器将JWT保存在localstorage
  5. 对于要求数据的后端的每次调用,我都应该从现在开始使用JWT
  6. 我的问题是如何通过仅使用JWT让服务器知道谁在调用端点?

    是否可以在没有签名密钥的情况下获取有效负载中的用户名字段?我之所以需要知道哪个用户触发了它,是因为我必须检索正确的密钥以验证JWT,这取决于用户。

    我的想法是为每个请求发送JWT和用户名。这是正确的做法还是不需要,我错过了这个JWT的东西?

1 个答案:

答案 0 :(得分:1)

JWT规范系列允许您拥有以下标记(Learn JSON Web Tokens):

  • 只是以友好格式编码,以便在HTTP系统中使用(base64url编码)
  • 签名并编码
  • 加密和编码
  • 签名,加密和编码

您似乎使用了签名的令牌,然后使用base64url编码进行编码,以便更容易通过HTTP进行传输。使用此方法,您可以在实际需要验证签名之前访问其中包含的数据。有关示例,请参阅jwt.io,您将能够在不实际执行签名验证的情况下查看示例令牌(标头和有效负载)的内容。

基于此,您可以在令牌中包含一些内容,以便您了解用于验证签名的签名密钥。 kid standard claim在包含该信息的位置方面似乎是一个很好的候选者。

  

"孩子" (密钥ID)标头参数是一个提示,指示使用哪个密钥来保护JWS。

此外,还有一些关于您的实施的说明;鉴于用户提供的密码通常具有很少的熵(随机性),您不应该存储密码的直接哈希。相反,您应该使用一个合适的库,在散列之前对密码加密,并且还使用专门针对密码散列的算法 - 类似于bcrypt

作为补充说明,使用刚签名和编码的JWT是最普遍的方法,也是一般推荐的方法。如果需要在令牌本身中包含敏感信息,您只需要考虑使用JWT加密,这会增加显着的复杂性。