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 文件以使用新的密钥对进行更新......类似于这个:
例如,每隔 15 秒,EC2 身份验证服务器和资源服务器 ping 密钥服务器,请求当前 jks 的副本(和版本检查)。
有什么建议吗?
谢谢!
JWT RSA 密钥大小
将 RSA 密钥更正为 2048 位,即当前推荐的大小(2020 年)。
1024 位 RSA 密钥被认为是弱密钥,NIST 在处理高度机密信息时已禁止使用该密钥。 (提示:中央身份验证系统尽可能保密)。只要有足够的计算能力,它就可以被破解,记住比任何大型组织都可以访问拥有 10k CPU 的数据中心。
4096 个密钥是可能的,但验证速度可能比 2048 慢 10 倍(复杂性与大小不成线性关系)。仔细考虑性能影响。身份验证令牌将在任何地方使用并经过无数次验证。
请参阅有关我应该为我的 SSL 证书使用什么 RSA 密钥长度的相关答案?
JWT 密钥轮换
假设 JWT 沿 OpenID Connect (OIDC) 使用。
可以在像
应用程序应在启动时检索公钥并定期刷新它们。多久没有正式的标准?
- 通常的做法是在 1 小时到 1 周之间定期检索密钥。
- 定期自动重启的应用程序(Web 容器)可能会在启动时加载密钥,而在运行期间不会主动刷新它们。
- 服务器通常有一个预定的重启周期(可能是每月或每季度),对任何东西可以运行的时间设置一个上限。
- 一个例子:Apache 插件 mod_auth_openidc 默认每小时检索一次密钥。设置 OIDCUserInfoRefreshInterval
现有令牌在其签名密钥被轮换时失效,如果应用程序没有跟上较新的签名密钥,则不接受新令牌。因此,要使事情顺利进行,需要考虑一些界限。
- 通常的做法是在 1 到 12 个月之间定期轮换密钥。
- Okta 为他们的示例提供了 90 天的密钥。
- 像 Facebook 这样的网站几乎从不要求用户重新进行身份验证(几个月?几年?你曾经不得不再次登录吗?)所以那里的签名密钥必须持续几个月,而银行网站不需要支持多个月的会话。
- 通常比每月更频繁地轮换密钥是没有意义的。它只突出显示软件重新加载不够频繁的细微问题,并防止进行"长时间"会话。
我个人的建议是确保最大的安全性和最少的麻烦,我曾在大型组织的数千个系统中管理数千个应用程序的单点登录。
- 签名密钥有效期为 1 年。
- 签名密钥每 6 个月轮换一次。
-
这意味着始终至少有 2 个可从
/.../keys 获得的密钥。一个活动密钥和一个未来密钥等待替换它。 - 好处:
- 这使应用程序有足够的时间来获取下一个密钥(6 个月),无论是通过主动刷新还是通过被动重启。
- 6 个月的时间足够长,可以将密钥硬编码到库/应用程序中,以用于需要它的特殊用例。例如,我们有类似 HPC 的计算集群,一次部署 10000 个任务/进程,如果其中每个都试图在启动时远程获取密钥,这可能会导致 OIDC 服务器的 DDoS 崩溃。
- 必须经常轮换(绝对最高 6 个月)才能正常工作和进行测试。如果开发人员执行了一些集成并且不能很好地处理轮换,它将在 6 个月内崩溃,他们可以修复它(希望仍处于测试阶段或用户有限)。如果轮换发生在 2 年后,没有人会注意到它会崩溃,直到它崩溃并且没有人修复它,所有原始开发人员早已离开。
分布式拒绝服务
顺便说一句,时间线从来都不是以秒为单位的,这个问题提到秒很有趣。
公司中的所有事物都依赖于身份验证系统,当"所有事物"(数以千计的服务)每隔几秒(甚至几分钟)尝试 ping 同一个服务时,这是理解认证概念的快速方法永久性意外 DDoS。
JWT 的主要目标之一恰恰是不需要中央服务来验证令牌(大量持续加载的单点故障)。您可以通过仅在启动时远程加载签名密钥来实现限制依赖项的目标(假设您运行的服务会定期重新启动)。