如果有人得到我的私钥和公钥,JWT 会发生啥?
Posted
技术标签:
【中文标题】如果有人得到我的私钥和公钥,JWT 会发生啥?【英文标题】:what happens to JWT if someone gets my private and public key?如果有人得到我的私钥和公钥,JWT 会发生什么? 【发布时间】:2019-02-19 09:10:56 【问题描述】:在我看来,如果我的私钥和公钥被泄露(我用来签名和验证 JWT),那么任何人都可以独立生成 JWT 令牌供自己在我的 API 上使用?
而另一方面,如果我自己生成了自己的令牌,并存储了一个“单向哈希用户 ID”=>“令牌”的查找表,那么如果有人闯入我的系统,他们就不会能够生成令牌以在我的 API 上使用,他们也将无法使用令牌(因为他们不知道哪个令牌属于哪个用户)
如果有人闯入你的系统并且它仍然是安全的,那么你就建立了一个安全的系统;没什么好担心的。
有了 JWT,在我看来,如果有人闯入,我确实有些担心。
【问题讨论】:
【参考方案1】:在我看来,如果我的私钥和公钥被泄露(我用来签名和验证 JWT),那么任何人都可以独立生成 JWT 令牌供自己在我的 API 上使用?
是的,没错。
公钥旨在公开并且可以分发。
另一方面,私钥应该是私有的,并且必须安全保存在您的服务器中。任何有权访问私钥的人都应该能够发行令牌。
泄露你的私钥是一个巨大的安全漏洞。
【讨论】:
哇。所以只是为了澄清一下,JWT 是否存在单点故障?例如,JWT 是否应该有更多功能 - 一个更好的实现,每个用户使用不同的私钥,或者系统不容易被操纵? @aman 您可以使用一组密钥来签署令牌并定期轮换它们。如果这样做,您可以在验证令牌时使用kid
标头声明来查找正确的密钥。请参阅此answer 以供参考。【参考方案2】:
而另一方面,如果我自己生成了自己的令牌,并且 存储了“单向哈希用户ID”=>“令牌”的查找表,
任何人都可以生成您的非密钥哈希。安全哈希涉及成为数字签名的私钥。现在我们回到原点,因为这正是 JWT 令牌。
或者,您将它们存储在数据存储中,但现在您必须在每次往返时查询它。大多数票据(cookie)/令牌认证系统使用公钥验证,无需数据库往返即可验证票据/令牌的有效性。
如果您将它们存储在数据存储中,现在您还必须在数据存储中跟踪过期时间。票证/代币可以内置到期时间。票据/令牌的好处是客户持有它们。您可以比身份验证更快地使会话过期。 IE。通常你会得到一张票,可以让你登录 2 小时,但是 web 服务器可以在 10 分钟内使你的会话过期,以减少内存使用。当您在 15 分钟内访问 Web 服务器时,它会看到您的票证/令牌并看到它仍然有效,并创建一个新会话。这意味着服务器在任何时间点都跟踪的空闲用户要少得多。
JWT 颁发者非常适合共享身份验证的分布式系统。我们不是在每个系统中重新实现身份验证,而是将多个系统暴露给私钥以及身份验证中的潜在错误,而是将其集中到一个系统中。我们还可以利用生成 JWT 的第三方集成商。我们需要做的就是获取他们的公钥来验证 JWT。
如果有人闯入您的系统并且它仍然是安全的,那么您 建立了一个安全的系统;没什么好担心的。
我现在有您保存在数据库中的随机数列表,并且可以以任何人身份登录。我也可能有你的连接字符串,即使你正在加密你的应用程序配置,如果我有 root 访问权限,那么我可以访问应用程序用来解密它们的同一个密钥存储。现在,我从您的数据库中获取您的用户名/密码,并且可以以任何人身份登录,无论您使用什么身份验证方案。
您将很难找到一个在某人获得对机器的 root 或物理访问权限后仍然安全的系统。
有少数系统具有专门构建的硬件来存储密钥并通过接口处理加密操作请求,从而确保密钥在硬件级别受到保护并且永远不会直接从软件访问:
https://en.wikipedia.org/wiki/Hardware_security_module
【讨论】:
【参考方案3】:在我看来,如果我的私钥和公钥被泄露(我用来签名和验证 JWT),那么任何人都可以独立生成 JWT 令牌供自己在我的 API 上使用?
还指出您需要确保您的私钥安全,保持其安全的最佳方法是使用 HSM 对您的数据进行签名,在这种情况下,您可以扩展 JWT 生成器以通过加密对数据进行签名dll 在 HSM 中,这确保了私钥永远不会暴露在 HSM 之外
【讨论】:
以上是关于如果有人得到我的私钥和公钥,JWT 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章