关于安全性:RSA JWT 密钥轮换周期?

RSA JWT key rotation period?

我已经创建了一个基本的 JWT 生成器,但需要一些方面的建议。我一直在使用 JWT.io 的指南和 auth0/java-jwt 库/repo 来生成令牌。

JWT 使用 2 个不同的密钥进行签名。

正在使用 RSA512 算法使用 4096 位密钥对刷新令牌进行签名。

1
.sign(Algorithm.RSA512(rsaPublicKey, rsaPrivateKey));

正在通过 RSA256 算法使用 1024 位 RSA 密钥对访问令牌进行签名。

1
 .sign(Algorithm.RSA256(rsaPublicKey, rsaPrivateKey));

我已经提出了关于"速度"的建议,因为 4096 位验证过程需要更长的时间,但似乎刷新令牌的请求较少,安全性的权衡似乎是公平的。

另一方面,访问令牌在资源服务器端点进行验证,并且它们被更频繁地发送,因此我选择了使用更快的 1024 位密钥执行的较短 (256) 签名。

我知道钥匙"几乎"不可能被破坏...但是建议轮换钥匙吗?

我将 jks(密钥库)保存在身份验证服务器和资源服务器上的私有文件夹中。
密钥库包含 2 个密钥对,一个用于刷新令牌签名/验证,一个用于访问令牌签名/验证。

我需要刷新/形成新密钥吗?如果是这样……多久一次?
推荐的方法是什么?

负载均衡器后面可以有多个身份验证和资源微服务实例...因此 RAM 生成的密钥是否,因为它们不会在实例之间传播。

我已经看过可能有一个"密钥服务器",它可以说创建新密钥并将它们附加到密钥库并分发新的 jks 文件以使用新的密钥对进行更新......类似于这个:
File

我个人的建议是确保最大的安全性和最少的麻烦,我曾在大型组织的数千个系统中管理数千个应用程序的单点登录。

  • 签名密钥有效期为 1 年。
  • 签名密钥每 6 个月轮换一次。
  • 这意味着始终至少有 2 个可从 /.../keys 获得的密钥。一个活动密钥和一个未来密钥等待替换它。
  • 好处:
  • 这使应用程序有足够的时间来获取下一个密钥(6 个月),无论是通过主动刷新还是通过被动重启。
  • 6 个月的时间足够长,可以将密钥硬编码到库/应用程序中,以用于需要它的特殊用例。例如,我们有类似 HPC 的计算集群,一次部署 10000 个任务/进程,如果其中每个都试图在启动时远程获取密钥,这可能会导致 OIDC 服务器的 DDoS 崩溃。
  • 必须经常轮换(绝对最高 6 个月)才能正常工作和进行测试。如果开发人员执行了一些集成并且不能很好地处理轮换,它将在 6 个月内崩溃,他们可以修复它(希望仍处于测试阶段或用户有限)。如果轮换发生在 2 年后,没有人会注意到它会崩溃,直到它崩溃并且没有人修复它,所有原始开发人员早已离开。

分布式拒绝服务

顺便说一句,时间线从来都不是以秒为单位的,这个问题提到秒很有趣。

公司中的所有事物都依赖于身份验证系统,当"所有事物"(数以千计的服务)每隔几秒(甚至几分钟)尝试 ping 同一个服务时,这是理解认证概念的快速方法永久性意外 DDoS。

JWT 的主要目标之一恰恰是不需要中央服务来验证令牌(大量持续加载的单点故障)。您可以通过仅在启动时远程加载签名密钥来实现限制依赖项的目标(假设您运行的服务会定期重新启动)。