JSON Web 令牌 - 有效负载中的密码?

Posted

技术标签:

【中文标题】JSON Web 令牌 - 有效负载中的密码?【英文标题】:JSON web token - password in the payload? 【发布时间】:2018-12-04 18:22:12 【问题描述】:

如果我创建一个 JWT 令牌,那么负载中应该包含哪些数据? 我在网上找了一些例子和解释,有些人把密码放在JWT里,有些人没有。

现在我正在传递以下数据:

 
  id: 57,
  username: 'test',
  email: 'test@test.nl',
  password: '[HASHED PASSWORD]',
  iat: 1529992818 

将散列密码放入 JWT 负载中感觉不对,因为 JWT 将放置在前端应用程序中。它应该在那里吗?

最佳做法是什么?

【问题讨论】:

你可以在这里查看github.com/Abdurraheem/REST-API-JWTWEB-TOKEN 【参考方案1】:

存储密码其实有一些用处,但需要一些想象力。

假设攻击者获得了私钥(用于签署 JWT)而不是哈希密码,这是一种可能(尽管不太可能)的情况,因为它们可能没有以相同的方式/位置存储. 如果您只在 JWT 中包含用户名(和其他可预测的数据),黑客现在将能够冒充任何他知道用户名的用户,因为他可以修改 json-web-token 中的用户名并创建一个有效的自己签名。

但是,如果您包含密码哈希(显然,在用户执行某些受访问控制保护的操作时检查它的正确性),我们的攻击者将无法冒充用户......好吧,除非他成为一个更好的黑客,并且掌握了密码哈希。

我承认,这样做会导致一些开销(因为您要在许多地方验证哈希),甚至可能出现性能问题,但在安全关键的应用程序中,它可能值得考虑。我个人不这样做,您可能也不需要这样做,特别是如果您的应用程序的其他部分(看似?)是安全的,但告诉其他人这样做没有任何目的只是短视的。

【讨论】:

【参考方案2】:

通常,我会说不,不要将密码放入令牌中!

如果你这样做,只有当它真的有目的时才这样做,这意味着如果你真的要在后端/中间件中检查它,例如在al3xand3r96's answer 中描述的场景中。 但也必须考虑性能。

对于正常的用例,它不是必需的,并且您不应该仅仅因为其他人这样做而将密码或任何内容放入有效负载中。

RFC7519 section 4 lists some mandatory and some optional claims 和密码不在其中,我不知道任何需要它的框架。

此处无法回答哪些声明对您的目的有用或需要,并且还取决于授权框架/中间件/服务器。一般来说,避免敏感信息,并尽可能缩短令牌。

关于你的例子,除了密码,这样就可以了。但是只有在你真的需要时才将额外的信息放入令牌中。

【讨论】:

以上是关于JSON Web 令牌 - 有效负载中的密码?的主要内容,如果未能解决你的问题,请参考以下文章

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)

Flask JWT 令牌/有效负载 - 返回用户 Json

Web Api中的JSON Web令牌与承载令牌

在MEAN堆栈应用程序中自定义JWT令牌的有效负载

生成访问令牌时如何将 userid 参数添加到 jwt 的有效负载?

Firebase 云消息传递 - 发布消息说 JSON 有效负载无效