【问题标题】:UDP Stop-and-Wait: identifying false messagesUDP Stop-and-Wait:识别虚假消息
【发布时间】:2012-07-25 09:40:43
【问题描述】:

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

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

但是,我担心恶意方可能会分别向发送者或接收者发送错误的确认或消息,从而导致序列号不同步——本质上会导致消息丢失(游戏崩溃!)或发件人无限期地重新发送。

在我的应用程序中,每个参与者都由 RSA 公钥标识,因此我可以为每条消息添加签名哈希以进行身份​​验证……但这会大大增加标头大小并在一定程度上混淆我的架构层。

这是一种常见的方法吗?这个问题有众所周知的解决方案吗?

【问题讨论】:

  • 由于 UDP 数据包不可靠(不保证按发送顺序出现,也不保证传送),您的游戏必须防御乱序数据包、丢失数据包和重复数据包.它不应该崩溃。实际上,无论客户端发送什么内容,您的游戏服务器都无法承受崩溃的后果——您可以拒绝或忽略某些内容,但您无法承受崩溃的后果。

标签: java security authentication udp


【解决方案1】:

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

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

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

【讨论】:

  • 我可能应该更多地扩展我正在做的事情。游戏是点对点的(除了大厅设置),每个玩家必须在连接到大厅时出示他们的 RSA 身份(另一个玩家充当主机)。每个玩家都有一份完整的游戏状态副本,玩家必须将他们发出的所有命令发送给所有其他玩家。我担心的是,恶意玩家可能会通过发送带有正确序列号的虚假消息来迫使其他人退出游戏。
  • @user1256041:是的,你自己有一个设计错误。没有办法保护这种设计。您已经获得了客户身份 (RSA) 的可靠证明,但没有任何证据表明经过身份验证的客户也不能是邪恶的。
  • 这是一个棘手的情况。太多的单位无法在玩家之间发送它们,所以每个玩家都有完整的状态,而是发送命令。突然想到:如果所有数据包都签名,一个玩家可以证明另一个是恶意的。这意味着诚实的玩家可以在另一个玩家向他们展示恶意数据包时启动恶意玩家。
  • @user:不,签名仅证明发件人确实发送了给定的消息(而不是中间人)。这并不能证明发件人本人没有恶意。
  • 这取决于消息。如果玩家发送了他们不应该发送的消息,那么接收玩家可以将其用作发送玩家对其他玩家恶意的证据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多