防止在iPhone上对savedata作弊

时间:2011-06-02 16:11:09

标签: iphone

我们可以使用sqlite,nsuserdefaults或普通文件系统在iPhone上保存gamedata。这些数据通常存储在Documents目录中,但是可以在没有JailBreak的情况下轻松修改Documents目录下的文件。 (实际上,之前有一些作弊的分数被发布到服务器上)

我认为通过修改保存数据可以防止作弊。


加密文件

简单地加密数据文件并在读取时解密。它似乎很安全但如果游戏需要频繁更新游戏数据,性能将会受到影响。

SQLite加密

sqlite有一些加密扩展库。问题是成本和许可证。

验证者/校验和

存储已保存数据的校验和并使用它来检测作弊。如果由于某种原因保存校验和失败,则可能导致FALSE POSITIVE结果。

钥匙扣

将数据存储到钥匙串中。但我们不能使用sqlite。是否可以将大数据存储在钥匙串中?


每个想法都有缺陷。你能给我任何想法吗?

3 个答案:

答案 0 :(得分:3)

设计中的一个缺陷似乎是您信任本地数据。相反,我建议您将本地数据视为不安全的用户数据。这样,用户可以随意操作它,但您永远不会将其发送到您的服务器进行发布。

当用户完成游戏时,让游戏立即将分数发送到服务器。如果您愿意,您的服务器可以发回一个签名副本(散列),您可以以任何您想要的格式保存在任何地方。在您的游戏中,您可以在他们在线时发生的分数旁边添加一个“验证分数”徽章。如果操纵了经过验证的分数,那么散列将不起作用,并且(无论如何)他们将放弃他们的分数。

如果您的用户处于离线状态,则无法验证他们的分数。您仍然可以使用所有已签名的分数在本地保存它,但不必担心同步坏数据。只需从不将数据发送到从本地文件系统读取的服务器。

从用户体验的角度来看,这可能并不理想,但您可以通过告诉用户来构建它“如果您在获得高分时连接到互联网,您的分数将在全球顶级列表中得到验证和发布“或者那种效果。我相信你可以找到一种方法来处理它。

答案 1 :(得分:1)

如果你想要走这条路,有一些非常轻的,如果靠近牢不可破的密码,可以进行编码。我在过去使用了替换密码的变体,其中我用随机数对值进行异或。这些可能是不可破解的(特别是如果你每次都改变它 - 对于黑客而言,没有比每次获得不同结果更令人沮丧的事情了):

数据越小,反击就越容易。没有什么比嗅探网络更令人沮丧,并发现10个数字被编码在4096位数的随机数字块中。

根据数据的大小,您可以使用不同的密码对不同的部分进行编码 - 编码/解码会很轻,但是很难破解。

答案 2 :(得分:-1)

您可以将数据保存在NSLibraryDirectory的子文件夹中,而不是NSDocumentsDirectory中。用户无法通过iTunes查看或编辑NSLibraryDirectory。