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

时间:2018-06-26 06:09:50

标签: node.js security jwt

如果我创建JWT令牌,那么有效载荷中应该包含哪些数据? 我在网上查看了一些示例和说明,有人将密码放入JWT,有些则没有。

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

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

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

最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

与(不幸的)已接受的答案相反,存储密码实际上可以使用一些,但需要一定的想象力。

假定攻击者获得了私钥(用于对jwt进行签名),但没有获得哈希密码,这是可能的(尽管不是可能的)方案,因为它们的存储方式可能不同。 如果您仅在jwt中包含用户名(和其他可预测的数据),则黑客现在可以假冒他知道用户名的任何用户,因为他可以在json-token中修改用户名并自己创建有效的签名

但是,如果您包含密码哈希(并且很明显,只要用户执行某些受访问控制的操作,请检查密码的正确性),我们的攻击者就无法假冒该用户……除非,除非他成为更好的黑客,还可以使用密码哈希。

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

答案 1 :(得分:2)

否,请勿将密码放入令牌中!

它的目的是什么? RFC7519 section 4 lists some mandatory and some optional claims,并且密码不在其中,并且我不知道会需要密码。

对于您的目的有用或必需的声明在这里无法回答,并且还取决于授权框架/中间件/服务器。通常,请避免使用敏感信息,并尽量缩短令牌。

关于您的示例,除了密码之外,还可以这样。但是只有在确实需要时,才将额外的信息放入令牌中。