Безопасный протокол аутентификации между клиентом и сервером
Привет,
Я разрабатываю игровой сервер с клиентом WinForms для тестирования. Я создал пакетную систему, в которой, например, для имитации игрока, отправляющего сообщение чата в игре, клиент создает PacketPlayerChat(строковое сообщение), сериализует его и отправляет на сервер. Затем сервер использует данные заголовка в пакете, чтобы восстановить правильный тип пакета и заполнить его значения.
Когда клиент подключается к серверу, имитируя игрока, присоединяющегося к серверу в игре, он должен пройти аутентификацию. Я думаю сделать это следующим образом:
• Клиент подключается к игровому серверу
• Игровой сервер отправляет PacketServerRequestAuth()
• Клиент отправляет PacketPlayerAuth(строковое имя пользователя, строковый пароль)
• Затем игровой сервер проверяет это с помощью сервера аутентификации
• Игровой сервер отправляет PacketServerAuthResult(результат AuthResult) в зависимости от результата входа в систему
• Если вход в систему не удался, игровой сервер закрывает клиентское соединение
Конечно, имя пользователя и пароль будут зашифрованы.
Если это безопасный метод? Я знаю, что модифицированный сервер позволит пользователю захватить зашифрованные имена пользователей и пароль, но они бесполезны для них.
Проблема заключается в том, что владелец модифицированного сервера может захватить зашифрованное имя пользователя и пароль и запросить аутентификацию с сервера аутентификации в любой момент времени, заставив сервер аутентификации думать, что игрок вошел в систему (может вызвать хаос со статистикой входа).
Я думаю, что лучше всего включить какой-то одноразовый токен; если это хорошая идея, то как лучше всего ее реализовать?
У меня была одна идея::
• Клиент запрашивает токен с сервера аутентификации
• Клиент отправляет регистрационные данные вместе с токеном на игровой сервер
• Игровой сервер аутентифицирует пользователя с помощью auth server, что возможно только в том случае, если токен действителен и является одноразовым.
• Сервер аутентификации игнорирует запросы аутентификации, если токен недействителен.
Что я уже пробовал:
Размышляющий. О многих вещах.
George Swan
Рассматривали ли вы возможность реализации Scram-SHA-1 в качестве метода аутентификации? Есть хорошая статья на сайте https://www.mongodb.com/blog/post/improved-password-based-authentication-mongodb-30-scram-explained-part-1