通过服务器

时间:2015-08-21 15:34:31

标签: java networking network-programming p2p

如何通过服务器和连接服务器停用后连接两个客户端?这意味着服务器无法获取任何用户数据,只能连接它们。它可能是由java se制作的,还是可能的呢?客户端也可能位于不同的本地网络中,因此只获取客户端的地址可能无法正常工作。如果该方法不真实,您可以推荐其他类型的安全连接

2 个答案:

答案 0 :(得分:1)

我可以想到三种可能的方法

:1: - 基于服务器IP的解决方案 - 客户端知道服务器的IP地址。服务器侦听服务器套接字,然后客户端(比如A& B)通过此服务器套接字连接并注册自己。现在,当客户端B使用客户端A的众所周知的名称向服务器询问客户端A的IP地址时,服务器将提供客户端A的IP地址。客户端A将在服务器上侦听Socket - 并且客户端B在此套接字处连接。需要注意确保使用可寻址的IP地址,即公共地址,相同的子网掩码,NAT遍历......

:2: - 基于广播/多播IP的解决方案 - 所有客户端广播或多播(基于组) - 广播的一部分是众所周知的名称,因此客户端B将知道客户端A的IP地址是什么。 A将在服务器上侦听Socket - 并且客户端B在此套接字处连接。

:3: - 考虑现有的库JXTA或TomP2P或Hive2Hive或jnmp2p

同时检查一下 - http://tutorials.jenkov.com/p2p/index.html

您的问题

  
    

如何通过服务器和连接服务器停用后连接两个客户端?

  

:1有效 - 一旦客户B知道客户端A的IP地址 - 服务器就可以停用。服务器无法查看客户端A和客户端B之间交换的任何数据。

  
    

它可能是由java se制作的,还是可能的呢?

  

是的,它是非常可行的 - 几年前我在Java中做过类似的事情 - 它是一台远程连接到家中存储设备(客户端B)的数码相机(客户端A)。 (我实施:1)

  
    

客户也可以在不同的本地网络中

  

是的,他们可以在不同的本地网络中,但它们应该是可寻址的。拿我所做的,存储设备基本上是在家庭网络中,数码相机在公共网络上。您可以使用IPv6,也可以执行NAT遍历技术或端口转发 - 使不同网络中的客户端彼此可见。这种方法非常安全。

为了安全高效,您将生成会话密钥(使用Diffie Hellman),两个客户端将使用对称加密/解密来交换数据(使用AES)。 (您使用RSA生成会话密钥 - Diffie Hellman的替代方案。一般来说,如果您可以使用数字证书使用RSA - 如果您可以使用共享密钥使用Diffie-Hellman)

如果不清楚 - 更详细地解释您的用例 - 我可以解释您的用例。

答案 1 :(得分:0)

这是一个Android Messenger应用程序。您希望具有对等连接以获得安全连接。也许有可能Abhi's answer (first idea),但你必须得到连接两个设备的安全任务。

p2p信使的另一个缺点:两者都必须在线。如果其中一个连接不良,您可能会丢失消息,或者很难发送消息。

即使你有一个p2p连接,你也必须加密通信,以获得良好的安全性。如果你有一个非常好的加密,你可能不需要p2p连接[1]。

您需要的是一个好的加密协议。这是基本想法:

  • 每个人都已向您的服务器发布了RSA公钥。
  • A想要与B交谈,因此A使用B的公共RSA密钥加密A的AES密钥。
  • B使用B的私人RSA密钥解密A的AES密钥。
  • (也许B会向A发送另一个AES密钥,但我认为两者都可以使用A&#AES键。)
  • B通过发送使用A&#AES键加密的" Hello A" -message确认。
  • 现在他们可以沟通了。
  • 在给定时间或一些聊天消息之后更换AES密钥可能是个好主意。

你可能可以在Stack Overflow上find answers how to do this(如果你使用他的代码,请给他一个upvote)。

为什么要使用这个复杂的协议而不是使用RSA轻松加密所有内容? RSA和AES都是非常强大的加密协议,但RSA不能快速计算为AES。您需要一个大的RSA密钥,如2048位而不是256位AES密钥。这对手机来说是一个很大的缺点。更多的计算意味着更多的功耗。因此AES速度更快,但您无法公开密钥。他们是一个非常强大的团队(即使RSA未来可能会破坏量子计算机)!

[1]如果一个坏人可以劫持正常的客户端 - 服务器 - 客户端连接,他可能会通过设置代理(中间人攻击)来劫持连接两个设备的任务。这是您的信使协议的关键点,因为每次有人更改了IP(在WiFi和Cellular之间切换),您必须重新连接。