2011-12-28 2 views
7

Я извлекаю данные с внешнего сервера для использования с моим приложением для Android. Я хотел бы, чтобы эти данные были доступны только с моим приложением. Я использую стандартное http-соединение для получения данных с сервера apache/php в формате json. Я также отправляю некоторые параметры на сервер для получения соответствующих данных. Теперь, что я планирую сделать, это:Проверьте, есть ли HTTP-запрос из моего приложения для Android.

  1. Отправить на Params
  2. отправить что-то вроде md5 ("someSecretPhrase" + Params).
  3. Проверьте правильность секретной фразы на стороне сервера.

Теперь вопрос заключается в безопасном подходе к обратному проектированию? На данный момент я не могу придумать никакой другой возможности получить эти данные. Но если кто-то сможет декомпилировать мой apk, он также сможет получить эту «someSecretPhrase» (довольно сложно сделать на стороне сервера), а затем получить доступ к серверу, не так ли? Это реальная угроза? Есть ли еще одна возможность аутентификации моего приложения сервером?

Я смотрел, например, на форумах. Identify whether HTTP requests from Android App or not? and then respond appropriately, но они не объясняют проблему декомпиляции.

ответ

7

Одно из основных правил безопасности: вы не доверяете данным клиента. Когда-либо.

Вы должны рассмотреть ваше приложение декомпилированы, все «секретные» ключи известны атакующего и т.д.

Вы можете, однако, препятствуют попыткам злоумышленника, чтобы подделать свои запросы. Отправка (и проверка) контрольной суммы вашего запроса является одним из методов (ваша идея MD5(secret_key + params)).

Вы также можете переключиться на двоичный зашифрованный протокол. Но для этого требуется БОЛЬШЕ большая работа и совершенно другая архитектура сервера.

+0

. Я начинаю с совместного хостинга, поэтому для меня не может быть другой архитектуры на сервере. Эти данные не являются уязвимыми (номера кредитных карт клиентов), но для его сбора потребуется много работы (и они будут собираться непрерывно), поэтому было бы очень плохо, если бы кто-то мог просто скопировать мою идею и использовать данные. .. –

+1

Ну, если ваш сервер отвечает некоторыми данными, вы должны считать его общедоступным. Помимо декомпиляции приложений и подделок, он (злоумышленник) может просто использовать данные прокси и дампа, которые вы отправляете в свое законное приложение. –

+0

Итак, если я правильно понял вас, единственная возможность сделать это безопасно - это использовать зашифрованное соединение между сервером и приложением. Https будет нормально? Я понимаю, что это не так просто в использовании. Но каковы другие недостатки? Это значительно медленнее, не так ли? Я просто пытаюсь выяснить, стоит ли безопасность этих данных. –

1

К сожалению, если кто-то декомпилирует ваш apk, тогда он может легко увидеть ваши строки.

EDIT: Я не думаю, что есть лучший способ сделать это .. возможно только опубликовать свое приложение на рынке андроид с андроидами защитой от копирования Включено ...

+0

Благодарим вас за быстрый ответ. Думаю, декомпиляция - довольно простой процесс? Я имею в виду, я не должен полагаться на предположение, что он не будет декомпилирован? Хм, там должно быть какое-то другое решение ... –

+1

Вы можете аутентифицировать пользователей, вы не можете аутентифицировать приложения, вы можете сделать это сложнее, но в конце дня вы отправляете код и секреты плохим парням , – superfell

+0

Да, я, вероятно, переберусь с этим или инвестирую в какое-то шифрование, когда данные докажут его ценность. Тем не менее, я очень удивлен, что так сложно выполнить –

2

Попросите приложение выполнить рукопожатие с сервером, поэтому алгоритм - это не просто строка, а целый процесс. Использование Сеанс/базы данных для отслеживания вашего рукопожатия

+1

И рукопожатие выполняется над ssl, не так ли? Так что это было бы почти то же самое, что мы упоминали в комментариях eralier (не означает контрольной суммы здесь). Но хорошо знать, что эта вещь называется рукопожатием, спасибо! –

1

Вы можете скрыть ваши ссылки, установленные все URL-адреса ссылок и paramete имен в strings.xml, например: http://wwww.yourdomain.com/yourpage.any USER_NAME! и получить 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);

+1

Но я думаю, что это только сделало бы его немного более громоздким, а не невозможным. Строковые ресурсы находятся внутри resources.arsc при распаковке файла * .apk. Таким образом, они все еще связаны с этими числами. Но +1 для интересной идеи –

1

Android требует, чтобы один должен sign своих приложения (право подписи или самоподписывающееся) прежде чем он сможет быть установлен. Мы можем использовать это, чтобы проверить, поступают ли запросы от вашего приложения или нет.

  1. Подпишите свое приложение с вашим сертификатом.
  2. Find подпись сертификатов и сохранение их на вашем серверном сервере.
  3. Для каждого запроса ожидайте, что эта подпись будет отправлена ​​приложением.
  4. проверять подпись, отправленную приложением на уровне сервера, и принимать только в том случае, если они совпадают.

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

Этот ответ основан на блоге this. Используйте https для приложения < -> серверная связь.

+1

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

+0

Как сделать шаг 3, это поведение по умолчанию ОС Android? –

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