【问题标题】:Can Json web token sign with public key?Json web token 可以用公钥签名吗?
【发布时间】:2017-10-28 02:30:48
【问题描述】:

我看到 JWT 可以用私钥对 JSON 对象进行签名,并通过公钥进行验证。

我认为可以使用 JWT 使用 JWT 对 API 请求有效负载进行签名。 但是,我不想使用私钥,而是使用公钥对 API 请求有效负载进行签名,并使用我的私钥在服务器端对其进行验证。这有没有可能?正如我所见,实现 JWT 的库似乎只用私钥签名并通过公钥验证。

难道不能用公钥签名吗?

谢谢

【问题讨论】:

  • 用公钥签名没有意义,因为公钥应该对所有人都可用(它被称为公共)。如果有人可以签名,你想如何证明你从正确的人或机器那里得到了一些信息?也许您正在寻找 JSON Web Encryption (JWE)。你能描述一下你的使用场景吗?为什么您认为使用公钥签名对您有任何帮助?
  • “难道不能用公钥签名吗?” - RSA 背后的数学允许它,但这违反了 JWT 规范,所以不,你不会找到一个允许它的 JWT 库。
  • @ArtjomB。哦! ya...你指出了我没有想到的一点。实际上,我想添加一个额外的安全级别,以确保 API 仅从我的应用程序调用,而没有其他应用程序调用。因此,我正在考虑签署看起来可能适用于 JWT 的请求
  • 不需要为此使用 JWT。只需将 API 密钥(一些对称令牌)添加到您的应用和 API。这很容易实现,并且具有与您设想的解决方案类似的安全保证(没有任何保证)。问题是用户总是可以对您的应用程序进行逆向工程并提取公钥或 API 密钥。您绝对应该做的是使用公钥固定(我假设您的 API 可以通过 HTTPS 访问)。

标签: cryptography jwt


【解决方案1】:

棘手的问题,但我会尽力而为。 JWT 在下面使用 RSA,在 RSA 中 publicprivate key 是“可互换的”。一般来说,publicprivate 密钥只能通过生成后的处理方式来理解它们的含义。

您发送过来的那个,例如其他人知道的未加密频道称为“公钥”。 你隐藏并且从不给任何人的那个叫做“私钥

所以应该可以使用服务器的公钥来加密某些东西(就像在 JWT 令牌过程中所做的那样)并将其发送到服务器。服务器需要相应的私钥来解密。

(请注意,设计上的“服务器公钥”对于可能的攻击者来说是已知的,并且每个攻击者通常都能够使用它来生成那些 JWT 令牌。我不知道在这里了解您的用例,以便为您提供适当的建议。)

这里唯一的陷阱是 JWT 的实际实现(遗憾的是我没有足够的知识)。 JWT 可以向其中一个“密钥”添加一些额外的数据,并将整个对象称为“public”或“private key”,从而破坏“可互换性”......唯一的方法是挖掘 JWT 的文档(希望找到一些东西)或通过源代码,或者只是尝试一下:/

如果您尝试一下,请让社区知道 :)

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 2016-03-20
    • 2017-11-12
    • 2019-11-24
    • 2012-03-01
    • 1970-01-01
    • 2019-11-24
    • 2018-11-26
    • 2013-05-28
    相关资源
    最近更新 更多