Как обезопасить NSUserDefaults? - PullRequest
17 голосов
/ 13 октября 2009

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

Ответы [ 7 ]

22 голосов
/ 28 января 2010

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

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

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

9 голосов
/ 26 октября 2009

Я написал простую в использовании и небольшую категорию именно для этой цели. Работает на iPhone и Mac OS X, это бесплатно и под лицензией MIT. Вы можете найти его на github: SecureUserDefaults

4 голосов
/ 14 октября 2009

NSUserDefaults должен содержать только те настройки, которые вы хотите, чтобы ваш пользователь мог изменять. Внутренние данные приложения не должны быть в NSUserDefaults. Сохраните свои внутренние данные в NSDictionary и запишите их в отдельный файл в ваших документах приложений или в папке tmp.

NSDictionary* dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];
BOOL succeeded = [dict writeToFile:[self dbFullPathName] atomically:YES];
4 голосов
/ 14 октября 2009

Вы можете хранить действительно защищенные данные в связке ключей iPhone. Альтернативой этому являются ваши собственные классы шифрования (могут ограничивать распространение приложения) или запутывание с помощью некоторой другой кодировки, такой как nsdata, base64 и т. Д.

2 голосов
/ 14 октября 2009

Используйте криптографический алгоритм, такой как AES , чтобы зашифровать данные, которые вы храните в NSUserDefaults.Сохранение ключа шифрования, встроенного в ваше приложение, либо жестко запрограммированным, либо вычисленным с использованием последовательности операций над несколькими элементами, будет успешно сдерживать любую инициативу редактирования в отношении значений, которые вы храните.Чтобы упростить задачу, вы должны написать метод-обертку, который принимает ключ и значение в виде открытого текста, шифрует их, а затем сохраняет их в NSUserDefaults для вас и, конечно, делает то же самое в обратном порядке при чтении значений обратно.Однако обратите внимание, что это будет медленнее, чем небезопасное хранилище, учитывая время на шифрование / дешифрование, поэтому рассмотрите возможность применения этого метода только к наиболее чувствительным параметрам конфигурации вашего приложения.

0 голосов
/ 13 октября 2009

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

0 голосов
/ 13 октября 2009

для айфона? Они не могут изменять эти переменные, нет Terminal.app, чтобы изменить это (кроме взломанных устройств, но это проблема для Apple, а не для вас). Для настольных приложений вы можете закодировать их с помощью NSData, и они будут заархивированы как base 64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...