在iOS设备上本地保存游戏分数......是否需要安全性?

时间:2011-07-01 05:56:29

标签: iphone ios hash plist

我是否需要使用哈希值存储乐谱,即保护乐器不被用户编辑/欺骗?根据我的新知识,用户无法查看和操作此本地存储的数据,例如plist文件。任何人都可以详细说明吗?

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

5 个答案:

答案 0 :(得分:6)

我实际上会这样做:

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

使用此类将其加密为AES:
https://web.archive.org/web/20160806074714/http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html

这是一种军事标准加密,它将返回加密的NSData对象。然后将其保存到文件并在必要时进行读/写。我在这门课上有很好的经验,用户无法做任何事情。

比使用NSUserDefaults将其存储在普通视野中要好得多。

试一试!

答案 1 :(得分:3)

理论上,用户无法操纵此存储的数据。

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

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

答案 2 :(得分:3)

我也是iPhone编程的新手 - 刚刚建立了我的第一个小游戏,我现在正在为下一个版本添加Game Center功能(称为Smiley Lines;)我相信很多人会和我一样 - 只想要一些简单的哈希,所以越狱的人不会轻易修改用户默认的分数,从而防止搞乱在线排行榜。

如果是这样,我发现NSData转换为AES解决方案相当复杂(对于iOS新手和简单需要散列整数)并且有点矫枉过正。经过一些搜索,可以找到一个很好的解决方案:Matthias Plapper has subclassed the NSUserDefaults class to provide some simple hashing with a secret key。超级简单易用 - 复制粘贴两个源文件,这是一个示例用法:

// 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!

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

我开发了很多iOS游戏,我只是通过以下方式保存本地乐谱:

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

从技术上讲,其他应用无法触及应用套装中的文件,因此您无需担心其被编辑。