Security RSA JWT密钥轮换周期?

Security RSA JWT密钥轮换周期?,security,jwt,token,jks,Security,Jwt,Token,Jks,我已经创建了一个基本的JWT生成器,但需要在几个方面提供建议。我一直在使用的指南和库/repo制作代币 JWT使用2个不同的密钥进行签名 正在使用RSA512算法使用4096位密钥对刷新令牌进行签名 .sign(Algorithm.RSA512(rsaPublicKey, rsaPrivateKey)); 访问令牌通过RSA256算法使用1024位RSA密钥进行签名 .sign(Algorithm.RSA256(rsaPublicKey, rsaPrivateKey)); 由于4096位验

我已经创建了一个基本的JWT生成器,但需要在几个方面提供建议。我一直在使用的指南和库/repo制作代币

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

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

.sign(Algorithm.RSA512(rsaPublicKey, rsaPrivateKey));
访问令牌通过RSA256算法使用1024位RSA密钥进行签名

 .sign(Algorithm.RSA256(rsaPublicKey, rsaPrivateKey));
由于4096位验证过程需要更长的时间,因此我对“速度”提出了建议,但由于刷新令牌的请求较少,因此安全性的权衡似乎是公平的

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

我知道键“实际上”是不可能断开的…但建议旋转键

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

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

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

我已经看过一个“密钥服务器”,它可以说创建新的密钥并将它们附加到密钥库中,然后抛出新的jks文件以使用新的密钥对进行更新。。。与此类似:

例如,每隔15秒,EC2身份验证服务器和资源服务器ping密钥服务器,请求当前jks的副本(和版本检查)

有什么建议吗

谢谢大家!

JWT RSA密钥大小调整 将RSA密钥更正为2048位,这是当前建议的大小(2020年)

1024位RSA密钥被视为弱密钥,NIST禁止在处理高度机密信息时使用。(提示:中央认证系统是保密的)。只要有足够的计算能力,它就可以被破解,记住任何大型组织都无法使用10k+CPU访问数据中心

4096个密钥是可能的,但验证速度可能比2048慢10倍(复杂性与大小不成线性关系)。仔细考虑性能影响。认证令牌将在任何地方使用,并经过无数次验证

请参见

JWT键旋转 假设JWT沿着OpenID连接(OIDC)使用

活动的JWT公钥可以从OIDC服务器在类似
/.well-known/keys
的端点上获得。请参阅OIDC服务器的文档

应用程序应在启动时检索公钥,并定期刷新它们。有没有一个正式的标准,以多久

  • 通常的做法是在1小时到1周之间定期检索密钥。
  • 定期自动重新启动的应用程序(web容器)可能会在启动时加载密钥,而不会在运行期间主动刷新密钥
  • 服务器通常有一个预定的重新启动周期(可能是每月或每季度),对任何东西的运行时间都有一个上限
  • 一个例子:Apache插件默认每小时检索一次密钥。背景
现有令牌在其签名密钥被旋转关闭时无效,如果应用程序没有跟上新的签名密钥,则不接受新令牌。因此,有必要考虑事情是否正常运行。
  • 通常的做法是在1到12个月之间定期旋转按键。
  • Okta提供90天的钥匙
  • 像Facebook这样的网站几乎不需要用户重新认证(数月?数年?你是否需要再次登录?),因此在那里签名密钥必须持续数月,而银行网站不需要支持多个月的会话
  • 通常情况下,没有必要比每月更频繁地旋转按键。它只会突出显示软件没有足够频繁地重新加载的细微问题,并阻止进行“长”会话
我个人的建议是确保最大的安全性和最小的麻烦,在大型组织中管理了跨越数千个系统的数千个应用程序的单点登录

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

当“everything”(数千个服务)每隔几分钟就尝试ping同一个服务时,公司中的所有东西都依赖于身份验证系统