Защита доступа к URL-адресу API через хэш в приложении для Android

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

Этот новый контент отправляется на сервер через запрос GET:

http://www.example.org/API.php?newContent=helloWorld

Проблема: если пользователь узнает, как выглядит этот URL-адрес, он может легко отправлять вредоносные запросы в свой браузер и обходить приложение Android. Возможно, можно декомпилировать приложение и узнать о URL-адресе.

Как защитить доступ к этому URL-адресу и запретить пользователям напрямую обращаться к этому API?

Является ли это хорошим решением для генерации хэша в приложении и сравнить его с хешем, сгенерированным в файле API.php на сервере?

Не удалось выяснить, как генерируется хеш при декомпиляции приложения?

Спасибо вам заблаговременно!

Ответ 1

Таким образом, единственный способ по-настоящему защитить этот URL-адрес - потребовать, чтобы все запросы к нему были аутентифицированы.

Один из способов сделать это - это изменить ваш запрос на запрос POST и отправить по нему какой-то токен аутентификации (простой хеш) с запросом. Если токена аутентификации отсутствует, просто не отвечайте на запрос. Хэш был бы чем-то, что вы бы жестко задавали как на клиенте, так и на сервере.

Теперь вопрос заключается в том, как скрыть ваш токен аутентификации. До тех пор, пока вы не открываете свой код для своего кода, единственный способ получить его - декомпилировать вашу программу, как вы упомянули. Чтобы защититься от этого, вы можете изучить использование proguard (http://developer.android.com/guide/developing/tools/proguard.html).

Что-то иметь в виду, так это то, что этот метод содержит одну точку отказа. Если ваш токен аутентификации когда-либо раскрывается, вы делаете это (например, криптографический криптографический ключ HD DVD AACS).

Другой способ аутентификации - для каждого пользователя. Пока действительный пользователь делает запрос, вам не все равно, будет ли запрос поступать из веб-браузера или приложения для Android. Я думаю, что это гораздо лучший способ сделать что-то. Делая это, вы можете обрабатывать запросы на основе каждого пользователя. Это, однако, требует от вас управления профилями пользователей и всей червяком червя, который поставляется вместе с ним.

Все, что сказало, в конце дня, хотя вам все равно, если кто-то знает URL-адрес части вашего API. Я не знаю вашего конкретного случая использования, но должен быть способ разработки вашего API, так что вам все равно, как вы получаете ваши запросы. Кроме того, если вы выполняете истинное ПОЛУЧЕНИЕ, то вы не должны ничего менять на сервере. Это означает, что все "злые люди" могут сделать это, чтобы получить данные. Это серьезно ограничивает ущерб, который они могут сделать. Фактически, если у вас нет конфиденциальных данных, которые вы не хотите, чтобы некоторые люди смотрели, у вас действительно нет проблемы. Если вы это сделаете, тогда вам действительно нужно подумать о моем решении для проверки подлинности для каждого пользователя.

Ответ 2

Не доверяйте клиенту для проверки. Это верно, если его javascript в веб-браузере или даже некоторая заблокированная платформа, такая как Iphone.

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

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

Ответ 3

Используйте SSL (HTTPS) для ваших данных. Обмен зашифрован перед отправкой любых данных, поэтому любой, кто слушает, не сможет увидеть ни URL-адрес, ни данные, которые отправляются на сервер. Чтобы убедиться в этом, установите Wireshark в свою систему dev и загрузите URL-адрес в браузер. Вы не увидите никаких данных в ясности (либо URL-адрес, либо данные, которые отправляются через GET или POST).

Ответ 4

Вы можете использовать несколько запутывающий java-метод для обфускации каждой буквы URL-адреса. Таким образом, вы создаете свой собственный словарь таким образом, чтобы URL-адрес мог появиться как 123.3 * 15 * 13 или что-то в этом роде, если кто-то декомпилировал APK, они понятия не имели. И в этой записке вы в идеале должны использовать Proguard для обфускации, поэтому ваша обфускация не имеет смысла для тех, кто пытается перепроектировать.

Вы можете сделать короткий Java-метод следующим образом:

public String confuseString() {
    Stringbuilder sb = new StringBuilder();
    //your real URL would be abc.com, but in the app you have myURL = 123.3*15*13
    //With what I'm saying the * would precede a 2 digit number that represents 1 letter
     for (int i = 0; i < stringLength; i++){
         String letter = myURL.charAt(i);
        if (letter.equals("1"){
            letter = a;
            sb.append(letter);
        } // you would go one to code each character into a letter
     }

}

Конечно, было бы еще несколько инструкций if, но это позволило бы вам запутать ваш url, не изменяя никаких изменений на стороне сервера. И если вы используете Proguard, то весь этот метод, который вы создаете, совершенно не имеет смысла для тех, кто пытается перепроектировать.

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

В основном вы будете шифровать URL-адрес очень запутанным образом.

Вот ответ, который может быть лучшим методом шифрования или, по крайней мере, дать дополнительное шифрование:

Java - шифрование/дешифрование имени пользователя и пароля из файла конфигурации