Защита файлов plist от редактирования пользователями

В настоящее время я храню кучу данных в NSUserDefaults или простых списках, таких как точки, уровни и т. Д., Которые прекрасно работают.

Проблема в том, что любой может редактировать любой файл pList. Нет необходимости в джейлбрейке. Вы даже можете использовать бесплатную пробную версию iExplorer...

Я думал о связке ключей, но это, кажется, намного сложнее, чем NSUserDefaults. Я не против, если пользователь может видеть файлы. Я просто не хочу, чтобы они могли что-либо редактировать.

Кай

2 ответа

Решение

Я рекомендую использовать связку ключей для любых данных, которые вы хотите защитить от редактирования пользователем. Поначалу это может показаться сложным, но это не так сложно: связка ключей может хранить произвольно NSData, так что вы можете написать функцию, которая будет принимать NSPropertyList, сериализовать его и сохранить в связку ключей.

Функция для хранения произвольных 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) и сохранение этих дайджестов в цепочке для ключей. Ваше приложение должно будет повторно вычислять дайджест каждый раз, когда оно записывает файл, и оно должно будет проверять дайджест при загрузке данных из списка свойств.

Если часть данных не является конфиденциальной (например, размер шрифта по умолчанию), сохраните ее в NSUserDefaults,

Если он должен быть защищен от случайного отслеживания (например, пароль пользователя), сохраните его в связке ключей.

Если он должен быть защищен от пользователя (например, регистрационный код), вам нужно будет свернуть свое собственное шифрование, а затем хранить данные там, где вам нравится.

РЕДАКТИРОВАТЬ:

Или, если ваша структура данных проста, более простой способ (чем шифрование) записывает их в текстовый файл, который не будет редактируемым или видимым для пользователя.

Другие вопросы по тегам