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

Is it sensible to use a public and private key encryption between a client server model?

我想让我的服务器更难模仿的计划如下;

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

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

如何才能让每个客户端都拥有 public 密钥,而服务器拥有私钥?一点线索都没有。

编辑 -

因为我不希望客户端必须有用于 public 密钥的额外文件,我可以允许他们在运行时下载 public 密钥吗?如果我将它保存在服务器上并喜欢序列化它?怎么样?

Is it sensible to use a public and private key encryption between a client server model?

一句话?不,至少不是你描述的那样。

您可以按照描述让它工作,但您创建的是安全区,而不是有效的安全性。

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

Because I do not want the clients to have to have extra files for the public key, can I allow them to download the public key on runtime? If I hold it on the server and like serialize it? How?

如果您使用 CA 签名证书(来自内部或外部 CA),您可以从目标服务器动态获取证书。您唯一需要存储的是信任库中的签名者链以及主题可分辨名称和发行者可分辨名称的可接受值。如果签名者证书不在 Trust Store 中,远程证书将不会验证,因此中间人不能只是换出具有正确专有名称的任何证书。一旦它验证到您的信任库,您对专有名称的检查将确定您是否拥有正确的证书和服务器。

最后,这个问题根本没有提到撤销。如果您使用来自商业 CA 或至少有点健壮的内部 CA 的 CA 签名证书,您可以在 运行 时间检查证书吊销列表或使用在线证书状态协议。同样,这些 内置于 TLS 协议中,在任何 JSSE 标准提供程序中实现。