保护plist文件不被用户编辑

时间:2014-04-03 08:19:20

标签: ios objective-c ios7 plist

我目前正在NSUserDefaults中存储一堆数据或者像点,关卡等简单的plist,这些数据非常合适。

问题是,任何人都可以编辑任何pList文件。不需要越狱。您甚至可以使用iExplorer的免费试用...

我想到了钥匙串,但这似乎比NSUserDefaults复杂得多。 我不介意用户是否可以看到这些文件。我只是不希望他们能够编辑任何内容。

2 个答案:

答案 0 :(得分:0)

如果某件数据不敏感(例如,默认字体大小),请将其存储在NSUserDefaults

如果需要保护其免受随意监听(例如,用户密码),请将其存储在钥匙串中。

如果需要保护用户安全(例如注册码),则需要自行加密,然后将数据存储在任何地方。

修改

或者,如果您的数据结构很简单,那么比加密更简单的方法是将它们写入.txt文件,该文件对用户不可编辑或不可见。

答案 1 :(得分:0)

我的建议是将Keychain用于您希望防止用户编辑的任何数据。这可能看起来很复杂,但 并不复杂:Keychain可以存储任意NSData,因此您可以编写一个将NSPropertyList的函数,序列化它,并存入Keychain。

将任意NSData存储到钥匙串中的功能如下所示:

+(BOOL)setKeychainData:(NSData*)value forAccount:(NSString*)account {
    if (account == nil || value == nil) {
        return false;
    }

    NSDictionary* query = @{
        (__bridge id) kSecClass          : (__bridge id) kSecClassGenericPassword,
        (__bridge id) kSecAttrAccessible : (__bridge id) kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly, // <- read about this in docs and pick the right one
        (__bridge id) kSecAttrService    : @"MyServiceName",
        (__bridge id) kSecAttrAccount    : account,
        (__bridge id) kSecValueData      : value,
    };

    OSStatus err = SecItemAdd((__bridge CFDictionaryRef) query, NULL);

    if (err != errSecSuccess) {
        NSLog(@"SecItemAdd(): %d", (int) err);
    }

    return (err == errSecSuccess);
}

确保数据完整性的另一种方法是继续将其存储在属性列表文件中并计算这些文件的摘要(例如SHA-1或SHA-256)并将这些摘要存储在Keychain中。您的应用程序必须在每次写入文件时重新计算摘要,并且在从属性列表中加载数据时必须验证摘要。