如何让玩家更难破解游戏级数据呢?

时间:2012-04-12 11:06:46

标签: android sql algorithm security encryption

注意:这与Android有关,但最佳答案可能不是特定于平台,因此其他标签。

考虑类似于愤怒的小鸟的游戏:你有一堆关卡。每次完成一个关卡时,下一关可以播放,但不是之前。如何让玩家更难破解我的游戏文件并解锁不应该可用的关卡?假设进展数据存储在本地。

我的想法:

在Android上,所有应用程序文件都存储在一个文件夹中,用户只有拥有超级用户权限才能访问该文件夹(默认情况下,他们从不这样做,但只要你稍微google一下就很容易获得)。现在,我使用的sqlite数据库看起来像这样:

LevelId = pk | UnlockStatus = int, 0 = locked, 1 = unlocked, 2 = completed with 1 star, ...

只要用户没有root用户或者根本不熟悉应用程序文件的存储位置,就可以了。但是,如果他们有root,则此文件很容易编辑。

据我所知,愤怒的小鸟将其等级数据存储在.lua文件中,至少根据其名称。我找不到包含级别信息的文本文件或db文件。在文本编辑器中打开此.lua只会显示乱码。我还没有尝试过十六进制编辑器。

使用sql表非常方便。有没有一种简单的方法将进度数据存储在sql表中,这样用户将更难理解它?理想情况下,实施它也不应太费时。作为一个离线游戏,我不在乎玩家是否攻击它,所以我正在寻找最好的质量 - 实施时间的权衡。然而,理论上的答案可以提供更多的实施时间以获得更高的质量。

3 个答案:

答案 0 :(得分:4)

您最好的选择是使用某种加密方式保存数据。在android中,SQLite不提供数据库级别的加密。但是,您可以加密表中的值(记录)并在查询后解密它们。

另一种方法是将数据保存为内部或外部存储器中某种文本文件(angrybirds中的.lua示例)中的键/值对,并对文件内容执行加密。另一方面,在运行时解密它并读取您的键/值对。

Tadaaa!问题解决了:))

答案 1 :(得分:1)

一种简单的方法:为每位玩家存储不同级别的数据。

代码少于5行:

//encrypt code:
save_level = "level_txt" + "#"+ md5("gamename" + "playername" + level_txt)

//decrypt code:
level_plaintxt, md5_level = save_level.split("#")
if (md5_level == md5("gamename" + "playername" + level_plaintxt))
  return level_plaintxt

答案 2 :(得分:1)

黑客数据(游戏二进制文件/级别数据/高分数表等)本地存储在设备上(或最终远程)将始终可以被真正想要知道如何的人访问(和解码)做到这一点。

您添加的每个安全层只会让黑客变得更加困难(并且需要更长的时间)。有时,即使添加额外的安全层也需要更多时间来实施,而不是让黑客了解它。 (计算历史中有着名的例子,一个是XBox IIRC)。

默示安全是您在加密案例中的数据时尝试执行的操作。从长远来看,这还不够。特别是当你的项目遇到大量观众时。