iphone - 将值保存到磁盘并防止篡改的最佳方法? (没有顶级加密)

标签 iphone objective-c

我正在编写一个游戏,我希望高分能够保存在本地,但我不希望用户能够进入 plist 文件并更改值。让用户难以轻松编辑高分的最佳方法是什么。将值设为 NSNumber 然后我将其写为 NSData 就足够了吗?

最佳答案

AES 可能比它在这里的值(value)更麻烦。尽管我很尊重 Jeff LaMarche,但这个实现并不好。它足以用于此目的,但在我看来,除非您了解什么是对的,什么是错的,否则它不是可以复制的东西。我在 Properly encrypting with AES with CommonCrypto 中详细讨论了这个问题并包括如何正确执行 AES;但您可能不希望在这里正确执行 AES 的麻烦,即使您这样做也不会给您带来太多好处。

我的建议是一个简单的校验和哈希:

- (NSUInteger)checksumForScore:(NSUInteger)score player:(GKPlayer *)player {
  NSString *string = [NSString stringWithFormat:@"%d%@%@", score, [player playerID], kLongRandomPassword];
  return [string hash];
}

然后您将校验和与分数一起存储。你像这样验证它:

- (BOOL)isValidChecksum:(NSUInteger)checksum forScore:(NSUInteger)score player:(GKPlayer *)player {
  return (checksum == [checksumForScore:score player:player]);
}

我在这里使用了 GKPlayer playerID 来选择您易于使用的东西,但对于设备所有者来说在玩游戏时更改起来并不容易。这样做会使重放攻击变得困难。我不能只是将我 friend 的超高分的 plist 条目复制到我的 plist 中。当用户更改设备或恢复此设备时,它也非常持久。如果您不使用 GameKit,首先,您可能应该 :D,其次,您必须弄清楚是否还有其他要使用的键。如果您让用户在某个时候输入“用户句柄”,也可以。任何对用户来说足够独特以至于他不会只是复制他 friend 的东西。

钥匙串(keychain)作为一种混淆技术很有趣。即使是合法阅读也是一种皇家痛苦,所以官方 SDK 提供了自己的混淆 :D 我怀疑这是否值得,但它是“隐藏”少量数据的好地方。

NSCoding 甚至不是混淆。任何愿意打开 plist 的人都可以在不到一分钟的时间内读写 NSCoding。将其转换为 NSData 也是如此。将其存储在 SQLite 或 Core Data 中也是如此。

@CocoaFu 关于 NSDataWritingFileProtectionComplete 的建议很聪明,但我怀疑它是否会对越狱设备产生任何实际影响。设备解锁后,操作系统将为您解密任何文件,因此对于知道设备 PIN 码的人来说完全没有障碍。

关于iphone - 将值保存到磁盘并防止篡改的最佳方法? (没有顶级加密),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216796/

相关文章:

iphone - tableviewDataSource 中的内存管理

iphone - iOS7 状态栏像原生天气应用

java - 尝试从构建多部分的 Objective-C 文本在 Java 中构建多部分实体

ios - objective-c - ScrollView 内的多个 ScrollView

objective-c - 核心数据多对多关系的正确删除规则?

iPhone 5 报告屏幕高度不正确

c# - 在 Monotouch 中绑定(bind) extern NSString

ios - 分段控件在第一段中显示奇怪的标题

ios - 在调度 block 中分配的变量返回 null

ios - 如何在我的应用程序启动时自动打开蓝牙连接