Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在iOS设备上本地保存游戏分数…是否需要安全性?_Iphone_Ios_Hash_Plist - Fatal编程技术网

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

Iphone 在iOS设备上本地保存游戏分数…是否需要安全性?,iphone,ios,hash,plist,Iphone,Ios,Hash,Plist,我是否需要用散列存储分数(即保护分数不被用户编辑/欺骗)?据我的新手所知,用户无法查看和操作本地存储的数据,例如plist文件。有人能详细说明吗 [编辑] 我在本地存储分数,并定期将其上传到游戏中心排行榜。即使这个设备被越狱,我也希望有安全措施来防止分数被用户操纵。什么是好方法?我已经开发了许多iOS游戏,我只是通过以下方式保存本地分数: 使用NSUserDefaults类,或 将它们直接写入本地配置文件(例如.txt、.plist等) 从技术上讲,其他应用程序无法触及应用程序包中的文件,因

我是否需要用散列存储分数(即保护分数不被用户编辑/欺骗)?据我的新手所知,用户无法查看和操作本地存储的数据,例如plist文件。有人能详细说明吗

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

我已经开发了许多iOS游戏,我只是通过以下方式保存本地分数:

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

从技术上讲,其他应用程序无法触及应用程序包中的文件,因此您不必担心这些文件被编辑。

从理论上讲,用户无法操作这些存储的数据

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


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

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

我实际上会这样做:

将其保存在
NSDictionary
中,并将其转换为
NSData
对象。现在是最酷的部分:

使用此类将其加密到AES中:

这是一种军用标准加密,将返回一个加密的
NSData
对象。然后将其保存到文件中,并在必要时进行读/写。我对这个类有很好的体验,用户对此无能为力

比使用
NSUserDefaults
直接存储要好得多


试试看

我对iPhone编程也不熟悉-我刚刚制作了第一个小游戏,目前正在为下一个版本(名为;)添加game Center功能。我相信很多人会和我处于相同的情况-只需要一些简单的散列,这样入狱的人就不会轻易修改用户默认值中的分数,从而避免了在线排行榜的混乱

如果是这样的话,我发现将NSData转换为AES解决方案相当复杂(对于一个iOS新手和一个简单的需要散列一个整数的人来说),而且有点过头了。经过一些搜索,这里找到了一个很好的解决方案:。超级易于使用-复制粘贴两个源文件,下面是一个示例用法:

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

为什么不将分数存储在NSUserDefualt中?@RRB我的应用程序将支持多个用户。分数存储在本地,但会定期上载到游戏中心。在越狱案件中将分数存储到文件中时,您对如何对分数进行编码有何建议?该设备不需要越狱就可以做到这一点,只需使用类似iExplorer()的应用程序即可访问文件系统。