Я извлекаю данные с внешнего сервера для использования с моим приложением для Android. Я хотел бы, чтобы эти данные были доступны только с моим приложением. Я использую стандартное http-соединение для получения данных с сервера apache / php в формате json. Я также отправляю некоторые параметры на сервер для получения соответствующих данных. Теперь я планирую сделать следующее:
Теперь вопрос в том, что это безопасный подход к обратному проектированию? На данный момент я не могу придумать никакой другой возможности получить эти данные. Но если кто-то сможет декомпилировать мой apk, он также сможет получить эту «someSecretPhrase» (довольно сложно сделать на стороне сервера), а затем получить доступ к серверу, не так ли? Это реальная угроза? Есть ли еще одна возможность аутентификации моего приложения сервером?
Например, я смотрел на форумы. Определите, запрашиваются ли HTTP-запросы из приложения Android или нет? а затем отреагировать соответствующим образом , но они не объясняют проблему декомпиляции.
Одним из основных правил безопасности является: вы не доверяете данным клиента. Когда-либо.
Вы должны учитывать, что ваше приложение декомпилировано, все «секретные» ключи, известные злоумышленнику, и т. Д.
Тем не менее, вы можете помешать попыткам злоумышленника подделать ваши запросы. Отправка (и проверка) контрольной суммы вашего запроса является одним из методов (ваша идея MD5(secret_key + params)
).
Вы также можете переключиться на двоичный зашифрованный протокол. Но для этого требуется БОЛЬШЕ большая работа и совершенно другая архитектура сервера.
Попросите приложение выполнить рукопожатие с сервером, поэтому алгоритм – это не просто строка, а целый процесс. Использование сеансов / баз данных для отслеживания вашего рукопожатия
К сожалению, если кто-то декомпилирует ваш apk, тогда он может легко увидеть ваши строки.
EDIT: Я не думаю, что есть лучший способ сделать это. Возможно, только для публикации вашего приложения на рынке Android с включенной защитой от копирования на Android …
Вы можете скрыть свои ссылки, установив все URL-адреса ссылок и имена параметров в файле strings.xml, например: http://wwww.yourdomain.com/yourpage.any имя_пользователя и получить URL-адрес, например:
String serverUrl = Resources.getsystem().getstring(R.strings.name_your_link_id); String parameterKey = Resources.getsystem().getstring(R.strings.name_your_parameter_id); Uri url = Uri.parse(serverUrl+"?"+parameterKey+"=" + yorusername);
и сделать любой HTTP-запрос HttpURLConnection con = (HttpURLConnection) url.openConnection ();
когда кто-то пытается декомпилировать ваше приложение, он будет показывать только id как длинное целое число в файле R.java, чтобы получить код, такой как String serverUrl = Resources.getsystem().getstring(12346546564); String parameterKey = Resources.getsystem().getstring(123321321132);
String serverUrl = Resources.getsystem().getstring(12346546564); String parameterKey = Resources.getsystem().getstring(123321321132);
Android требует, чтобы перед тем, как он может быть установлен, вы должны подписать свое приложение (подпись или самозапись). Мы можем использовать это, чтобы проверить, поступают ли запросы от вашего приложения или нет.
Даже в том случае, когда кто-то сжимает ваше приложение, он должен подписать его еще раз, прежде чем он сможет быть установлен, что изменит подпись приложений, и наш механизм проверки просто отклонит все такие запросы.
Этот ответ основан на этом блоге. Используйте https для связи приложений <->.