Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Как сделать закрытый веб-API для Андроид приложения

#мобильные_приложения #android #php #клиент_сервер #java


Как можно защитить свое API, чтобы никто не смог в обход приложения отправлять свои
запросы на веб-сервис?

Допустим имеем:

1) Веб-сервис/API (к примеру написанный на PHP) по адресу myapi.com (адрес вымышленный)

2) Андроид приложение, которое общается с нашим веб-сервисом.

К примеру, наше приложение обращается к нашему API для получения информации, к примеру
по адресу:  http://myapi.com/?action=getnews&limit=5

При фильтрации трафика, можно увидеть по какому адресу приложение получает информацию,
и соответственно можно самому слать запрос и читать всю информацию как угодно.

Мы можем посылать еще хэш сумму с солью которая известна только веб-сервису и приложению
(md5("getnews5blablabla")), и веб-сервис будет ее проверять на валидность.

К примеру запрос стал таким:
http://myapi.com/?action=getnews&limit=5&hash=efd46105a8915cb92df4641d86eb0505

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

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


Ответы

Ответ 1



Есть вариант завязать аутентификацию на in-app billing через Google Play. То есть делаем так: Публикуем свою прогу в Google Play и регистрируем там managed in-app item Юзер покупает данный item и при покупке пишем в developer payload наш случайный хэш (или ключ) сгенерированный аппой и/или веб сервером Далее перед коннектом с нашим веб API, аппа обязана получить хэш от сервера Google Play и с этим хэшем обратиться к сервису - иначе reject Естественно можно закэшировать хэш, чтобы каждый раз не бегать к Google Play и проч., но это уже детали. Общий смысл в том, что появляется доверенный источник между нашей аппой и веб сервисом, которому оба доверяют. Google Play в общем то подходит для этого, поскольку связка наше приложение - Google Play работает железобетонно и реализовано на уровне системного сервиса Android'а - другое приложение не сможет встроиться в эту связку (вернее можно, но очень и очень сложно)

Ответ 2



Ответ очевиден. Никак. Любая ваша защита будет преодолеваться либо изучением трафика, либо реверсингом приложения и локализацией кода, отвечающего за генерацию этого самого хеша или подписи запроса. Максимум, что вы сможете сделать — усложнить этот процесс до определённой степени, но не более того. Но тут уже встаёт вопрос о компромиссе между усложнением защиты (и увеличением времени и стоимости разработки самого API и клиентов к нему) и выгодой от получаемого эффекта.

Ответ 3



Реализовать веб сервис по протоколу https и базовая аутентификация. Сниффером логин пароль не дёрнут. Т.е. чтобы веб сервис был не публичным - нужна аутентификация. А публичный закрытый сервис - это оксюморон. UPD Любую защиту можно сломать. Если у Вас всё так пароинаидально то сделайте такую схему: Пользователь авторизируется на сервисе по телефону или через веб браузер - ему выдаётся ключ на доступ скажем на пол часа. Приложение просит этот ключ и отдаёт его сервису. Сервис проверяет активен ли ключ и или отвечает или нет. Если нет - приложение просит обновить ключ. Ну и плюс можете зашить на этот ключ генерацию токена на каждый запрос. Ну и плюс можно добавить на сервис эвристический анализ запросов - если не укладывается в логику работы приложения - то значит запросы левые и не отдавать ничего.

Ответ 4



Попробуйте вынести генерацию "соли" из Java кода в код, написанный на C++. Его будет сложнее декомпилировать.

Комментариев нет:

Отправить комментарий