2009-09-09 3 views
7

Я разрабатываю приложение, которое подключается к API на основе XML. У меня есть контроль над сервером и приложением - есть ли способ убедиться, что только мое приложение может получить доступ к API?Безопасная связь между iPhone и сервером?

Нет аутентификации пользователя.

EDIT:

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

Как об этом:

запросить сеанс с UDID устройства, и я получаю ключ квитирования.

<handshake>23354</handshake> 

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

Скажем теперь, когда я добавить 1 к ключ квитирования

password = 23354 

Во всех вызовах API я передаю этот пароль вместе с UDID. Это позволит серверу ограничить каждый сеанс определенным количеством вызовов, нет?

Что вы думаете?

ответ

2

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

Создайте номер и включите его в приложение и на сервер. Используйте это как семя для srand() как на клиенте, так и на сервере.

Есть запрос от клиента включают в себя что-то вроде:

<handshake id="123">12312931</handshake> 

там идентификатор означает, что 123'rd генерируется случайное число и 12312931 это значение после вызова RAND() 123 раз. Значение 123 должно быть произвольно сгенерированным числом (сгенерированным с другим семенем!).

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

Обратите внимание, что это тоже не очень безопасно: все, что вам нужно сделать, - это заставить своего клиента бросить вызов своему собственному серверу, а затем генерировать (в этом примере) 123-й случайный номер для каждого значения семени до тех пор, пока он его не найдет. Поэтому я не буду использовать это, ожидая, что он обеспечит проверку подлинности на криптографическом уровне или контроль доступа. Он просто обеспечивает простой нетривиальный ответ, который эффективен и прост в реализации.

+0

Я не верю, что есть обещание, что последовательность, возвращаемая rand(), будет одинаковой с платформы на платформу. По-видимому, POSIX не определяет фактический алгоритм, а минимальные требования. Я предполагаю, что в приведенном выше примере сервер выбирает «123». Если клиент его выбирает, то это не обеспечивает никакой безопасности (даже не тривиальной безопасности). Если сервер отправляет идентификатор, есть более быстрые перерывы, чем вычисление всех значений для 64k семян. Наиболее очевидным является MiM сеанс. Я также могу найти семя намного быстрее, бросив вызов клиенту с id = 1, затем id = 2 для нескольких столкновений. –

0

Доступ к вашему веб-сервису через https с помощью аутентификации.

+0

Да, но как? Попытка понять это на iPhone. Какие классы вы используете для этого? – Spanky

3

Нет, действительно невозможно гарантировать, что только ваше приложение может связаться с вашим сервером. Существуют методы обфускации для поднятия бара на атакующих, и они будут работать для большинства атакующих. Ваша основная проблема не разрешается для выделенного злоумышленника. Вы можете найти список других сообщений на эту тему в iPhone: How to encrypt a string. Есть несколько методов, которые вы можете использовать в этих сообщениях, и некоторое обсуждение того, как и следует ли вам атаковать основные проблемы.

1

Вы можете использовать какую-то подпись, чтобы убедиться, что на самом деле ваше приложение совершает звонок, вы подсчитываете подпись как на стороне сервера, так и на стороне приложения, только если они совпадают, будет возвращена услуга с ответом на запрос , Обычно подписи состоят из некоторого количества параметров вашей функции, за которым следует секретный ключ, затем берут хеш md5 и протаскивают его. В r equest никто не сможет найти секретный ключ, потому что он находится в хеше md5.

+0

К сожалению, секретный ключ затем должен быть закодирован в вашей программе, который вы должны предоставить пользователям. Злоумышленник переработает секретный ключ из исполняемого файла (или вне памяти в отладчике), а затем будет использовать его для подключения к серверу. Или он изменит вашу программу, чтобы делать все, что пожелает, и пусть ваша программа справится с секретным рукопожатием для него. Это форма обфускации, но она не решит проблему, если у вас есть какой-либо выделенный атакующий. –

-2

Я думаю, что реальный вопрос, который вам нужно задать, - это то, насколько ваши данные подвержены риску нападения. Я бы сказал, что в 99% случаев вы будете в порядке с просто запутанным URL, который будет трудно догадаться, так как вероятность того, что средний пользователь пытается что-то сделать с ним за пределами вашего приложения, будет небольшим. Если вы беспокоитесь о том, что конкуренты воруют у вас, я предлагаю нечто более гнусное:

В вашем приложении настройте его так, чтобы ваше приложение и сервер меняли URL-адреса так часто, может быть, каждые две недели. Затем, если кто-то попытается получить доступ к вашему XML API, они будут бороться с постоянной битвой за выяснение ваших URL-адресов. И как глазурь на торте, сохраните старые URL-адреса активными, но им возвратите плохие данные. Я думаю, вы можете позволить своему воображению бежать и выяснить остальное отсюда.

+0

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

+0

Это не полезный ответ, так как он не отвечает на их вопрос вообще. Кроме того, вы не предоставляете никакого реального механизма для выполнения того, что вы предлагаете. – Ryan

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