Answers:
一种可能的解决方案是使用TCP + TLS验证用户身份。然后,在同一通道内,使用Diffie-Hellman之类的工具协商对称密钥。最后,使用RC4之类的对称算法对每个UDP数据包进行加密。
如果使用SRP之类的技术,从技术上讲,您不需要使用TCP + TLS来协商对称密钥-只要记住干净的Diffie-Hellman容易受到MITM攻击。
您甚至可以走得更远,并在UDP数据包中使用自定义SEQ字段(如果您使用某种形式的可靠UDP)来实现一种反模式加密形式-在其中您将SEQ号添加到每个数据包的协商密钥中;这使得发起已知明文攻击变得更加困难。
不要让您的服务器随意分发密钥-“欺骗”服务器可能很容易分发自己的密钥。破坏了整个加密方案的目的。唯一有保证的方法是使用TLS或使用共同知识(例如密码/哈希)。
我有很长的(两年前)黑客技术背景,有史以来最难破解的数据包(以及我建议您使用的数据包)使用的是对称密钥加密方法,乔纳森·迪金森(Jonathan Dickinson)简要介绍了这种方法。正如他还提到的,您应该使用TCP + TLS。但是,他说了相反的顺序。
我曾经遇到过容易被程序员“防黑客”系统欺骗的时代,因为他们有一个足够奇怪的计数系统,我无需编程知识和第一年代数逻辑就可以破解它。只要选择适当的顺序方法,目标就应该完全按预期接收数据,这也意味着您应该使用TCP进行最安全的操作。
回到“我的经验”的轨道上,我发现一种系统表现出色。一种基于发送时间和预期时间的顺序方法。由于必须始终以正确的顺序接收数据包,因此欺骗数据包几乎是不可能的,因为在没有首先破解客户端程序的情况下,我永远无法预测何时将发送数据包以及何时期望(在一个数据包与另一个数据包之间)。
简短的答案
简而言之:每个数据包结构还将有一个时间戳,就像发送到毫秒时一样。这太简单了,检查一个时间是否在另一个时间之前/之后真的很容易。之所以说得这么好,是因为服务器仍然可以按欺骗顺序接收数据包,而没有时间进行身份验证。
显然,这不是唯一的顺序方法,也不是任何方法中最好的方法。我发现它只是效果很好的一种。与TCP + TLS结合使用,您应该不会出现太多问题。
就我个人而言,我不会为时过早。即使您按照乔纳森(Jonathan)的建议对数据包进行加密,像我的兄弟这样的黑客也只会在数据包加密之前访问数据包。如果恶意用户想要进入,他们将找到出路。
既然这已经成为现实,独立开发人员可以通过多种方法将恶意用户可能造成的损害降至最低。您可能应该加密出站数据包,但这只会阻止某些类型的攻击,不要自欺欺人地认为它现在是“防黑客的”。要真正关闭黑客,请给客户端尽可能少的改变游戏规则的控制权。这些大型MMO之一曾经允许客户告诉服务器他们获得了多少XP。猜猜那里发生了什么?不要那样做 让客户端告诉服务器,他们想对生物使用某种超级法术,然后让服务器解决该动作,然后在生物死亡时添加XP。客户端应该是瘦的,笨拙的,可以发送和接收命令的终端,并且可以进行一些预测(如有必要)。在游戏和响应由客户端发送的命令。
大型游戏公司除了使用VAC或PunkBuster外,还使用上述内容来防止已知的黑客继续破坏付费客户。这些安全措施的工作方式一直保密,但是我确实知道它们使用的一种方法:它们扫描当前正在运行的应用程序,并将其与已知黑客的列表进行比较。一旦发现作弊,您将无法加入VAC / PunkBuster安全服务器。