2013-07-03 2 views
1

У меня есть клиентское серверное приложение C++, которое обменивается данными через сеть (с поддержкой asio), и я планирую распространить это клиентское приложение на своих клиентов. Моя проблема заключается в том, что я не знаю, как предотвратить запрос на соединение из других приложений, вот как я могу убедиться, что только мое клиентское приложение может подключиться к моему серверу. Я думаю, что нет никакого способа сделать это, не установив соединение, чем лучший способ проверить, что запрос поступает от моего клиента?аутентификация клиента asio

+0

У меня была та же проблема; моим решением было использование SSH-туннеля. Вы должны заранее открыть туннель, но вы напрямую полагаетесь на существующий механизм для решения этой проблемы. – piwi

ответ

0

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

  1. клиент подключается к серверу Сервер отправляет специфичного значение (целые, строки или любой другой) для нового клиента.
  2. Клиент обрабатывает это значение, вычисляет новый с ним и отправляет новое значение для сервера.
  3. Сервер проверяет правильность возвращаемого значения.

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

+0

Это уязвимо для повторной атаки. – PSIAlt

+0

Это не так. Повторная атака не является проблемой, если вы правильно выполняете рукопожатие ... – nouney

5

Вы можете использовать asio встроенный SSL способность. Таким образом, вы создаете сертификаты для каждого сервера и сертификаты клиентов. Таким образом, вы можете проверить сертификат клиента на сервере в момент установления связи SSL. В качестве бонуса ваш трафик будет зашифрован и защищен SSL. Клиенты могут проверить, что сервер не подделка; сервер может проверить, что клиенты авторизованы.

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