2

我正在使用对称密钥 + RSA 开发 FTP 工具。我想通过 dataoutputstream 将我的密钥发送到服务器。我该怎么做?我试过跟随,

客户:

 SecretKey secretKey = en_de_cryptor.returnSecretKey();
 String encodedKey = Base64.encode(secretKey.getEncoded());
 dout.writeUTF(secretKey.toString());  

服务器:

String secretKey = din.readUTF();
byte[] decodedKey = Base64.decode(secretKey);

但我无法获得解码密钥。我该如何解决这个问题并在服务器端获取密钥。

4

2 回答 2

5

正如大多数其他人指出的那样,您有一个问题,您正在以明文形式发送非对称密钥的最重要部分,其中密钥可以被截获。当然,您可以加密密钥,但这会引入其他需要解决的加密问题。如果您使用对称加密算法来加密密钥,则需要解决密钥协商问题。各方如何以安全的方式就密钥达成一致,以使第三方无法拦截它?

在某种程度上,您正在重新解决 SSL 已经解决的问题。为什么不直接使用它?SSL 也经过了实战考验,安全专家已经对其进行了 25 年的研究。开发自己的版本意味着您可能会陷入 SSL 开发人员已经遇到的类似陷阱。

但是,如果您必须重新实现,您将需要更改您的算法。保护私钥最安全的方法是从一开始就永远不要通过网络发送它。非对称加密允许您在客户端和服务器之间交换消息,而不会出现对称算法所具有的密钥协议问题。

这是一个可以解决关键协议问题的算法:

  1. 让服务器生成一个非对称密钥。两种选择:
    1. 一次生成一个非对称密钥(即在服务器启动时),所有连接都使用相同的密钥。
    2. 连接时为每个客户端生成一个非对称密钥,使其更加安全。
  2. 当客户端连接时,将服务器的公钥传输给客户端
  3. 客户端将为对称算法生成一个密钥(你如何选择算法?SSL 也解决了这个问题)。
  4. 客户端使用服务器的公钥加密密钥
  5. 客户端将加密的密钥传输到服务器。
  6. 服务器使用其私钥解密消息以获得对称密钥。
  7. 现在服务器和客户端可以使用对称加密交换任何加密消息,第三方无法监听。

即使您这样做了,您仍然对中间人攻击持开放态度,在这种攻击中,当客户端与客户端和服务器交换消息时,第 3 方侦听器可以欺骗客户端和服务器通过第 3 方发送未加密的数据。只是一个简单的例子,说明如何自己实现这些东西可能会导致您创建一些比仅使用 SSL 更不安全的东西。

如果您确实发送加密的有效负载,您将需要放弃 DataInputStream 并使用直接二进制流,因此您不需要使用 Base64Encoding 将二进制有效负载转换为 UTF 字符串。

于 2015-02-14T22:14:42.917 回答
0
  1. 天哪,不要那样做!base64 不会给您任何安全性。使用加密,而不是编码
  2. 您发送 secretKey.toString (未编码)而不是 encodedKey
于 2015-02-14T21:46:52.763 回答