Web 游戏通信时如何保证数据完整性(防止用户篡改修改结果)?

153 天前
 linuxsteam

需求

小弟想研究自己写一个 FlyBrid 的游戏,将游戏得到的分数对用户进行奖励。需要保证用户无法篡改数据实现“自定义”分数去获取奖励。

个人调研

目前上网搜索了很多资料,貌似通信方式可以选择 WebSocket 、Socket 、HTTP 。 基于以上通信方式搜索到资料,实现需求的大致提供的思路就是:

个人结论

个人理解这种方式还是不太安全,只是提高了攻击方的门槛。 例如:

最终公钥前端都能拿到,然后用户可以提取该公钥,对篡改的数据进行加密。

个人理解使用该方式的话,服务端和客户端每一次通信都生成一次 HMAC ,为下次通信使用,并且保证该 HMAC 有效时间足够短。

在 FlyBird 游戏实际应用可能就是,服务端生成管道时候,会生成下一次通信需要的 HMAC ,并且设置有消息为生成管道的时间间隔

基于以上逻辑,我理解还是可以写程序模拟进行操作,欺骗服务端达到修改分数的目的。(就是我自己这关都过不去)

跟上面动态消息认证码的攻破方式是类似的。

求助

小弟没有做过游戏后端开发思维是有些局限的,不知道大家有没有成本较低实现数据防篡改的办法

3790 次点击
所在节点    游戏开发
26 条回复
UnluckyNinja
153 天前
也基本没有玩小游戏必给奖励的(就算给也是给鸡毛蒜皮的虚拟奖励,直接全发都不亏那种),尤其是实体奖励,最后都是走抽选系统控制总奖池大小。形式上有个参与感就够了
picone
153 天前
你这是 H5 游戏?我想起我之前玩的一个 web3 游戏,是打飞机然后最终按照打的排名分数给奖励,真金白银的 ETH 。

因为游戏过程是客户端计算的,所以只能验证上报分数,上报分数他设计了一套巧妙的签名,还放 wasm 了,最后还是被我破解了。毕竟有钱🐎。https://picone.github.io/2023/05/12/exploit-stark-figter.html
xuhuanzy
153 天前
首先,客户端的一切都是不可信的
EMMMMMMMMM
153 天前
@picone 666
kekeabab
153 天前
最简单粗暴的办法,不要给用户客户端就好了,采用“远程游玩”的方式,反正你这个游戏也不需要多少性能。
linuxsteam
153 天前
@picone 666

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1125509

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX