Проверьте, поступает ли http-запрос из моего приложения для Android
Я получаю данные с внешнего сервера для использования с моим приложением для Android. Я бы хотел, чтобы эти данные были доступны только с помощью моего приложения. Я использую стандартное http-соединение для получения данных с сервера apache/php в формате json. Я также отправляю некоторые параметры на сервер для получения соответствующих данных. Теперь я планирую сделать следующее:
- Отправьте параметры
- Отправьте что-то вроде md5 ("Какая-то секретная фраза"+параметры).
- Проверьте правильность секретной фразы на сервере сторона.
Теперь вопрос в том, является ли это безопасным подходом в отношении обратного проектирования? На данный момент я не могу придумать никакой другой возможности получить эти данные. Но если кто-то сможет декомпилировать мой apk, он также сможет извлечь эту "секретную фразу" (довольно сложно сделать на стороне сервера), а затем получить доступ к серверу, не так ли? Это реальная угроза? Есть ли какая-либо другая возможность проверить подлинность моего приложения на сервере?
Я посмотрел на форумах, например. Определите, является ли HTTP запросы из приложения для Android или нет? а затем ответьте соответствующим образом, но они не объясняют проблему декомпиляции.
5 answers
Одно из основных правил безопасности гласит: вы не доверяете данным клиента. Никогда.
Вы должны учитывать, что ваше приложение декомпилировано, все "секретные" ключи известны злоумышленнику и т.д.
Однако вы можете препятствовать попыткам злоумышленника подделать ваши запросы. Отправка (и проверка) контрольной суммы вашего запроса является одним из методов (ваша идея MD5(secret_key + params)
).
Вы также можете переключиться на двоичный зашифрованный протокол. Но для этого требуется ГОРАЗДО больше работы и совершенно другая архитектура сервера.
Попросите ваше приложение выполнить рукопожатие с сервером, чтобы алгоритм был не просто строкой, а целым процессом. Используйте сеансы/базы данных для отслеживания вашего рукопожатия
Вы можете скрыть свои ссылки, установив все 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();
Когда кто-либо попытается декомпилировать ваше приложение, он покажет только идентификатор в виде длинного целого числа в R.java файл получить код такой это
String serverUrl = Resources.getsystem().getstring(12346546564);
String parameterKey = Resources.getsystem().getstring(123321321132);
Android требует, чтобы кто-то подписал свое приложение (с правом подписи или с собственной подписью), прежде чем его можно будет установить. Мы можем использовать это, чтобы проверить, поступают ли запросы из вашего приложения или нет.
- Подпишите свое приложение своим сертификатом.
- Найдите подпись сертификатов и сохраните ее на своем внутреннем сервере.
- Для каждого запроса ожидайте, что эта подпись будет отправлена приложением.
- проверьте подпись, отправленную приложением на уровне сервера, и принимайте только в том случае, если они совпадают.
Даже в том случае, если кто-то вмешивается в ваше приложение, он должен подписать его снова, прежде чем его можно будет установить, что изменит подпись приложений, и наш механизм проверки просто отклонит все такие запросы.
Этот ответ основан на этом блоге. Используйте https для связи с сервером приложения.
К сожалению, если кто-то декомпилирует ваш apk, он может легко увидеть ваши строки.
РЕДАКТИРОВАТЬ: Я не думаю, что есть лучший способ сделать это.. возможно, только для публикации вашего приложения на Android Market с включенной защитой от копирования Android...