Хранение токена аутентификации на iOS

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

Какой лучший способ сделать это безопасно?

Могу ли я просто полагаться на приостановленное приложение и хранить токен в "памяти"?

Ответ 1

2 варианта

  • Использовать NSUserdefault (сохранить как токены доступа или текстовые поля [Запомнить меня])
  • Доступ к Keychain (рекомендуется) для выполнения задания.

NSUserdefaults не защищен для хранения таких достоверных значений, которые предназначены для аутентификации. Keychain с другой стороны делается для этого, безопасным и безопасным.

Ответ 2

Вы не можете полагаться на то, что iOS сохранит ваше приложение навсегда в памяти. Таким образом, вы должны сохранить токен в постоянном хранилище в какой-то момент.

Посмотрите Служба брелка для iOS. Это лучшее место для хранения таких вещей, как пароли, токены и другие ключи.

Ответ 3

Вы не можете сделать это "надежно". Знак является общедоступным, и как только на вашем устройстве хакер может получить доступ к нему независимо от того, что вы пытаетесь сделать, чтобы его защитить. Ввод его в брелок не изменит этот факт. Даже если вы сохраните его там, что сделает его безопасным, пока оно там, они могут просто подождать, пока он не истечет, а затем зацепите следующий, когда он поступит через провод в следующий раз. Ваши токены доступа - это не то, что вам нужно беспокоиться о защите, потому что вы не можете этого делать в мобильной среде.

Это означает, что вы можете хранить его в любом месте. NSUserDefaults в порядке, keychain в порядке, база данных в порядке, текстовый файл в вашем каталоге документов в порядке. Все они одинаково безопасны, потому что определенный хакер может просто ждать подходящей возможности доступа к требуемым данным. Вместо этого вам следует беспокоиться о защите учетных данных пользователей. Убедитесь, что вы храните их в цепочке ключей и только когда-либо связываетесь с вашим API через HTTPS на сервере с действительным сертификатом SSL.