java - 通过 JAVA DataOutputStream 发送 key

标签 java datainputstream dataoutputstream secret-key javax.crypto

我正在开发一个使用对称 key +RSA的FTP工具。我想通过 dataoutputstream 将我的 key 发送到服务器。我该怎么做?我尝试关注,

客户端:

 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);

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

最佳答案

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

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

但是,如果您必须重新实现,则需要更改算法。保护私钥的最安全方法是首先绝不通过网络发送它。非对称加密允许您在客户端和服务器之间交换消息,而不会出现对称算法所存在的 key 协商问题。

这是一个可以解决 key 协商问题的算法:

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

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

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

关于java - 通过 JAVA DataOutputStream 发送 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28520158/

相关文章:

java - 尽管有缓冲,但从 Android 应用程序上传大文件会出现内存不足错误

java - 在 DataOutputStream 上同步

java - 在向 DAO 类发送日期时获取类转换异常

java - 如何将 setText 设置为所有 SeekBar 进度值的总和?

java - datainputstream 缺少字节 in.read(b)

java - Java如何从/sys/fs/cgroup/读取零长度文件?

java - DataOutputStream 发送了错误的数据

java - 在流上应用正则表达式来提取字符串

java - 如何扩展类<T extends class>

java - 来自 MappedByteBuffer 的 DataInputStream