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

时间:2017-03-15 20:01:08

标签: java security rsa

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

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

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

如何使每个客户端拥有公钥并且服务器拥有私钥?不是线索。

编辑 -

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

1 个答案:

答案 0 :(得分:1)

  

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

总之一句话?不,至少不是你描述它的方式。

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

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

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

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

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

相关问题