Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP停止和等待:识别错误消息_Java_Security_Authentication_Udp - Fatal编程技术网

Java UDP停止和等待:识别错误消息

Java UDP停止和等待:识别错误消息,java,security,authentication,udp,Java,Security,Authentication,Udp,我目前正在建立一个快节奏的多人游戏,其中安全是一个大问题 我已经在Java中通过UDP实现了停止和等待(为了简单起见,这是一种临时措施) 然而,我担心恶意方可能会分别向发送方或接收方发送错误的ACK或消息,从而使序列号不同步-本质上导致消息丢失(游戏崩溃!)或发送方无限期地重新发送 在我的应用程序中,每个参与者都由一个RSA公钥标识,因此我可以在每条消息中添加一个签名哈希以进行身份验证。。。但这大大增加了标题的大小,并在某种程度上混淆了我的体系结构层 这是一种常见的方法吗?这个问题有好的解决方案

我目前正在建立一个快节奏的多人游戏,其中安全是一个大问题

我已经在Java中通过UDP实现了停止和等待(为了简单起见,这是一种临时措施)

然而,我担心恶意方可能会分别向发送方或接收方发送错误的ACK或消息,从而使序列号不同步-本质上导致消息丢失(游戏崩溃!)或发送方无限期地重新发送

在我的应用程序中,每个参与者都由一个RSA公钥标识,因此我可以在每条消息中添加一个签名哈希以进行身份验证。。。但这大大增加了标题的大小,并在某种程度上混淆了我的体系结构层


这是一种常见的方法吗?这个问题有好的解决方案吗

乔纳森说的话。一般来说,在使用UDP时,您需要提供自己的方法来防御无序或丢弃的数据包。除了使用TCP之外,没有一种“标准”的方法来处理这个问题。正如您所说,您可以在每个数据包上验证客户机的身份,但请记住,即使使用RSA之类的工具,验证客户机的身份也无助于抵御恶意客户机。他们可以连接到游戏服务器,验证自己,然后开始发送垃圾。毕竟,他们就是他们所说的那样

对于大多数游戏服务器设计,据我(尽管有限)的理解,通常服务器有“滴答声”的概念——客户端可以注册滴答声中发生的某些事件,服务器根据客户端发送的内容强制执行规则。但当勾号结束时,服务器接收到的与该勾号对应的任何事件都将被丢弃。这添加了一个race元素,该元素不会增加系统的实际安全性,但确实添加了一个使其更加困难的元素


当然,要使任何这样的系统“安全”,因为客户端无法欺骗其来源,基本上需要执行TLS隧道,我认为这不会满足您的性能要求。

因为UDP数据包不可靠(它们不保证按发送顺序出现,也不保证交付),您的游戏必须针对顺序错误的数据包、丢失的数据包和重复的数据包进行自我保护。它不应该崩溃。事实上,无论客户端发送什么,你的游戏服务器都无法承受崩溃——你可能会拒绝或忽略某些东西,但你承受不起崩溃。我可能应该进一步介绍我正在做的事情。游戏是点对点的(除了大厅设置),每个玩家必须在连接到大厅时出示他们的RSA身份(另一个玩家作为主机)。每个玩家都有一份游戏状态的完整副本,玩家必须向所有其他玩家发送他们发出的所有命令。我担心的是,恶意玩家可能会通过发送带有正确序列号的错误消息,迫使其他人退出游戏。@user1256041:是的,您自己有一个设计错误。没有办法保证这种设计的安全。您已经有了一个坚如磐石的客户身份证明(RSA),但并没有任何证据表明经过身份验证的客户机也不可能是邪恶的。这是一个棘手的情况。玩家之间发送的单位太多,所以每个玩家都有整个状态,命令被发送。突然想到:如果所有数据包都被签名,玩家可以证明另一个是恶意的。这意味着诚实的玩家可以将恶意玩家引导到另一个向他们提供恶意数据包的玩家身上。@用户:不,签名只能证明发件人确实发送了给定的消息(而不是中间的某个人)。这并不能证明发送者本人没有恶意。这取决于消息。如果一个玩家发送了一条他们本不应该发送的消息,那么接收玩家可以使用该消息作为发送玩家恶意攻击其他玩家的证据。