所以我制作了一个严重依赖安全性和加密的基本聊天应用程序。我在使一切工作在一起时遇到了一些问题。
我已经设法在客户端和服务器之间建立连接,但我也想让他们共享一个共同的密码,他们将用它来解密整个聊天会话,所以只有那两个人才会查看它。此外,密码永远不会通过电线传输,以增加安全性。这是我的问题开始的地方。
一旦我的客户端和服务器连接,服务器就会发送一个用户指定的质询,这个质询基本上是客户端需要解密并发回的字符串,然后服务器会看到它是否匹配,以及它是否进行通信将继续,就像WiFi中的WPA加密一样。
我的加密设置是AES,我有一个字符串和一个密钥,然后整个东西被加密并解码成Base64,然后发送。解密时,该过程显然会逆转。服务器设法正常发送所有内容,但客户端在解密时返回null,即使它正确接收加密的字符串。我基本上有一个类充当客户端或服务器,具体取决于用户的选择。
下面是一些代码/堆栈跟踪: 服务器输出:KCcOYuXTUD6SaXJQ4qIn7Q == 的HelloWorld
客户输出:KCcOYuXTUD6SaXJQ4qIn7Q == 空
加密/解密方法:http://pastebin.com/TtErYyz6
套接字写作/阅读方法:http://pastebin.com/73QcQxva
客户端的Stacktrace:http://pastebin.com/NdexZdyV 注意:当逐行调试时,它只是在插槽pastebin链接
中停止了27希望我已经包含了足够的细节来获得解决方案:P 感谢您的帮助,我一直在努力完成这个项目,即使有些功能是不必要的,我仍然会尝试在适用的地方实施它们,以便在下个月开始编程学位时尽可能多地学习
答案 0 :(得分:1)
我在主机验证码(verifyHost功能)中发现了一些问题。
首先,字符串比较很棘手:
if(tempChallenge == decryptedChallenge){
您正在将字符串与==进行比较,这只有在它们是相同的字符串对象时才有效。使用String.equals函数进行适当的字符串比较:
if( decryptedChallenge.equals(tempChallenge) ){
其次,输入流也很棘手。您正在从输入流中读取所有内容,然后尝试阅读更多内容。服务器在挑战中向客户端发送一行,并期待一行。客户端读取3行。
第三,服务器代码中的CPU进入循环。它将消耗大量的CPU,并且调用in.readline()
将阻塞并等待任何输入。
while(!in.ready()){} // you can drop this line.
以下是带有修改后代码的pastebin:http://pastebin.com/JxazrA0G