Как бы я защищал частный API - PullRequest
4 голосов
/ 03 января 2012

Я работаю над REST API, который будет использоваться мобильным приложением, которое я пишу, в основном для связи с базой данных.

Мобильное приложение выполняет звонки по таким URL-адресам:

example.com/mobileapi/getinfo

И несет определенную полезную нагрузку POST вместе с каждым вызовом.

Меня не беспокоит аутентификация пользователей и т. Д.

Однако меня беспокоит то, что если бы кто-то использовал мобильное приложение вместе с инструментом мониторинга сети, таким как Fiddler или Wireshark, он мог бы документировать все вызываемые URL-адреса, а также все параметры POST. Этого будет достаточно для создания собственного приложения, использующего мой API.

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

1 Ответ

9 голосов
/ 03 января 2012

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

Вот подход высокого уровня. Создайте самозаверяющий SSL-сертификат сервера и разверните его на своем веб-сервере. Если вы используете Android, вы можете использовать для этой цели keytool, включенный в Android SDK; если вы используете другую платформу приложений, для них также существуют аналогичные инструменты. Затем создайте самозаверяющий клиент и разверните его в своем приложении в пользовательском хранилище ключей, включенном в ваше приложение, в качестве ресурса (keytool также сгенерирует это). Настройте сервер так, чтобы он требовал SSL-аутентификацию на стороне клиента и принимал только сгенерированный вами сертификат клиента. Настройте клиент для использования этого сертификата на стороне клиента, чтобы идентифицировать себя и принять только один сертификат на стороне сервера, который вы установили на своем сервере для этой его части.

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

Шаг за шагом это гораздо более длинный ответ, чем здесь оправдано. Я бы предложил сделать это поэтапно, так как в Интернете есть ресурсы о том, как работать с самозаверяющим SSL-сертификатом в Android (я не так хорошо знаю, как это делать на других мобильных платформах), как на стороне сервера, так и на стороне клиента. В моей книге Application Security для платформы Android , опубликованной О'Рейли, есть полный обзор.

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