我正在开发一个使用对称密钥+RSA的FTP工具。我想通过数据输出流将我的密钥发送到服务器。我该怎么做?我试着跟随
客户:
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);
但我拿不到解码密钥。如何解决此问题并在服务器端获取密钥。
正如大多数其他人所指出的那样,您遇到了一个问题,即在明文中发送非对称密钥的最重要部分,在明文中可以截获密钥。当然你可以加密密钥,但这会带来其他需要解决的加密问题。如果使用对称加密算法对密钥进行加密,则需要解决密钥协议问题。双方如何以安全的方式就密钥达成一致,使第三方无法拦截?
在某种程度上,您正在重新解决SSL已经解决的问题。为什么不直接使用它呢?SSL也经过了战斗测试,安全专家已经研究了25年。开发自己的版本意味着您可能会陷入SSL开发人员已经遇到的类似陷阱。
但是,如果你必须重新实现,你将需要改变你的算法。保护私钥最安全的方法是首先不要通过网络发送私钥。不对称加密允许您在客户端和服务器之间交换消息,而不会出现对称算法存在的密钥协议问题。
以下是一种绕过密钥协议问题的算法:
- 让服务器生成一个非对称密钥。两个选项:
- 一次生成一个非对称密钥(即在服务器启动时),所有连接都使用相同的密钥
- 为每个客户端在连接时生成一个非对称密钥,使其更加安全
- 当客户端连接时,将服务器的公钥传输到客户端
- 客户端将为对称算法生成一个密钥(如何选择算法?SSL也解决了这个问题)
- 客户端使用服务器的公钥加密该密钥
- 客户端将加密的密钥传输到服务器
- 服务器使用其私钥解密消息以获得对称密钥
- 现在,服务器和客户端可以使用对称加密交换任何加密消息,第三方无法监听
即使你这样做了,你仍然对中间人攻击持开放态度在客户端与客户端和服务器交换消息时,第三方侦听器可以欺骗客户端和服务器通过第三方发送未加密的数据。这只是一个简单的例子,说明如何自己实现这些东西可能会导致您创建比使用SSL更不安全的东西。
如果你确实发送了加密的有效载荷,你会想放弃DataInputStream,转而使用直接的二进制流,这样你就不需要使用Base64Encoding将二进制有效载荷转换为UTF字符串。
- 天啊,别那样!base64不会给你任何安全性。使用加密,而不是编码
- 您发送secretKey.toString(未编码)而不是encodedKey