2013-02-17 2 views
2

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

Мобильное приложение doe имеет своего рода уникальный идентификатор (который нельзя подражать)?

ответ

2

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

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

  1. Предполагая, что вы реализуете приложение, сохраните какой-то секретный ключ API в коде.

  2. Когда приложение вызывает вызов API через HTTP, оно всегда будет выполняться с использованием HTTPS (так что все зашифровано).

  3. Приложение отправит секретный ключ API в качестве параметра URL.

  4. Сервер аутентифицируется, проверяя правильность секретного ключа.

Приобретение трафика приложения не будет раскрывать секретный ключ (из-за HTTPS).

Вы в основном уязвимы для того, чтобы кто-то обратил ваше приложение, чтобы открыть секретный ключ внутри. Это можно сделать жестким, используя различные методы обфускации и анти-отладки, но не может быть сделано действительно невозможным. Пока вы используете скомпилированный язык (например, Objective-C, а не JS для веб-приложения), это уже будет сложно без каких-либо специальных игр. Если вы избегаете размещения своей строки ключа API как-есть и вычислите ее с помощью короткого кода в приложении, вы сделали это примерно в 1000 раз более трудным для обнаружения.

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

+0

Мне действительно нужно аутентифицировать как веб-клиентов, так и мобильных клиентов. Веб-клиент использует JavaScript, поэтому легко получить секретный ключ, однако ваше решение будет отлично работать для мобильного клиента. поэтому, если я идентифицирую тип клиента, я могу аутентифицироваться по-разному. Благодаря! –

+0

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

2

Это зависит от того, как вы определяете «мобильное приложение». Любое приложение работает на мобильном устройстве? Просмотр веб-страниц на мобильном устройстве? Что для вас мобильное устройство?

В любом случае, общий короткий ответ заключается в том, что вы можете определить тип устройства, используя User-Agent, отправленный в заголовках HTTP. Все популярные мобильные браузеры отправляют это. Но надо знать, что:

  • Это может быть подделан (легко)
  • Некоторые приложения (например, iPhone или Android приложений и подобных) могут быть написаны таким образом, что они не посылают агента пользователя с запросами HTTP. Однако передовая практика предусматривает отправку User-Agent.

Я не знаю более надежного способа сделать это; и до тех пор, пока что-то происходит через HTTP, вообще не будет никакого способа узнать что-либо о клиенте наверняка. Для большинства случаев использования вы будете в порядке, глядя на User-Agent.

Вы можете купить доступ к базам данных User-Agent, содержащим различные данные устройства, если это применимо, два из которых находятся WURFL или DeviceAtlas.

2

На практике существует два метода. Базовая аутентификация HTTP (не очень безопасная для мобильных приложений) и OAuth2 (защищенная по сравнению с базовой аутентификацией HTTP).

  • HTTP Basic Authentication: Процесс прост как для технических писателей услуг API, а также разработчиков их использования:

Разработчик дается ключ API (обычно ID и Secret) , Этот ключ API обычно выглядит примерно так: 3bb743bbd45d4eb8ae31e16b9f83c9ba: ffb7d6369eb84580ad2e52ca3fc06c9d.

Он несет ответственность за хранение ключа API в безопасном месте на своем сервере, так что никто не может получить к нему доступ. Он делает запросы API к службе API, подавая ключ API в заголовок HTTP-авторизации вместе со словом «Basic» (который используется сервером API для правильного декодирования учетных данных авторизации). Ключ также кодируется Base64.

Например ключ может быть: 3bb743bbd45d4eb8ae31e16b9f83c9ba: ffb7d6369eb84580ad2e52ca3fc06c9d

закодированы в base64: M2JiNzQzYmJkNDVkNGViOGFlMzFlMTZiOWY4M2M5YmE6ZmZiN2Q2MzY5ZWI4NDU4MGFkMmU1MmNhM2ZjMDZjOWQ =.

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

HTTP Basic Authentication прост, но для мобильных приложений защита ключа API является основной задачей. Для проверки подлинности HTTP Basic Basic для каждого запроса требуются необработанные ключи API, что увеличивает вероятность злоупотреблений в долгосрочной перспективе. Также нецелесообразно, так как вы не можете безопасно вставлять ключи API в мобильное приложение, которое распространяется среди многих пользователей.

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

Таким образом, HTTP Basic Authentication опасна в открытых средах, таких как веб-браузеры и мобильные приложения.

ПРИМЕЧАНИЕ. Как и все протоколы аутентификации, HTTP-аутентификация должна использоваться по протоколу SSL в любое время.

  • OAuth2 для мобильной API безопасности:

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

маркер аутентификации OAuth2 работает с точки зрения пользователя (OAuth2 имя его пароль потока гранта):

Когда пользователь запускает мобильное приложение, он побудил имя пользователя или адрес электронной почты и пароль. Разработчик отправляет запрос POST из приложения в службу API с включенными данными входа (через SSL). Затем проверьте учетные данные пользователя и создайте токен доступа для пользователя, срок действия которого истекает через определенное время. Этот токен доступа можно хранить на мобильном устройстве, рассматривая его как ключ API, который позволяет получить доступ к службе API. Когда истекает срок действия токена доступа, пользователь снова запрашивает данные для входа.

OAuth2 генерирует токены доступа, которые могут храниться в открытой среде временно и безопасны. Это безопасно, поскольку токен доступа генерируется для временной цели и уменьшает потенциал повреждения.

Токен хранится в соответствии с используемой мобильной платформой. Для Android-приложения маркеры доступа могут быть сохранены в общих настройках и для приложения iOS в Keychain.

Смежные вопросы