2012-01-03 3 views
4

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

Мобильное приложение делает вызовы URL, как это:

example.com/mobileapi/getinfo 

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

Я не беспокоюсь об аутентификации пользователя и т.д.

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

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

+4

Вы можете сделать свой API только ответом на SSL, таким образом единственное, что мог видеть инструмент мониторинга, - это рукопожатие/переговоры – rejj

+0

Хм, мне нужно будет почитать об этом. Не очень знакомы с техническими особенностями и внедрением SSL. Это хорошая отправная точка. Спасибо – xbonez

+0

Смотрите это: http://stackoverflow.com/questions/8674459/securing-connection-to-php-server-without-ssl –

ответ

9

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

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

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

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

+1

Я понимаю, что это старый Q/A, но у меня есть вопрос для вас (при условии, что этот метод по-прежнему действителен): что мешает кому-то копировать сертификат из скомпилированного клиентского приложения и использовать его в своих целях? – EvilJordan

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