2

Я строю клиентскую/серверную iPhone-игру, где я хотел бы, чтобы сторонние клиенты могли обращаться к серверу. Это происходит по двум причинам: во-первых, моя модель дохода заключается в том, чтобы продать клиента и отдать услугу, а во-вторых, я хочу избежать распространения клиентов, которые облегчают обман.Ограничение доступа к серверу для iPhone app

Я пишу первую версию сервера в рельсах, но в какой-то момент я планирую перейти к erlang.

Я рассматриваю два подхода:

  1. Генерировать «имя пользователя» (скажем, GUID) и хэш его (SHA256 или MD5) с секретом поставляется с приложением, и использовать результат как пароль". Когда клиент подключается к серверу, оба отправляются через HTTP Basic Auth over https. Сервер хэширует имя пользователя с тем же секретом и гарантирует, что они совпадают.

  2. Отправка сертификата клиента с помощью приложения для iPhone. Сервер настроен так, чтобы требовать наличия сертификата клиента.

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

Второй подход хорошо протестирован и проверен, но может быть выше накладных расходов. Тем не менее, мои знания о клиентских сертификатах находятся на «прочитайте об этом на уровне журнала Delta Airlines в полете». Сколько пропускной способности и накладных расходов на обработку данных будет иметь место? Фактические данные, передаваемые по запросу, составляют порядка килобайта.

ответ

0

Попросите пользователей вашей игры пройти аутентификацию со своей учетной записью через OAuth, чтобы разрешить им изменять состояние игры на вашем сервере.

Если вы не можете выполнить аутентификацию пользователей, вам необходимо аутентифицировать экземпляр вашего игрового приложения. Наличие учетных данных для проверки подлинности, встроенных в двоичный файл, будет плохой идеей, поскольку пиратство приложений распространено и сделает ваш метод крайне неуверенным. Мой вопрос SO how to limit Apple iPhone application piracy может пригодиться вам другими способами.

+0

Я пытаюсь устранить концепцию «учетной записи» до пользователь обеспокоен. Они будут получать доступ к игре только через мое приложение, поэтому я не хочу обременять их выбором имени пользователя, которое, вероятно, уже принято, и пароль, вероятно, слабый. –

+0

Эта ссылка выигрывает у вас «ответ». –

2

Кто против вас здесь? Оба метода не позволяют предотвратить взломанные копии приложения от подключения к серверу. Я думаю, что это самая распространенная проблема с разработкой iPhone (или общей) для платных приложений.

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

+0

Хороший вопрос: см. Измененный вопрос. В любом случае треснувшие копии всегда будут проблемой - надеюсь, что обслуживание будет достаточно дешевым, чтобы обслуживать кучу людей, которые не купили приложение, в любом случае не повлияет на мою прибыль. –

+0

Спасибо, я думаю, что у меня есть мое мышление, переориентированное немного ближе к реальности :). –

3

Никакой путь не является совершенным - но задача/ответ лучше, чем ключ.

Сертификат ДОЛЖЕН использовать вызов/ответ. Вы отправляете случайную строку, она шифрует ее с помощью закрытого ключа сертификата, затем вы возвращаете ее и расшифровываете ее с помощью открытого ключа.

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

Хорошая дорога, используемая мной, является xor. Это немного более безопасно, чем пароль, тривиальный для реализации и требует не менее часа или двух посвящений для взлома.

  1. Ваше приложение имеет номер, встроенный (ключ).
  2. Когда приложение подключается к вам, вы генерируете случайное число (с таким же количеством бит как ключ) и отправляете его на телефон
  3. Приложение получает номер, xor его с ключом и отправляет результат назад.
  4. На сервере вы получите возвращенный результат с ключом, который должен привести к исходному случайному числу.

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

В любом случае, xor - это взлом, но он работает в случаях, когда отправка пароля - это немного для взлома.

Разница между xor и открытым ключом заключается в том, что xor EASILY обратима, просто контролируя успешную беседу, открытый ключ (теоретически) не обратим без значительных ресурсов и времени.

+1

Вопрос и комментарий: не будет ли SHA256 или MD5 конкатенации токена и секрет лучше XOR, не будучи сложнее реализовать? Кроме того, я хотел бы использовать систему контроля доступа, которая уже запекается в HTTP (-ах), так что мне не нужно делать никаких дополнительных раундов (например, GET токен, а затем сделать второй GET, чтобы захватить игровое состояние). –

+0

Было бы лучше, но я не уверен, как это становится проще, чем sendToServer (encryptedValue^key); Думаю, причина, по которой я использую xor, состоит в том, что мне не нужно иметь библиотеку - это просто в моем мозгу, но это не «хорошо» :) –

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