JSON Web Token - 负载中的密码?

4
如果我创建一个JWT令牌,负载中应该包含哪些数据? 我在网上查找了一些示例和解释,有些人将密码放在JWT中,而有些人则没有。
目前,我正在传递以下数据:
{ 
  id: 57,
  username: 'test',
  email: 'test@test.nl',
  password: '[HASHED PASSWORD]',
  iat: 1529992818 
}

将哈希密码放入JWT负载中并不合适,因为JWT将被放置在前端应用程序中。它应该在那里吗?

有什么最佳实践吗?


1
你可以在这里检查 https://github.com/Abdurraheem/REST-API-JWTWEB-TOKEN - Mohammad Raheem
2个回答

4

储存密码实际上可能有一些用途,但需要一些想象力。

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

但是,如果您包括密码散列(并且显然,在用户执行某些访问控制受保护的操作时始终检查其正确性),我们的攻击者将无法冒充该用户...好吧,除非他成为更好的黑客并且也获取了密码散列。

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


1
通常情况下,我会说不要将密码放入令牌中!如果您确实有目的地在后端/中间件中检查它,例如在al3xand3r96的答案中描述的场景中,请仅在这种情况下这样做。但是,还必须考虑性能问题。对于正常的用例,不需要将密码或任何其他内容放入有效载荷中,只因为其他人也这样做。RFC7519第4节列出了一些强制性和一些可选声明,密码不在其中,我不知道任何需要它的框架。哪些声明对您的目的有用或需要无法在此回答,这也取决于授权框架/中间件/服务器。通常避免敏感信息并尽可能保持令牌的短小。关于您的示例,除了密码之外,这样做是可以的。但是,仅在真正需要时将额外信息放入令牌中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接