在iOS设备上本地保存游戏得分…需要安全吗?

我是否需要用散列来存储分数,即保护它免于被用户编辑/欺骗? 从我的newb知识,用户是无法查看和操纵这个本地存储的数据,例如plist文件。 任何人都可以详述吗?

[编辑]我在本地存储分数,并定期上传到Game Center排行榜。 即使该设备越狱,我想有安全防止分数被用户操纵。 什么是好方法?

我其实会这样做:

将它保存在一个NSDictionary ,并将其转换为一个NSData对象。 现在来了一个很酷的部分:

使用这个类将其encryption成AES:
https://web.archive.org/web/20160806074714/http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html

这是一个军事标准encryption,将返回一个encryption的NSData对象。 然后只要将它保存到文件并在必要时读/写。 我对这门课有很好的经验,用户不能做任何事情。

比仅仅使用NSUserDefaults将其存储在明显的位置要NSUserDefaults

搏一搏!

我也是iPhone编程的新手 – 刚刚构build了我的第一个小游戏,并且正在为下一个版本添加Game Centerfunction(称为“ 笑脸线”) ;我相信很多人会和我处于同样的境地 – 只需要一些简单的哈希越狱的人不会轻易修改用户默认分数,从而防止搞乱在线排行榜。

如果是这样,我发现NSData转换为AES解决scheme相当复杂(对于一个iOS新手和一个简单的需要散列整数),有点矫枉过正。 经过一番search之后,在这里find了一个很好的解决scheme: Matthias Plapper已经将NSUserDefaults类进行了分类,以提供一些使用密钥的简单散列 。 超级简单易用 – 复制粘贴两个源文件,下面是一个示例用法:

 // Configuring user defaults. It is recommended that you do this // immediately after the app did launch. [NSUserDefaults setSecret:@"shh, this is secret!"]; // Write secure user defaults NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setSecureBool:YES forKey:@"IsRegistered"]; // Read secure user defaults BOOL valid = NO; BOOL registered = [defaults secureBoolForKey:@"IsRegistered" valid:&valid]; if (!valid) { // the property has been modified, handle this situation } else { // Valid property, do whatever you need to do } 

感谢一吨Matthias!

理论上,用户不能操作这个存储的数据。

但是,有一些方法可以访问整个文件系统,所以人们可以打开你的游戏文件夹,编辑plist并修改它们的分数。

就个人而言,如果我在没有在线排行榜的情况下制作游戏,我不会担心。 让他们有他们想要的得分,只要其他球员不受其影响。

您可以使用自己的盐值对分数进行编码,并在需要时进行解码。 这将阻止用户简单地改变他们看到的号码。

我开发了许多iOS游戏,我只保存本地分数:

  • 使用NSUserDefaults类,或
  • 将它们直接写入本地configuration文件( 例如 .txt,.plist等)。

从技术上讲,其他应用程序不能触摸你的应用程序包内的文件,所以你不必担心他们正在编辑。