Kodak Digital Cinema System (и я не просто говорю это, потому что я записал о 1/3-м из него включая большинство gui.)
Честно говоря, это не проблема, если вы не хотите хранить что-то в NSUserDefaults
, которое следует держать в секрете от пользователя. Пользователи на самом деле не входят в свои предпочтения и не редактируют их напрямую, если только там нет чего-то скрытого, что нельзя изменить через пользовательский интерфейс (например, скрытые настройки, которые Apple не дает вам пользовательского интерфейса для изменения, но которые имеют реальные , стабильные, полезные эффекты при изменении).
для iPhone? Они не могут изменить эти переменные, нет Terminal.app, чтобы это изменить (кроме устройств с взломом, но это проблема Apple, а не вас). Для настольных приложений вы можете закодировать их с помощью NSData, и они будут заархивированы как base 64.
Вы можете хранить действительно безопасные данные в связке ключей iPhone. Альтернативой этому являются ваши собственные классы шифрования (могут ограничивать распространение приложений) или обфускация с помощью другой кодировки, такой как nsdata, base64 и т. Д.
NSUserDefaults должен содержать только те параметры, которые вы хотите, чтобы ваш пользователь мог изменять. Внутренние данные приложения не должны находиться в NSUserDefaults. Сохраните свои внутренние данные в NSDictionary и запишите их в отдельный файл в документах приложений или в папке tmp.
NSDictionary* dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];
BOOL succeeded = [dict writeToFile:[self dbFullPathName] atomically:YES];
Используйте криптографический алгоритм, например AES , чтобы зашифровать данные, которые вы храните в NSUserDefaults. Сохранение ключа шифрования, встроенного в ваше приложение, жестко запрограммированного или вычисляемого с использованием последовательности операций над несколькими элементами, успешно сдержит любую инициативу редактирования над значениями, которые вы храните. Чтобы упростить задачу, вы должны написать метод-оболочку, который принимает ключ и значение в виде открытого текста, шифрует их, а затем сохраняет их в NSUserDefaults для вас и, конечно же, делает то же самое в обратном порядке при чтении значений обратно. Однако учтите, что это будет медленнее, чем небезопасное хранилище,
Я написал простой в использовании и маленькая категория именно для этой цели. Работает на iPhone и Mac OS X, бесплатно и по лицензии MIT. Вы можете найти его на github: SecureUserDefaults
Если часть данных не чувствительна (например, размер шрифта по умолчанию), храните его в nsuserdefaults.
Если он должен быть защищен от случайных Snooping (например, пароль пользователя), храните его в брете.
Если он должен быть защищен от пользователя (e.g., регистрационный код), вам нужно будет закатить собственное шифрование, а затем хранить данные, где вам нравится.