我的计划是让我的服务器更难以模拟,如下所示;
客户端创建一个随机字符串,String random;
然后该字符串被加密并发送到服务器。然后服务器解密并将其发回,如果发回的与随机的相同,则它们连接到正确的服务器(而不是具有差异私钥的假服务器)。
如何才能让每个客户端都有公钥,而服务器持有私钥?没有任何线索。
编辑-
因为我不希望客户端必须有额外的公钥文件,所以我可以允许他们在运行时下载公钥吗?如果我将它保存在服务器上并喜欢序列化它?怎么办?
最佳答案
Is it sensible to use a public and private key encryption between a client server model?
一句话?不,至少不是你描述的那样。
您可以按照描述的方式使其工作,但您将创建安全剧场而不是有效的安全性。
- 如果您使用未绑定(bind)到证书的公钥/私钥对,则会遇到 key 交换问题。正如评论中所述,如果应用程序只是从它连接的服务器下载 key ,并且该 key 不在证书中,则无法判断它对于目标服务器来说是真实的。
- 如果您使用绑定(bind)到证书的公钥/私钥,它可以解决您的 key 交换问题,因为您可以从目标服务器下载证书并检查主题可分辨名称和颁发者可分辨名称以发现您拥有的公钥是否真实。但是,一旦您不厌其烦地部署证书,只需使用 TLS 即可。它就在那里,它是可靠的,最重要的是,它已经过彻底的改进并修复了已知的错误,因此它与我们现有的一样值得信赖。您自己开发的协议(protocol)不是。
- 您所描述的内容可以通过其他标准协议(protocol)来实现,例如质询握手身份验证协议(protocol) (CHAP)。如果 TLS 不能满足您的要求,请使用标准协议(protocol)。即使是一个已弃用的旧版本也比您自己编写更好,因为它与 TLS 一样,在现实世界中已经得到了广泛的应用。
- 假设您确实实现了提议的协议(protocol),然后呢?进行身份验证然后以明文方式进行通信?为什么要花费比实现 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),您可以从目标服务器动态获取证书。您唯一需要存储的是信任存储中的签名者链以及主题可分辨名称和发行者可分辨名称的可接受值。如果签名者证书不在信任存储中,则远程证书将不会验证,因此中间人不能仅用正确的可分辨名称交换任何证书。一旦它通过您的信任库验证,您对专有名称的检查将确定您是否拥有正确的证书和服务器。
最后,这个问题根本没有提到撤销。如果您使用来自商业 CA 或来自至少有些稳健的内部 CA 的 CA 签名证书,则可以在运行时根据证书吊销列表进行检查或使用在线证书状态协议(protocol)。同样,这些内置任何 JSSE 标准提供程序中实现的 TLS 协议(protocol)中。
关于java - 在客户端服务器模型之间使用公钥和私钥加密是否明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819593/