暴露的密钥对 JWT 令牌实现有什么影响?

信息安全 jwt
2021-08-21 10:16:53

我目前正在将JWT 实现用于我的 API 的身份验证部分。

私钥用于对生成的令牌进行签名,并用于确保它在以后用于其他 API 时不会被篡改。

我的问题是 - 如果这个私钥被泄露会有什么影响?坏人能用它做什么?

这里,我的理解是可以更改有效负载。因此,在该示例中,可以将普通用户更改为管理员。但在我的场景中,除了到期日期之外,我没有任何其他重要字段。

图片

所以除了坏人能够永远延长他自己的令牌有效期之外,我面临的其他影响是什么?

3个回答

拥有私钥的人可以创建有效令牌,而您的系统根本无法区分合法令牌和攻击者创建的令牌。

我猜您不仅使用了到期字段,还使用了主题字段 sub,简而言之就是登录用户。

使用私钥,我可以创建一个包含我想要的任何主题的令牌,从而以您系统的任何用户身份登录。

正如您所说,我还可以添加任何其他声明,并且您的系统别无选择,只能信任它,因为我能够创建一个有效的签名。

怎么强调都不为过,但是 JWT 严重依赖私钥来保持绝对私密。丢失私钥是最坏的情况。

泄露的私钥相当于仅使用标头和有效负载部分发布 JWT,并信任用户发送给您的任何此类 JWT。

如果私钥不是私有的,则签名部分不再提供保护,因此您不妨将其关闭。现在,您将使用更小的 JWT 节省带宽,并且无需生成或验证签名即可节省 CPU 时间!好的。;)

如果没有签名部分(无论是字面上的还是有效的),用户可以轻松地更新他们喜欢的标头和有效负载,并且您必须相信他们发送给您的内容就是您最初给他们的内容。

即使目前没有什么特别敏感的东西可以让恶意用户访问您的服务,但您将来可能会扩展您的功能,如果您仍在使用相同的泄露密钥,这将成为一个更大的问题。

我同意上面接受的答案,除了它是“最坏的情况”。我认为你不必那么害怕。在最坏的情况下,如果您的私钥泄露,您可以生成并使用一个新的。到目前为止,您拥有有效令牌的用户现在将拥有无效的令牌......因此他们必须重新进行身份验证等。这实际上取决于您首先使用令牌的上下文。

也许更糟糕的情况是您的私钥被泄露而您不知道。如果您的数据如此敏感,特别是如果您可以假设短期到期......在可以将用户踢出系统时定期生成并更新您的私钥可能不是一个坏主意。这样一来,泄露的私钥就不太可能造成破坏。

(对不起......我知道我不应该在我的答案中回复另一个答案,但我实际上不能对该答案添加评论,这是我更愿意做的!)