Защита файлов 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
,
Если он должен быть защищен от случайного отслеживания (например, пароль пользователя), сохраните его в связке ключей.
Если он должен быть защищен от пользователя (например, регистрационный код), вам нужно будет свернуть свое собственное шифрование, а затем хранить данные там, где вам нравится.
РЕДАКТИРОВАТЬ:
Или, если ваша структура данных проста, более простой способ (чем шифрование) записывает их в текстовый файл, который не будет редактируемым или видимым для пользователя.