Обработка функциональности входа в систему для подключения собственного приложения к веб-сервису - PullRequest
22 голосов
/ 04 сентября 2011

После обширного исследования я не смог найти четкого ответа на свой вопрос.Во-первых, может ли кто-нибудь рассказать мне основную логику обработки «функциональности входа в систему» ​​для собственного приложения iphone, подключающегося к веб-службе?Например, приложение facebook запрашивает имя пользователя и пароль сразу после запуска, и оттуда у вас есть полный доступ к вашей учетной записи во всех последовательных представлениях приложения.Каждый раз, когда вы публикуете что-то и т. Д., Вам не нужно повторно входить в систему ... Может кто-нибудь объяснить мне этот процесс?Это делается с помощью куки или сессий?брелок связан?

У меня сейчас есть полуработающее приложение, но я почти уверен, что могу делать это лучше и безопаснее.Вот что я делаю:

1) Настройте локальный сервер с базой данных пользователей (столбцы имени пользователя и пароля, другие таблицы и т. Д.), Используя mysql.Написал простой веб-сервис, который принимает данные POST и запрашивает базу данных, чтобы проверить, существует ли имя пользователя ... и если это так, то пароли равны.Использование хэширования sha1.Эхо правда или ложь соответственно.

2) У моего приложения есть начальный экран входа в систему с 2 текстовыми полями (1 для имени пользователя и 1 для пароля) и кнопкой, которая вызывает метод входа.Мой метод входа в систему делает следующее:

  • init * NSURL со строкой (URL моего веб-сервиса: @ "http://webservice.com/login.php")
  • init * ASIFormDataRequst с этим URL
  • установить значение post с паролем и текстом электронной почты в текстовых полях
  • установить делегата себе
  • вызвать startAsycronous по запросу
  • реализовал метод requestFininshed для получения«истинно» или «ложно» эхом от веб-службы
  • в зависимости от ответа, перейти к следующему представлению, иначе, сделать предупреждение, повторяющее пользователю

Итак, мои вопросы:

1) Безопасно ли это для отправки паролей? (Через ASIHTTPRequest и метод POST?) 2) В последующих представлениях пользователь должен иметь возможность взаимодействовать со своей учетной записью (например,размещение сообщений, статусов и картинок на Facebook) Как сохранить статус пользователя, вошедшего в систему, чтобы каждый раз, когда пользователь взаимодействовал с базой данных, я мог гарантировать, что пользователь все еще вошел в системуи что это тот же пользователь?Например, я могу думать только о том, чтобы сделать это, если я сохраню файл cookie на устройстве пользователя с именем пользователя и паролем, а затем при каждом последующем взаимодействии с веб-службой / базой данных он выполняет аутентификацию со значениями файла cookie (имя пользователяи пароль).

Должен ли быть лучший способ сделать это?Может быть, сессии или куки?или с помощью брелка ??

Спасибо за помощь, ребята, и извините за длинный вопрос!


1 Ответ

14 голосов
/ 04 сентября 2011

Вот мои мысли, основанные на том, что я знаю:

1) Is this secure for sending passwords? (via ASIHTTPRequest and the POST method?)

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

2) В последующих представлениях пользователь должен иметь возможностьвзаимодействовать со своей учетной записью (например, размещать> сообщения, статусы и изображения в Facebook). Как сохранить статус пользователя, вошедшего в систему>, чтобы каждый раз, когда пользователь взаимодействовал с базой данных, я мог гарантировать, что пользователь все еще вошел в систему ичто это один и тот же пользователь?

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

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

  1. для проверки личности через логин
  2. Телефон украден хакерами, которые могут получить токеносмотр местного хранилища.

Сопоставление необходимо для того, чтобы вы могли проверить, что токен является реальным токеном, который был связан с пользователем при входе в систему.Кроме того, для номера 2 вы можете предложить функцию удаленной очистки, которая в основном убивает отображение и делает этот токен недействительным.

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

Существует многоалгоритм генерации этого токена.Например, язык программирования Java предоставляет класс SecureRandom для обеспечения криптографической случайности, а .NET имеет аналогичный безопасный класс RandomGenerator .

Если вы хотите взглянуть на алгоритм, который OATH предложил Основанный на времени алгоритм одноразового пароля (TOTP) , который является расширением HOTP .Большинство языков / платформ имели бы криптографически сильный генератор случайных чисел, который вы могли бы использовать немедленно, хотя без необходимости писать его самостоятельно.

В зависимости от реализации / платформы вашего сервиса, вы можете запросить у SO подходящий класс / модуль для криптографически случайного генератора, такой как тот, который задан здесь «Как генерировать криптографически безопасные случайные числа с помощью php"

...