Я также опубликовал сообщение на sci.crypt и постараюсь обобщить предложенные изменения (насколько я понимаю) ниже, на случай, если они могут быть интересны.
Шаг 1: Клиент отправляет HTTPS-запрос серверу входа в систему с учетными данными
. Предполагая, что учетные данные принимают форму токена для входа, также добавьте самозваный уникальный идентификатор.
Шаг 3: Информация о пользователе + сеанс RC4 + метка времени + дайджест
Используйте алгоритм шифрования, который обеспечивает целостность, вместо использования дайджеста в явном виде.Например, AES-GCM или AES-CCM.Добавьте дополнительное поле id на шаге 1. Добавьте ip на игровой сервер.
Шаг 4: Упакованные данные + ключ шифрования сеанса RC4 + IP-адрес на игровой сервер отправляются какответить.
Предоставление клиенту метки времени позволит клиенту узнать, когда сеанс истек.Это позволяет избежать ненужных подключений к игровому серверу с просроченными учетными данными.
Шаг 5. Клиент открывает подключение к игровому серверу, отправляет исходное незашифрованное приветственное сообщение с зашифрованной информацией пользователя в качестве полезной нагрузки.
Добавьте самозваный идентификатор на шаге 1 в незашифрованном виде в полезную нагрузку.
Шаг 6: Игровой сервер распаковывает данные, упакованные в (3).Теперь он знает пользователя и ключ шифрования RC4, который должен использовать.
Игровой сервер сопоставляет как свой собственный ip с зашифрованным ip, так и зашифрованный id с идентификатором, заданнымклиент.Первое предотвращает переход пользователя на другой сервер с такими же учетными данными.
Шаг 8: Если все в порядке, сервер отправляет незашифрованный LOGIN_OK, и начинается зашифрованная связь RC4.
В этот момент игровой сервер не может быть уверен вличность клиента.Используйте ключ сеанса и зашифруйте одноразовый номер + строго увеличивающийся идентификатор сеанса + состояние успешного входа в систему с помощью AES-GCM / CCM и отправьте его клиенту.
Клиент расшифровывает и проверяет состояние успешного входа в систему.Если это так, то клиент знает, что игровой сервер знает ключ сеанса (GCM / CCM проверяет, что пакет не был подделан).Клиент возвращает sid + nonce.
Сервер проверяет, что sid + nonce совпадает с отправленными значениями.
Наконец, клиент и сервер создают новые ключи сеанса, хешируя ключ сеанса с помощьюsid + nonce + salt для создания ключа для последующей связи, чтобы предотвратить возможную атаку воспроизведения.
Относительно RC4
В RC4 есть уязвимости, но, вероятно,было бы достаточно для этой схемы из-за довольно агрессивной перепланировки ключей.Однако существуют современные шифры, которые более безопасны и быстрее, такие как Snow 2.0 или Trivium.