0

所以我制作了这个非常依赖安全和加密的基本聊天应用程序。在使所有内容协同工作时,我遇到了一些问题。

我已经设法在客户端和服务器之间建立了连接,但我也希望他们共享一个公共密码,他们将使用该密码来解密整个聊天会话,因此只有这两个会查看它。此外,密码永远不会通过网络传输以增加安全性。这就是我的问题开始的地方。

一旦我的客户端和服务器连接,服务器就会发送一个用户指定的质询,该质询基本上是一个字符串,客户端需要解密并发送回该字符串,然后服务器会查看它是否匹配,如果匹配,通信将继续,很像 WiFi 中的 WPA 加密。

我的加密设置是 AES,我有一个字符串和一个密钥,然后将整个内容加密并解码为 Base64,然后发送。解密时,该过程显然是相反的。服务器设法正常发送所有内容,但客户端在解密时返回 null,即使它正确接收到加密字符串。我基本上有一个类充当客户端或服务器,具体取决于用户的选择。

下面是一些代码/堆栈跟踪:服务器输出:KCcOYuXTUD6SaXJQ4qIn7Q== helloworld

客户端输出:KCcOYuXTUD6SaXJQ4qIn7Q== null

加密/解密方法: http: //pastebin.com/TtErYyz6

套接字写入/读取方法: http: //pastebin.com/73QcQxva

客户端的堆栈跟踪:http://pastebin.com/NdexZdyV注意 :当逐行调试时,它只是像 27 一样停止在套接字 pastebin 链接中

希望我已经包含了足够的细节来获得解决方案:P 感谢您的帮助,我一直在为这个项目努力工作,即使某些功能是不必要的,我仍然会尝试在适用的情况下实现它们以尽可能多地学习当我下个月开始我的编程学位时

完整代码: http: //pastebin.com/xkunfX37

4

1 回答 1

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

于 2012-08-22T18:54:11.490 回答