我的JWT刷新计划是否安全?

时间:2015-06-08 21:30:17

标签: security authentication oauth token jwt

我计划将JWT用于移动设备的登录系统。没有真正标准的工作流程来刷新我能找到的JWT令牌,所以我在下面创建了这个。我想使用JWT的原因是出于性能原因。对于每个请求,我都信任JWT,而不是检查用户是否对数据库调用有效。

我有我想要在我的应用中实现的建议工作流程。这可以接受吗?高效?我在监督是否有任何明显的问题?可以做出哪些合理的改进?

用户登录

  1. 如果localstorage中没有HMAC签名令牌,则用户为设备指定名称。
  2. 将DeviceName发送到将其插入数据库的服务器。
  3. 将DeviceName的JWT令牌+ HMAC签名令牌发送回用户。 HMAC签名令牌用于确保jwt令牌(包含DeviceName)是从最初调用它的同一设备发送的。
  4. JWT令牌有效期为X小时,因此用户可以进行X小时的任何通话。
  5. X小时后,JWT已过期。发出请求时,服务器可以看到JWT已过期。服务器现在将尝试刷新JWT令牌。服务器检查数据库以查看HMAC签名令牌中指定的DeviceName是否与该用户的数据库中的有效设备名称相同。
  6. 如果是这样,创建新的JWT有效期为X小时,如果没有,则发送回要求登录的消息。
  7. 如果帐户遭到入侵:

    用户可以登录我的密码服务。登录后,我将检索该用户的所有设备,然后用户可以撤销其受感染的设备。完成此操作后,刷新JWT的请求将无法使用被盗令牌。

    所有这一切当然都是通过SSL发生的。

    我对我没有解决方案的担忧:

    • 如果JWT令牌被盗,攻击者有X小时根据受害者拨打电话。我认为这是令牌的本质和可接受的风险吗?

    • 如果JWT被盗,这意味着包含设备名称的HMAC令牌很有可能也被劫持,因此用户可以刷新令牌,直到受害者意识到他们的帐户遭到入侵并撤销访问权限为止。这是接受的做法吗?

1 个答案:

答案 0 :(得分:0)

加密的第一条规则是“不要滚动你自己的加密”https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own

请看一下https://jwt.io

上提供的各种库

我不是加密专家,所以我不打算说你的计划/工作流程正确或没有缺陷。 但是一些一般意见: 1)如果我将两个设备标记为“计算机”会怎样? 您是否考虑过如果每个人都拨打设备“手机”会发生什么?每个人都会拥有相同的HMAC设备令牌吗?

5)X小时后JWT令牌已过期,刷新时间不是太晚,定义一个清晰的刷新窗口。 例如。令牌在X小时后过期,然后无法刷新,尝试在X-1小时后刷新它。

您的第一个担忧:一旦令牌被盗,为时已晚。 目的是保护令牌,以便首先不会发生。

你的第二个问题: 如果我设法得到你的一个令牌,假设我得到了两个。 如果我有你的令牌,我就是你,我可以刷新令牌。 您可以考虑使用最大过期或最大刷新次数来限制此操作。