Android-клиент, Http-сервер. Как узнать, что клиент отправляет данные с помощью моего приложения?аутентификация - PullRequest
2 голосов
/ 07 декабря 2011

У меня все данные, передаваемые клиент / сервер, работают правильно.Текст, изображения и т. Д. Мои пользователи создают сообщения блогового типа на своих устройствах Android и загружают их на мой сервер. Все это выполняется с помощью HTTP Multipart и потоков ввода / вывода.Моя проблема - Как я узнаю, что клиент на самом деле является моим приложением, а не каким-либо скриптовым / другим хакерским приложением?

Я хочу избежать сценариев злоупотреблений.

  1. Злонамеренный пользователь A создает сценарий ПК, который отправляет соответствующие данные формы на мой сервер и может спамить сервер, создавая тысячи вредоносных сообщений.
  2. Злонамеренный пользователь B создает простое приложение для Android, которое отправляет соответствующие данные формы на мой сервер, и он может спамить сервер.
  3. Злонамеренный пользователь C подписывается на мой сервис, имеет действительную учетную запись и пароль и спамит сервер, используя сценарий ПК или приложение для Android.

Одна из идей, которые у меня есть, состоит в том, чтобы заставить сервер периодичности ожидания часто отправлять сообщения, чтобы предотвратить спам.

Но помимо этого, как я могу проверить, что человек, отправляющий данные на мойсервер

  • Android-устройство и
  • Запускает мое приложение для отправки данных формы, а не другое.

Я хочу избежать SSL, поскольку я не хочу регистрироваться в Verisign, TRUST и пройти через все это ..

Ответы [ 3 ]

2 голосов
/ 07 декабря 2011

Если это только ваш клиент и ваш сервер, вы можете (и должны) использовать SSL, ничего не покупая.Вы управляете сервером и клиентом, поэтому каждый должен доверять только одному сертификату, принадлежащему другому, и вам для этого не нужны ЦС.

Вот высокоуровневый подход.Создайте самозаверяющий SSL-сертификат сервера и разверните его на своем веб-сервере.Для этой цели вы можете использовать keytool, включенный в Android SDK.Затем создайте самозаверяющий клиент и разверните его в своем приложении в пользовательском хранилище ключей, включенном в ваше приложение, в качестве ресурса (keytool также сгенерирует это).Настройте сервер так, чтобы он требовал SSL-аутентификацию на стороне клиента и принимал только сгенерированный вами сертификат клиента.Настройте клиент для использования этого сертификата на стороне клиента, чтобы идентифицировать себя и принять только один сертификат на стороне сервера, который вы установили на своем сервере для этой его части.

Шаг за шагом это оченьболее длинный ответ, чем здесь гарантировано.Я бы предложил сделать это поэтапно, так как в Интернете есть ресурсы о том, как работать с самоподписанным сертификатом SSL в Android, как на стороне сервера, так и на стороне клиента.В моей книге Безопасность приложений для платформы Android , опубликованной О'Рейли, есть полный обзор.

1 голос
/ 18 декабря 2011

Наконец-то все заработало, серверная и клиентская двусторонняя аутентификация ssl.

Я использовал приведенные здесь инструкции для настройки своего собственного центра сертификации (ca) http://www.garex.net/apache/

Я следовал там командам, чтобы сгенерировать свои собственные файлы ca, server и client ..

Большая "GOTCHA" заключалась в том, что в разделе "создание сертификата клиента" ссылка garex.net использует клиентский ключ размером 1024.Как оказалось, это вызывало исключение java.io.IOException: неправильная версия хранилища ключей

Чтобы обойти вышеупомянутое исключение, мне пришлось использовать только ключи 512 размера. Это делается НЕ включаяпараметр "1024" для команды openssl genrsa genkey ..

Наконец, я хочу добавить ссылку на инструмент, который я использовал в итоге вместо Portecle .. Я нашел здесь, что программа keytool gui очень полезна и прощеиспользовать, чем portecle one - http://www.lazgosoftware.com/kse/index.html

Эта проблема была немного болезненной, поэтому я буду следить за этой веткой .. Не стесняйтесь отвечать, если вы столкнетесь с какими-либо контрольно-пропускными пунктами ..

0 голосов
/ 07 декабря 2011

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

  1. Перед отправкой сообщения, запросите у сервера капчу.
  2. Сервер связывает случайное изображение капчи с уникальным ключоми отправляет приложению и код и код.
  3. Показывает пользователю изображение капчи.
  4. Отправляет сообщение, буквы, введенные пользователем, и уникальный ключ в запросе http..
  5. Сервер проверяет буквы капчи на основе уникального ключа.
  6. Если проверка капчи прошла успешно, вы добавляете сообщение, в противном случае - нет.

Это должнорешить все сценарии.

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