Tyr*_*ron 2 java dataoutputstream secret-key datainputstream javax.crypto
我正在使用对称密钥+ RSA开发FTP工具.我想通过dataoutputstream将我的密钥发送到服务器.我可以这样做吗?我试过跟着,
客户:
SecretKey secretKey = en_de_cryptor.returnSecretKey();
String encodedKey = Base64.encode(secretKey.getEncoded());
dout.writeUTF(secretKey.toString());
Run Code Online (Sandbox Code Playgroud)
服务器:
String secretKey = din.readUTF();
byte[] decodedKey = Base64.decode(secretKey);
Run Code Online (Sandbox Code Playgroud)
但我无法获得解码密钥.我该如何解决这个问题,并在服务器端获取密钥.
正如大多数其他人所指出的那样,您有一个问题,即您正在以明文形式发送非对称密钥的最重要部分,其中可以拦截密钥.当然你可以加密密钥,但这会引入其他加密问题来解决.如果使用对称加密算法来加密密钥,则需要解决密钥协议问题.双方如何以安全的方式就密钥达成一致,以便第三方不能拦截它?
在某种程度上,您正在重新解决SSL已经解决的问题.为什么不用它呢?此外,SSL已经过测试,安全专家已经过了25年.开发自己的版本意味着您可能陷入SSL开发人员已遇到的类似陷阱.
但是,如果必须重新实现,则需要更改算法.保护私钥的最安全方法是首先不要通过网络发送私钥.非对称加密允许您在客户端和服务器之间交换消息,而不存在对称算法具有的密钥协商问题.
这是一个解决密钥协议问题的算法:
虽然你做到了这一点,你仍然可以在中间攻击中对人开放,第三方监听器可以欺骗客户端和服务器通过第三方发送未加密的数据,因为客户端与客户端和服务器交换消息.只是一个简单的示例,说明如何自己实现这些东西可能会导致您创建一些不仅仅使用SSL的安全性.
如果您确实发送了加密的有效负载,那么您将希望抛弃DataInputStream并使用直接二进制流,因此您无需使用Base64Encoding将二进制有效负载转换为UTF字符串.
| 归档时间: |
|
| 查看次数: |
1467 次 |
| 最近记录: |