我的 JWT 更新计划安全吗?

信息安全 验证 移动的 oauth 令牌
2021-08-26 16:43:06

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

我有我想在我的应用程序中实施的建议工作流程。这是可以接受的安全吗?高效的?我正在监督有什么明显的问题吗?可以做出哪些合理的改进?

用户登录

  1. 如果本地存储中不存在 HMAC 签名令牌,则用户为设备命名。
  2. DeviceName 被发送到它被插入数据库的服务器。
  3. DeviceName 的 JWT 令牌 + HMAC 签名令牌发送回用户。放置 HMAC 签名令牌以确保 jwt 令牌(包含 DeviceName)是从最初调用它的同一设备发送的。
  4. JWT 令牌在 X 小时内有效,因此用户可以在 X 小时内拨打任何电话。
  5. X 小时后,JWT 过期。当发出请求时,服务器可以看到 JWT 已过期。服务器现在将尝试刷新 JWT 令牌。服务器检查数据库以查看 HMAC 签名令牌中指定的 DeviceName 是否与数据库中该用户的有效设备名称相同。
  6. 如果是,则创建另一个 X 小时有效的新 JWT,如果否,则发回消息以要求登录。

如果帐户被盗:

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

当然,所有这些都发生在 SSL 上。

我没有解决方案的担忧:

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

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

2个回答

在什么领域内可以接受的安全?

您已经描述了所有不记名令牌的基本流程。持有令牌的人拥有权力。您确实有一个条件可以检查令牌是否已被撤销,但这意味着令牌在到期或被撤销之前一直有效。这与检查用户在数据库中是否有效基本相同,但是您将用户替换为设备 + JWT。这很好,但这并没有带来太多的性能提升。

其他系统使用两个 JWT(或一个 JWT 和一个不透明令牌)。第一个 JWT 是您使用的访问令牌,主要像您描述的那样使用,但您不检查撤销。这个令牌的寿命很短——可能是 20 分钟 -> 1 小时,然后你的刷新令牌的寿命要长得多。当您的访问令牌过期时,您发送刷新令牌,如果刷新令牌仍然有效,您将发出一个新的访问令牌。如果刷新令牌已过期,您可以再次强制身份验证,或者只是发出新的访问和刷新令牌。

这里的价值是您只需要针对数据库验证刷新令牌,并且您只需要在访问令牌过期时执行此操作。当用户将刷新令牌标记为已撤销时,刷新令牌不会让攻击者获得新的访问令牌。

权衡是您不会经常查询数据库,但只要访问令牌有效,攻击者就可以为所欲为。使用非常短暂的令牌(它是一种赔率游戏)可以缓解这种情况。这是否是可接受的风险完全取决于您。我们不规定您是否应该接受风险。:)

安全性始终是相对的,通过更多的努力,我们可以让任何人滥用系统变得更加困难。承载令牌受 IO 限制(缓存/数据库调用),而 JWT 令牌受 CPU(加密/解密)限制。除了我们在此处针对移动设备采取的一件事外,两者对于常规服务领域来说都是足够好的解决方案。此处可以使用的一种方法是通过反向通道将令牌/刷新令牌发送到设备,而不是将其作为身份验证的一部分发送。似乎有些额外的工作,但在为移动设备发布和刷新令牌方面提供了更多的安全性。更多细节可以在这里找到http://sdhankar.com/2016/10/24/authentication-and-jwt-token-refresh-on-mobile-devices/