Хранение токенов аутентификации в iOS - NSUserDefaults vs Keychain?

Каково место, где я должен хранить токены, когда пользователь входит в систему? Я не сохраняю пароли (очевидно, где я использую Keychain), но только токен. Многие места говорят, что просто используют NSUserDefaults, но некоторые люди из StackOverflow действительно очень заинтересованы в Keychain.

Является ли NSUserDefaults точным?

Ответ 1

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

NSUserDefaults не является безопасным или зашифрованным - его легко открыть и прочитать как на устройстве, так и при синхронизации с Mac. Таким образом, хотя пользовательские настройки по умолчанию являются хорошим местом для таких вещей, как настройки и информация о конфигурации, они не являются хорошим местом для чего-либо чувствительного, например паролей.

Токены сеансов почти всегда должны обрабатываться так же, как пароли, поэтому их следует надежно хранить в цепочке для ключей, где они будут зашифрованы. У Apple есть некоторый пример кода (GenericKeychain), который показывает базовую реализацию, а другие примеры вы найдете, выполнив поиск в StackOverflow. Надеюсь, это помогло вам.

Ответ 2

Стоит посмотреть на Lockbox. Это действительно упрощает взаимодействие с Keychain.

Ответ 3

NSUserDefaults можно использовать без проблем. Пожалуйста, проверьте документацию https://developer.apple.com/documentation/security/keychain_services

Службы цепочки для ключей придуманы для "секретов", о которых явно заботится пользователь, то есть паролей, закрытых ключей или даже защищенных заметок, т.е. Но токены доступа являются временными хешами, сгенерированными после ввода пароля пользователем, и имеют ограниченное время. И даже в случае кражи злоумышленник не сможет полностью украсть учетную запись - владелец может войти в систему на другом устройстве, и предыдущий токен доступа будет сброшен. Таким образом, формально нет запрета хранить токены доступа в UserDefaults.

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

Тем не менее, рекомендуется хранить его в связке ключей, но это просто чрезмерное (!) Использование безопасности, которое обычно рекомендуется случайным пользователям в Интернете и не требуется Apple. Там нет документации от Apple, там говорится, что токены должны храниться в связке ключей (если вы можете найти один, то, пожалуйста, прокомментируйте один ниже).

Итак, ответ - вы можете использовать оба. Однако, если ваше приложение работает с контентом, который стоит дорого по сравнению с украденным iPhone, то лучше использовать Keychain, но это всего лишь рекомендация.