3

注意:这是与 android 相关的,但最好的答案可能不是特定于平台的,因此是其他标签。

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

我的想法:

在 android 上,所有应用程序文件都存储在一个文件夹中,用户只有在具有 root 访问权限时才能访问该文件夹(默认情况下,他们从不这样做,但只要你谷歌一点,通常很容易获得)。现在,我正在使用一个看起来像这样的 sqlite 数据库:

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

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

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

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

4

3 回答 3

4

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

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

太棒了!问题解决了:)

于 2012-04-12T11:13:21.453 回答
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
于 2012-04-12T11:17:38.720 回答
1

入侵存储在设备本地(或最终远程)上的数据(游戏二进制文件/关卡数据/高分表等)总是可以被真正想要并知道如何做的人访问(和解码)。

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

默默无闻的安全性是您在加密案例中的数据时尝试做的事情。从长远来看,这还不够。尤其是当您的项目遇到大量观众时。

于 2012-04-12T11:34:16.763 回答