我是否需要使用哈希值存储乐谱,即保护乐器不被用户编辑/欺骗?根据我的新知识,用户无法查看和操作此本地存储的数据,例如plist文件。任何人都可以详细说明吗?
[编辑] 我在本地存储分数,并定期将它们上传到Game Center排行榜。即使设备被越狱,我也希望有安全措施来防止用户操纵分数。什么是好方法?
答案 0 :(得分:6)
我实际上会这样做:
将其保存在NSDictionary
中并将其转换为NSData
对象。现在来了很酷的部分:
这是一种军事标准加密,它将返回加密的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游戏,我只是通过以下方式保存本地乐谱:
从技术上讲,其他应用无法触及应用套装中的文件,因此您无需担心其被编辑。