1.我的服务器是TCP/IP的,使用SOCKET通讯,为了保证数据的安全性,所以想在验证数据包的时候将证书,数字签名机制增加进去,这样可以保证服务器和客户端都能互相信任。
不过后来发现如果有人截获了一方的共有密钥,并将自己生成的共有密钥发给接收方,那么就可以获得接受方的数据,从而使用自己的私有密钥进行解密来获得数据。我想知道如果不通过CA认证,是否也有方法能知道客户端和服务器的密钥都是安全的?如果将共有密钥也通过加密算法加密在发送,是否能解决这个问题,但我个人觉得虽然能更安全点,但也无法彻底解决。2.如果A是服务器,B是客户端,通过SOCKET连接之后,B会接受不是A传递过来的数据么?还是任何可以伪造成A的数据包B都接收呢?如果截获者需要伪造A发送的数据包,发送给B,而B却只跟A有连接,截获者是如何获得这个链接的呢?3.还有一个问题,服务器目前是用一个3000个长度的线程池来保存客户端连接的,然后对这些连接发送的数据进行处理,虽然在处理过程中,服务器不会因为生成和销毁对象而占用时间,但是现成实在是太多了,导致服务器很卡,我听别人说有一种方法是用一个线程处理这个客户端,但我的客户端是长连接,而且需要实时处理,我想了很多方法都没办法提高效率,甚至于所有的数据结构我都用数组去代替,以麻烦换时间了,可还是超级卡。。希望哪位大拿帮回答下,而且我写服务器时间不长,所以尽可能说的简单点哈,我会加分的。

解决方案 »

  1.   

    用多线程实现。 ServerSocket 中有一个 accept()方法
    返回 的是Socket 然后把 Socket 交给 Thread处理
    可以提高效率的 
      

  2.   

    LZ提的这几个问题,我好像就接触过第三个
    你所说的用一个线程处理这个客户端
    是不是非阻塞的nio啊
    它的机制就是用几个线程来处理n多个线程
    我还看过一个基于它的MINA框架,
    网上评论还可以,不过即时性上可能没有那么好关注,学习
    呵呵
      

  3.   

    关注一下,做过socket,但是没有这么复杂
      

  4.   

    关注第二个问题,个人觉得需要用UDP协议然后改写数据包的头文件去欺骗.具体实施会不会是在A本机上截取的数据包然后转发截取信息到其他机器上?
      

  5.   

    有关安全方面的看看安全SOCKET吧
    SS
      

  6.   

    建议楼主看一下《JAVA虚拟机(原书第二版)》Bill Venners著
      

  7.   

    回十楼,我想过这种可能,但是任何一方生成密钥,都需要让对方知道一个公有密钥,这样才能实现双方解密,否则也没有必要用钥匙了,而一但传送过程中密钥被泄露,就会引起劫持方的欺骗攻击,最好的解决办法我想的是用CA的证书验证方法,这样可以让服务器和客户端都足够可信,也能保证数据包没有被更改过。而SUNXYZ86  你说的一次一密,我没太看懂,首先如果用私钥给生成的对称密钥加密,那么客户端如果解密?必然得让客户端知道这个私钥的公钥,然后才能解密知道之前的对称密钥。这样问题又回到原点了,如果我截获了服务器的数据包,那么我将公钥修改成我自己的公钥,然后发送给客户端,那么客户端在发送数据的时候就会使用我的公钥进行加密,然后我再截获客户端的数据,用自己的私钥进行解密,那么客户端所有的数据对我来说都是裸露的了,而服务器又会判断客户端的钥匙不对,在这期间任何客户端到服务器或者反方向的数据包都是不安全的,我也没想到什么方法进行处理。
      

  8.   

    每次交互时生成随机的对称密钥,用对称加密方法加密内容(速度快) 
    然后用对方公钥 加密上述随机生成的对称密钥,保证只有对方才可以接收红色的部分写错了,不好意思。
    也可以用自身私钥加密内容摘录值,这样就起到让对方鉴别消息源的作用和保障完整性整体上建议采用kdc的策略,kdc是密钥分配管理中心,用户一开始只需要保存和kdc通信的密钥(通过非网络并且可信的手段),然后由kdc记录和提供公钥并生成每次的随机密钥
    这样的话,你只要保证kdc和用户之间的通信安全就可以了(所有安全问题的源头)。
      

  9.   

    CA是解决办法,可以简化,Key 都有接口函数可以调用的
      

  10.   

    只传密文,不传密钥,服务器接到到密文解析觉得不对,扔掉,断开连接。
    socket可接受任何连接,可加ip限制。
    用一个线程检查每一个socket连接。
      

  11.   

    唉,在望上搜索很多资料,不过没看到太有用的,基本上都是从API中COPY下来的注解,源码要么是错误一大堆,要么是用的第三方包,而且还不说用的是什么,要么就是BUG一大堆,真正有用的一个没有。可能我英语实在太差了吧,国外很多网站我上去只能看懂10%。真的是太难为我了。。15楼可以说说CA的接口怎么用么,我只知道有,但是不知道怎么用,API里面的注解对我来说跟天书一样。16楼说的方法我用过了,用的3DES加密,服务器和客户端都是用的同样的钥匙,不过有时会发生解析不一样的情况。