私钥泄露,如何分发新的 public 密钥?通过非对称密钥加密的客户端服务器模型

Private key compromised, how to distribute new public keys? Client server model via asymmetric key encryption

我正在尝试通过 libsodium 为应用程序设置 client/server 通信。到目前为止,我计划使用硬编码 public 密钥分发应用程序。服务器将保留其密钥而不共享它。这应该让用户加密消息并将它们发送到服务器,在那里密钥解密消息。

万一服务器上的密钥被泄露(我不确定如何,但以防万一)如何向所有客户端分发新的 public 密钥?有没有一种方法可以生成新的密钥而不需要分发新的 public 密钥?类似于:

make_new_secret( secret_buffer, previous_public );

我希望有一个非常简单的解决方案,不需要复杂的算法来安全地分发新的 public 密钥。如果必须在制作新私钥的同时制作新的 public 密钥,可以使用什么算法将 public 密钥从服务器安全地分发到客户端?

附加信息(随意跳过):

我们可以阅读 here Glenn Fiedler(使用 libsodium 的 libyojimbo 的作者)谈论 "just roll a new private key" 的想法。

如果有办法重新使用旧的 public 密钥并使用 libsodium 创建新的私钥,我很乐意阅读它。我已经浏览了文档,但还没有看到任何功能可以这样做。所以我担心我可能不得不深入研究更复杂的算法来安全地分发新的 public 密钥。

我查过了Diffie Hellman,不过好像需要双方共同开始"color"。所以我想我的问题是关于就起始颜色达成新的一致意见。

public/private 键始终是 pair(EC 有 2 个 public 键除外,它们本质上是一样的)。因此,如果您的服务器私钥被泄露或者您决定 roll 它,您需要客户端知道您的服务器新的 public 密钥。

挑战是真实的。如果硬编码,则必须 recompile/redistribute 向客户申请。

我不了解您的整个用例,但如果您尝试进行授权,请查看 OAUTH2,它将允许您从服务器向客户端发出临时(可在服务器上配置)令牌。在这种情况下,您可以撤销 OAUTH 令牌,以防服务器或客户端遭到破坏并且您(您的服务器)可以完全控制它。