正如大多数其他人指出的那样,您有一个问题,您正在以明文形式发送非对称密钥的最重要部分,其中密钥可以被截获。当然,您可以加密密钥,但这会引入其他需要解决的加密问题。如果您使用对称加密算法来加密密钥,则需要解决密钥协商问题。各方如何以安全的方式就密钥达成一致,以使第三方无法拦截它?
在某种程度上,您正在重新解决 SSL 已经解决的问题。为什么不直接使用它?SSL 也经过了实战考验,安全专家已经对其进行了 25 年的研究。开发自己的版本意味着您可能会陷入 SSL 开发人员已经遇到的类似陷阱。
但是,如果您必须重新实现,您将需要更改您的算法。保护私钥最安全的方法是从一开始就永远不要通过网络发送它。非对称加密允许您在客户端和服务器之间交换消息,而不会出现对称算法所具有的密钥协议问题。
这是一个可以解决关键协议问题的算法:
- 让服务器生成一个非对称密钥。两种选择:
- 一次生成一个非对称密钥(即在服务器启动时),所有连接都使用相同的密钥。
- 连接时为每个客户端生成一个非对称密钥,使其更加安全。
- 当客户端连接时,将服务器的公钥传输给客户端
- 客户端将为对称算法生成一个密钥(你如何选择算法?SSL 也解决了这个问题)。
- 客户端使用服务器的公钥加密此密钥
- 客户端将加密的密钥传输到服务器。
- 服务器使用其私钥解密消息以获得对称密钥。
- 现在服务器和客户端可以使用对称加密交换任何加密消息,第三方无法监听。
即使您这样做了,您仍然对中间人攻击持开放态度,在这种攻击中,当客户端与客户端和服务器交换消息时,第 3 方侦听器可以欺骗客户端和服务器通过第 3 方发送未加密的数据。只是一个简单的例子,说明如何自己实现这些东西可能会导致您创建一些比仅使用 SSL 更不安全的东西。
如果您确实发送加密的有效负载,您将需要放弃 DataInputStream 并使用直接二进制流,因此您不需要使用 Base64Encoding 将二进制有效负载转换为 UTF 字符串。