当前位置: 首页 > 知识库问答 >
问题:

RSA JWT密钥轮换周期?

公孙俊弼
2023-03-14

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

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

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

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

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

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

由于4096位验证过程需要更长的时间,我在“速度”方面提出了建议,但由于刷新令牌的请求似乎较少,安全性的权衡似乎是公平的。

另一方面,访问令牌在资源服务器endpoint进行验证,并且它们发送得更频繁,所以我选择了一个更短的(256)签名,它是用更快的1024位密钥预先形成的。

我知道钥匙“实际上”是不可能被打破的。。。但建议使用旋转键吗?

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

我需要刷新/形成新密钥吗?如果是的话。。。多久?推荐的方法是什么?

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

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

有什么建议吗?

非常感谢。

共有1个答案

诸正谊
2023-03-14

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

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

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

有关SSL证书应使用的RSA密钥长度,请参阅相关答案。

假设JWT沿着OpenID Connect(OIDC)使用。

活动的JWT公钥可以在像/这样的endpoint上从OIDC服务器获得。知名/钥匙。请参阅OIDC服务器的文档。

应用程序应该在启动时检索公钥,并定期刷新它们。没有关于频率的正式标准?

  • 通常的做法是在1小时到1周之间定期检索密钥

现有令牌在其签名密钥被旋转关闭时失效,如果应用程序没有跟上新的签名密钥,则不接受新令牌。因此,有必要考虑事情能否顺利进行。

  • 通常的做法是在1到12个月之间周期性地旋转关键点

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

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

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

身份验证系统依赖于公司中的一切,当“一切”(数千个服务)试图每隔几秒钟(甚至几分钟)ping相同的服务时,这是理解永久意外DDoS概念的快速方法。

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

 类似资料:
  • Targets key To be discussed in order to avoid _Warning: potential malicious behavior - trust data has insufficient signatures for remote repository .dkr.ecr.us-east-1.amazonaws.com/app: valid signatur

  • Snapshot key To rotate the snapshot key: ❯ notary -D -v -s https://127.0.0.1:4443 -d ~/.docker/trust key rotate <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/app snapshot -r Enter passphrase for ne

  • Timestamp key The timestamp key can also be rotated: ❯ notary -D -v -s https://127.0.0.1:4443 -d ~/.docker/trust key rotate <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/app timestamp -r Enter the

  • 我在GCP中有一个服务帐户,我将其密钥保存在一个秘密管理器中。 是否有办法为该保密服务帐户密钥设置计划的秘密轮换,以便发布/订阅将是GCP密钥,而不是由我管理?GCP是否提供此类托管发布/订阅服务?

  • 我目前正在使用Aptana Studio3.6.1(一个带有一些PHP语法修复的自定义构建)。我使用SFTP将文件从我的项目上传到一个测试站点,使用发布工具(项目顶部的上传/下载箭头)。 最近,我变得无法上传文件。WinSCP可以很好地执行这些操作,并且我可以在使用PuTTY或普通旧OpenSSH时将SSH插入服务器而没有问题。然而,Aptana却大发雷霆: auth.log(带有LogLevel

  • 我正在升级一个平台上的安全。但是,我无法破解如何安全地存储我的加密/解密密钥。 当前安装程序: MySQL Server Webserver 我需要使用aes_encrypt/aes_decrypt存储和读取数据库中的所有敏感数据。但是,加密/解密数据的密钥我想要安全地存储。因此,当某人获得数据库或Web服务器的访问权时,他们将无法轻易猜出组合键或从配置文件中读取组合键。 密钥可以根据我需要读/写