如何为开源项目制作(功能性)校验和?
How can I make a (functional) checksum for an open source project?
我的一个朋友正在开发 Godot 项目,这是一款简单的多人游戏,玩家可以通过 IP 相互连接。最近,他决定将其 git 回购 public,而不是将其保密;本质上是让世界可以访问它。
不过他很快意识到,通过制作项目文件 public,人们现在可以编译稍微修改过的代码版本,并且仍然可以连接到其他播放器。看到如何利用它作弊(例如永远不会轮到对手),他向我求助。因为我也是一个经常使用大战略的玩家,所以我首先想到的是做一些类似校验和的东西来比较不同的版本。 las,这些游戏中的大多数都是封闭源代码,当他问如果有人能够 "hard-code" 或强制校验和匹配会发生什么时,我意识到了这一点。
将闭源组件用于启动器或游戏内在线身份验证是个好主意吗?或者他还有其他可以考虑的方法吗?
你不会被欺骗。
要使在线游戏正常运行,服务器必须向客户端发送信息,而该信息可能会被滥用。如果服务器将玩家位置发送给客户端,恶意客户端可能会拦截这些消息并使用它来构建所有对手的地图,或通过墙壁显示他们的位置。
同样,服务器必须接受来自客户端的命令并使用它们来修改游戏状态。确定命令是否合法非常困难。您如何区分高技能玩家和瞄准机器人?一些 AAA 游戏使用反作弊解决方案,但仍然让作弊者通过,同时禁止普通人。
这与开源无关
好消息是这与自由软件无关。尽管您尝试锁定密码,但玩家 会 破解它并想方设法作弊。 This question 是关于 DRM 的,但很好地概述了为什么基本上不可能阻止聪明、坚定的人使用逆向工程技术。
使用权威服务器
虽然无法防止作弊,但您可以限制其有效性。您无法控制客户端,但您可以 控制服务器,因此请authoritative。与游戏结果相关的每个决定都应由服务器做出,而客户端只负责将玩家输入转发到服务器。这意味着如果一个玩家想要“破解”他们的本地副本,比如说,给他们的玩家 500% 的健康,这只会把他们这边的事情搞砸——服务器仍然会像他们的玩家有正常数量的健康。
限制您发送的信息
虽然您的权威服务器阻止玩家修改游戏状态,但他们仍然可以滥用发送给他们客户端的信息。如上所述,服务器将 有 向客户端发送有关玩家位置的信息,玩家可以使用它来发现对手位置或创建瞄准机器人。您可以通过发送客户端正常工作所需的绝对最少信息量来限制这种情况。例如,服务器可能只发送客户端可以看到的玩家位置更新,而不是不断发送玩家位置更新。这将防止玩家拥有“X 射线”视觉,但仍然无法防止瞄准机器人(请记住,即使是专有游戏也无法阻止这种情况)。
考虑您的威胁模型
如果服务器信息不是“游戏的一部分”,玩家只能使用服务器信息作弊。例如,如果你正在制作一个国际象棋游戏,玩家不能通过拦截来自服务器的消息来“作弊”,因为这些消息不包含任何他们不应该知道的信息——他们已经“允许”知道对方棋子的位置由规则决定。
当您查看您的游戏时,尝试弄清楚什么绝对需要 保密才能使所需的机制发挥作用,并使其余的 public 知识成为可能。对于确实需要保密的比特,尽量限制发送。
考虑到这一点,祝贺您的朋友创建了一款开源游戏。如果有的话,这意味着您将能够获得更多帮助,使其尽可能防作弊。祝你好运!
我的一个朋友正在开发 Godot 项目,这是一款简单的多人游戏,玩家可以通过 IP 相互连接。最近,他决定将其 git 回购 public,而不是将其保密;本质上是让世界可以访问它。
不过他很快意识到,通过制作项目文件 public,人们现在可以编译稍微修改过的代码版本,并且仍然可以连接到其他播放器。看到如何利用它作弊(例如永远不会轮到对手),他向我求助。因为我也是一个经常使用大战略的玩家,所以我首先想到的是做一些类似校验和的东西来比较不同的版本。 las,这些游戏中的大多数都是封闭源代码,当他问如果有人能够 "hard-code" 或强制校验和匹配会发生什么时,我意识到了这一点。
将闭源组件用于启动器或游戏内在线身份验证是个好主意吗?或者他还有其他可以考虑的方法吗?
你不会被欺骗。
要使在线游戏正常运行,服务器必须向客户端发送信息,而该信息可能会被滥用。如果服务器将玩家位置发送给客户端,恶意客户端可能会拦截这些消息并使用它来构建所有对手的地图,或通过墙壁显示他们的位置。
同样,服务器必须接受来自客户端的命令并使用它们来修改游戏状态。确定命令是否合法非常困难。您如何区分高技能玩家和瞄准机器人?一些 AAA 游戏使用反作弊解决方案,但仍然让作弊者通过,同时禁止普通人。
这与开源无关
好消息是这与自由软件无关。尽管您尝试锁定密码,但玩家 会 破解它并想方设法作弊。 This question 是关于 DRM 的,但很好地概述了为什么基本上不可能阻止聪明、坚定的人使用逆向工程技术。
使用权威服务器
虽然无法防止作弊,但您可以限制其有效性。您无法控制客户端,但您可以 控制服务器,因此请authoritative。与游戏结果相关的每个决定都应由服务器做出,而客户端只负责将玩家输入转发到服务器。这意味着如果一个玩家想要“破解”他们的本地副本,比如说,给他们的玩家 500% 的健康,这只会把他们这边的事情搞砸——服务器仍然会像他们的玩家有正常数量的健康。
限制您发送的信息
虽然您的权威服务器阻止玩家修改游戏状态,但他们仍然可以滥用发送给他们客户端的信息。如上所述,服务器将 有 向客户端发送有关玩家位置的信息,玩家可以使用它来发现对手位置或创建瞄准机器人。您可以通过发送客户端正常工作所需的绝对最少信息量来限制这种情况。例如,服务器可能只发送客户端可以看到的玩家位置更新,而不是不断发送玩家位置更新。这将防止玩家拥有“X 射线”视觉,但仍然无法防止瞄准机器人(请记住,即使是专有游戏也无法阻止这种情况)。
考虑您的威胁模型
如果服务器信息不是“游戏的一部分”,玩家只能使用服务器信息作弊。例如,如果你正在制作一个国际象棋游戏,玩家不能通过拦截来自服务器的消息来“作弊”,因为这些消息不包含任何他们不应该知道的信息——他们已经“允许”知道对方棋子的位置由规则决定。
当您查看您的游戏时,尝试弄清楚什么绝对需要 保密才能使所需的机制发挥作用,并使其余的 public 知识成为可能。对于确实需要保密的比特,尽量限制发送。
考虑到这一点,祝贺您的朋友创建了一款开源游戏。如果有的话,这意味着您将能够获得更多帮助,使其尽可能防作弊。祝你好运!