Encryption 非网络游戏的安全在线高分列表

Encryption 非网络游戏的安全在线高分列表,encryption,leaderboard,Encryption,Leaderboard,我正在玩一款我正在编写的本地(非网络)单人游戏,我突然想到,拥有一个每日/每周/所有时间的在线高分列表(想想Xbox Live排行榜)会让游戏更有趣,增加一些(少量)社区和竞争。然而,我担心人们会把这样一个功能看作是对黑客的邀请,这会因为高分而让普通玩家望而却步 我想到了防止这种尝试的明显方法(例如,公钥/私钥加密),但我找到了黑客可以绕过我所有想法的简单方法(例如,从二进制文件中提取公钥,从而发送假加密分数) 您是否曾实施过在线高分列表或排行榜?你有没有找到一个合理的防黑客的方法来实现这一点?

我正在玩一款我正在编写的本地(非网络)单人游戏,我突然想到,拥有一个每日/每周/所有时间的在线高分列表(想想Xbox Live排行榜)会让游戏更有趣,增加一些(少量)社区和竞争。然而,我担心人们会把这样一个功能看作是对黑客的邀请,这会因为高分而让普通玩家望而却步

我想到了防止这种尝试的明显方法(例如,公钥/私钥加密),但我找到了黑客可以绕过我所有想法的简单方法(例如,从二进制文件中提取公钥,从而发送假加密分数)


您是否曾实施过在线高分列表或排行榜?你有没有找到一个合理的防黑客的方法来实现这一点?如果是,你是怎么做到的?你对黑客攻击有何经验?

老实说,我认为这是不可能的

我以前使用过非常简单的密钥加密和压缩二进制文件,这对于我所要求的安全性来说已经足够好了,但是我诚实地认为,如果有人认为破解你的在线高分表是一种黑客行为,那就可以了


有一些非常悲伤的人,他们也碰巧非常聪明,除非你能把他们都搞定。这是一个失败的事业。

我一直在用我的Flash游戏做一些这样的事情,这真是一场失败的战斗。特别是对于ActionScript,它可以不费吹灰之力反编译成可读的代码

我一直使用的方法是一种相当传统的方法,即以明文形式发送分数和球员姓名,然后再将两者进行散列(适当加盐)。很少有人有足够的决心去努力弄清楚这一点,而有少数人无论如何都会这么做,否定你投入的所有时间

总而言之,我的理念是花时间让游戏变得更好,让作弊变得足够困难


一件可能非常有效的事情是让游戏在你玩的时候多次向服务器提交分数,每次都发送一点游戏信息,让你验证分数是否“真实”。但这可能有点过头了。

当游戏在用户控制下的系统上运行时,没有任何解决方案是完美的,但是您可以采取一些步骤来增加入侵系统的麻烦。最终,目标只能是让入侵系统的麻烦超过它的价值

  • 发送一些附加信息和高分请求,以便在服务器端验证其中一个。如果你每X得到5分,而游戏只包含10个X,那么你就有了一些额外的环,让黑客跳过去,让他们的分数被认为是有效的
  • 让服务器发送一个随机挑战,该挑战必须由来自该偏移量的游戏二进制数的几个字节来满足。这意味着黑客必须保留二进制文件的原始副本(只是有点麻烦)
  • 如果您有许可证密钥,则需要高分才能包含这些密钥,这样您就可以禁止被抓到入侵系统的人。这还允许您跟踪上面定义的无效尝试,以禁止人们在提交有效分数之前测试协议

总而言之,让游戏流行到足以让人们愿意破解它可能是一个更大的挑战。

正如另一个答案所说,你不得不信任一个潜在的恶意客户端,一个简单的威慑加上一点人类监控对于一个小游戏来说就足够了

如果你想变得有趣,那么你必须在分数数据中寻找欺诈模式,模拟信用卡公司查看收费数据。客户端与服务器通信的状态越多,就越容易通过代码找到正确或不正确的行为模式。例如假设客户端必须上传一个基于时间的分数审核日志(您也可以使用该日志让其他客户端观看顶级游戏),那么服务器就可以验证分数日志是否违反了任何游戏规则


最后,这仍然是为了让它变得足够昂贵,以阻止作弊记分板。您需要一个系统,在该系统中,您可以随时改进(更易于更新)服务器代码,以应对对验证系统的任何新攻击。

这是一个非常困难的问题

我从未实现过这样的事情,但这里有一个简单的说明

您主要担心的是黑客猜测您的应用程序正在做什么,然后发送他们自己的结果

首先,除非你的申请非常成功,否则我不会担心。做这样的事情是非常困难的

加密对解决这个问题没有帮助。您可以看到,加密有助于在传输过程中保护数据,但在数据加密之前,它无法保护事务的任何一方(这可能是主要漏洞所在)。因此,如果加密数据,数据将保持私有,但不安全

如果你真的担心它,我会建议混淆代码和设计评分系统的方式,这不是完全明显的什么是正在做的。在这里,我们可以从加密协议中借用一些东西。以下是一个例子:

  • 假设分数是某个数字m
  • 对分数进行某种检查(例如CRC或你看到的任何其他系统。事实上,如果你发明了一个,不管它有多蹩脚,它都会工作得更好)
  • 从远程服务器(通过安全连接)获取用户(D)的私钥。你是唯一知道这把钥匙的人
  • Compute X=m^D mod n(n是公钥/私钥算法的公共模块)(也就是说,加密它:P)
  • 如你所见,这只是另一种混淆。哟