【问题标题】:Prevent cheating on savedata in iPhone防止在 iPhone 中的 savedata 上作弊
【发布时间】:2011-06-03 12:32:13
【问题描述】:

我们可以使用 sqlite、nsuserdefaults 或普通文件系统在 iPhone 上保存游戏数据。这些数据通常存储在 Documents 目录中,但 Documents 目录下的文件可以轻松修改而无需 JailBreak。 (其实之前有些作弊的分数已经发到服务器了)

我考虑了一些通过修改保存数据来防止作弊的想法。


加密文件

只需加密数据文件并在读取时解密。看起来很安全,但如果游戏需要频繁更新游戏数据,就会牺牲性能。

SQLite 加密

有一些用于 sqlite 的加密扩展库。问题在于成本和许可证。

验证器/校验和

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

钥匙链

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


每个想法都有缺陷。你能给我一些想法吗?

【问题讨论】:

  • 为什么校验和会失败?顺便说一句,即使没有狗,只要张贴一个标有“小心狗”的标志,就会让很多人远离。标有“作弊者将被排除在游戏之外”的标签可能会有所帮助,而且不会花费任何费用。
  • 我会对数据库进行校验和并将该值存储在钥匙串中,然后在启动时验证钥匙串 = db 校验和,从后台返回等。
  • 如果我们以非原子方式保存数据和校验和,校验和将失败。我们需要交易基础设施来做到这一点。

标签: iphone


【解决方案1】:

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

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

如果您的用户离线,则无法验证他们的分数。您仍然可以将其与所有签名的分数一起保存在本地,但根本不必担心会同步坏数据。永远不要向您的服务器发送从本地文件系统读取的数据。

从用户体验的角度来看,这可能并不理想,但您可以通过告诉您的用户“如果您在获得高分时连接到互联网,您的分数将被验证并发布在全球顶级列表中"或类似的东西。我相信你能想出办法来处理它。

【讨论】:

  • 我几乎同意,离线记录的不信任分数是明智的选择之一。但是我们不能不信任其他游戏数据,例如用户的位置、物品拥有或任何标志,因为如果我们不信任它们,游戏状态将会崩溃,即使这些数据被用户修改,也可以记录 VERIFIED 分数。
  • 听起来您想解决两个问题:1)用户正在修改他们的游戏保存数据(作弊)。 2)您想防止被篡改的数据发布到您的服务器。要解决 #1,您可以像这里的人所描述的那样对保存格式进行混淆或加密。如果不了解您的特定应用程序的更多信息,则很难建议一种可以满足您需求的方法,因为我们不知道您的应用程序与服务器上发生了什么。为了解决 #2,我认为上面的建议仍然有效,但同样,我不知道问题的完整背景。
【解决方案2】:

如果你想走那条路,有一些非常轻巧的,如果该死的几乎牢不可破的话,用于编码的密码。我过去曾使用过一种替代密码的变体,我将这些值与随机数进行异或运算。这些几乎是牢不可破的(尤其是如果您每次都对其进行更改-对于黑客来说,没有比每次都得到不同的结果更令人沮丧的了:)

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

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

【讨论】:

  • 这似乎是一个具有成本效益的解决方案。但是我可以将此解决方案与 SQLite 数据库一起使用吗?
  • 是的,但这意味着将事物存储为二进制数据。这有点不方便,但不是一项艰巨的任务。一个很好的方面是,您可以根据需要使密码变得简单或讨厌。您甚至可以将密钥存储在 SQLite 数据库中(只是不要将其称为 KEY,这样也很难准确地确定哪些数字是密钥)。
  • 有关实现此方法的一些代码,请参见此处:stackoverflow.com/a/10656929/12484
【解决方案3】:

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

【讨论】:

  • 不幸的是,有一些工具可以将 iPhone 挂载为磁盘驱动器,我们可以使用它们修改设备上的任何数据(甚至在库目录中):(
  • 没错。我会把时间花在轻量级加密上。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 2016-05-26
  • 2022-10-15
  • 2015-04-06
相关资源
最近更新 更多