关于JSON Web令牌安全性的几个问题?

时间:2016-02-05 13:17:43

标签: api security authentication jwt

我一直致力于使用Tomcat API发送/接收数据,登录,注销等的Android / IOS应用程序。我的主要身份验证形式是通过使用SHA-512的HMAC的JSON Web令牌。身份验证照常执行。用户首次登录时提供其凭据(用户ID和密码)。服务器验证凭证,如果它们是正确的,它会生成并向用户返回JWT,他们可以使用JWT在将来的请求中对自己进行身份验证。令牌包含一个自定义声明,指定userID,用于了解发出请求的用户。我做了一些关于JWT的研究,关于许多问题的意见不一。我有几个问题希望你能够阐明:

1-使用JWT作为我的API的唯一身份验证机制是否足够?

2-在安全性方面,使用HMAC的JWT与使用RSA的JWT有区别吗?

3-理想情况下,我应该在哪里存储我正在签署我的令牌的对称签名密钥?目前,我将密钥直接传递给生成令牌的函数。这样做是否安全?

4-我应该定期更改签名密钥以获得更好的安全性吗?

5-我可以信任我插入令牌的userID声明,以识别发出请求的用户吗?

6-令牌的“理想”到期时间是否存在?有人建议只需15分钟,而其他人则认为3小时就可以了。

7-我是否应该担心限制特定用户可以拥有的令牌数量?用户可以具有多个移动设备,并且在任何时候可以具有多个令牌。在这种情况下,如果用户拥有自己的凭据,则无法阻止用户从我的服务器获取数千个令牌。我应该实现一些机制(例如:数据库)来跟踪用户拥有的令牌吗?如果我在验证/生成令牌时必须进行额外的数据库查询,这似乎会破坏JWT的目的并增加复杂性。

8-我是否要担心撤销令牌?有些人认为拥有短暂到期时间的令牌就足够了。其他人指出,如果用户退出应用程序后不撤消令牌,则永远不会有真正的注销机制。等待令牌过期是不对的?就安全性而言,何时需要撤销令牌?

对不起,很长的帖子。我一直在担心处理这些问题的最佳方法。我感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:4)

  

1-使用JWT作为我的唯一认证机制是否足够   API?

通常是,只要“签名密钥”具有足够的强度(128位,由CSPRNG生成)。我将在下面的其他答案中介绍它是否“足够”。

  

2-在安全性方面,使用HMAC的JWT之间是否存在差异   和JWT使用RSA?

通常使用HMAC,因为密钥长度要短得多,因为根本不需要允许客户端访问公钥,因为他们会通过TLS / SSL证书提供的公钥基础结构对您的服务器进行身份验证

  

3-理想情况下,我应该在哪里存储对称的签名密钥   签署我的代币?目前,我正在直接传递密钥   生成我的令牌的函数。这样做是否安全?

您应该将其存储在通过Web无法读取的应用程序配置文件中。这使得每个部署的不同(例如,预发布环境中提供的令牌不能用于生产环境中的身份验证)。

  

4-我应该定期更改签名密钥以获得更好的安全性吗?

不,如果它具有足够的强度(如上所述,是128位熵),如果它没有泄漏则不是。

  

5-我可以信任我插入令牌的userID声明吗?   识别发出请求的用户?

是的,这就是重点。如果您的HMAC是根据此声明计算的,则无法更改。

  

6-令牌的“理想”到期时间是否存在?有些人   建议只需15分钟,而其他人则认为3小时就可以了。

这取决于应用程序的“风险偏好”。例如,如果您的应用程序符合PCI规范,则为15分钟。如果您乐意让用户长时间打开他们的会话,那么可以增加。

  

7-我是否应该担心限制令牌的数量?   特定用户可以拥有?用户可以拥有多个移动设备和   在任何时候都可能有多个令牌。在这种情况下,什么也没有   阻止用户从我的服务器获取数千个令牌   只要他们有自己的证书。我应该实施一些   机制(例如:数据库)来跟踪用户拥有的令牌?   这似乎打败了JWT的目的并增加了复杂性,如果我有   在验证/生成令牌时进行其他数据库查询。

不,正如你所说,这首先击败了JWT的目标。如果您允许通过JWT在客户端管理用户会话,那么您不应该跟踪服务器端的会话。由于令牌是客户端的,因此您的应用程序应该不关心生成了多少令牌,因为没有额外的开销。如果您担心多个用户以同一帐户登录,则JWT不是可行的方法 - 服务器端受管系统在发布令牌时仅限于多个同时会话的情况会更好。

  

8-我是否要担心撤销令牌?有人建议有   到期时间短的令牌就足够了。其他人指出   如果你不撤销,你永远不会有真正的注销机制   用户退出应用程序后的令牌。是不是错了   等待令牌到期?就安全而言,我什么时候会   需要撤销令牌吗?

同样,这归结为“风险偏好”。如果密码被泄露,则撤消攻击者可能已经进行的现有会话将更加困难。与注销链接类似,您可以做的就是响应客户端请求删除cookie。

一种方法是在JWT中包含上次密码更改的日期和时间,该日期和时间包含在HMAC计算中。然后,将检查每个请求,以确定它是否与数据库中的值匹配。如果没有,那么您将拒绝身份验证令牌并强制用户重新登录。这是使用JWT撤销的一种方法。

注销比较棘手,因为如果您在令牌中包含“注销日期/时间”,则一个注销请求将注销所有会话,这是在服务器端检查的。同样,您的风险偏好将决定这是否值得实施,或者是否更容易设置短暂的到期时间,以便攻击者检索到的任何令牌可以继续无限期续订(或者直到用户更改密码,如果您按照我之前的解决方案)。

相关问题