在客户端服务器模型之间使用公钥和私钥加密是否明智?



我使服务器更难模拟的计划如下;

客户端创建一个随机字符串,字符串随机;

然后,此字符串将被加密并发送到服务器。然后服务器对其进行解密并将其发回,如果发回的服务器与随机相同,则它们连接到正确的服务器(而不是带有差异私钥的假服务器)。

我怎样才能做到每个客户端都有公钥,服务器持有私钥?没有线索。

编辑-

因为我不希望客户端必须有额外的公钥文件,所以我可以允许他们在运行时下载公钥吗?如果我把它放在服务器上并喜欢序列化它?如何?

在 客户端服务器型号?

一句话?不。 至少不是你描述的方式。

您可以按照描述使其工作,但您将创建安全剧院而不是有效的安全性。

  • 如果使用绑定到证书的公钥/私钥对,则会遇到密钥交换问题。 如评论中所述,如果应用程序只是从它连接的服务器下载密钥,并且该密钥不在证书中,则无法判断它对目标服务器是真实的。
  • 如果使用绑定到证书的公钥/私钥,则可以解决密钥交换问题,因为您可以从目标服务器下载证书并检查主题可分辨名称和颁发者专有名称以发现您拥有的公钥是否真实。 但是,一旦您遇到了部署证书的麻烦,只需使用 TLS。 它就在那里,它是可靠的,最重要的是,它已经被彻底打击并修复了已知的错误,因此它与我们可用的一样值得信赖。 你自己制定的协议不是。
  • 您所描述的内容可以通过其他标准协议(如质询握手身份验证协议 (CHAP))来实现。 如果 TLS 不符合你的要求,请使用标准协议。 即使是旧的弃用版本也比编写自己的版本更好,因为与TLS一样,它在现实世界中得到了广泛的打击。
  • 假设您确实实施了提议的协议,那又如何呢? 进行身份验证然后以明文形式进行通信? 为什么要花费比实施TLS更多的精力来部署远不如TLS安全的东西,甚至不提供传输数据的隐私或完整性?

因为我不希望客户端必须为 公钥,我可以允许他们在运行时下载公钥吗?如果 我把它放在服务器上,喜欢序列化它?如何?

如果使用 CA 签名证书(来自内部或外部 CA),则可以从目标服务器动态提取证书。 您唯一需要存储的是信任存储中的签名者链以及使用者可分辨名称和颁发者专有名称的可接受值。 远程证书不会验证签名者证书是否不在信任存储区中,因此中间人无法将任何证书换成具有正确可分辨名称的证书。 验证到信任存储区后,对可分辨名称的检查将确定您是否具有正确的证书和服务器。

最后,这个问题根本没有提到撤销。 如果使用来自商业 CA 或至少在某种程度上可靠的内部 CA 的 CA 签名证书,则可以在运行时根据证书吊销列表或使用联机证书状态协议进行检查。 同样,这些都内置于任何JSSE标准提供程序中实现的TLS协议中。

最新更新