Задача зашифровать трафик игры чтобы предотвратить перехват и подмену пакетов, перехват игровых сессий. Пришел вот к чему, что скажите? это надёжно?
1. Регистрация клиента
Пароль от клиента хэшируется SHA256 и отправляется по открытому каналу серверу (хэш светится 1 раз при регистрации!)
2. Взаимодействие с зарегистрированным клиентом
Клиент хочет войти в игру, отправляет намерение серверу. Сервер присылает клиенту случайное число по открытому каналу. Клиент шифрует свой пароль используя SHA256 и случайное число от сервера (RN):
CPASSWORD = SHA(RN + SHA(PASSWORD))
отправляет серверу, сервер сравнивает свой сгенерированный хэш на основе хэша пароля и известного случайного числа RN с пришедшим от клиента:
Итого: ключ шифрования светится только в момент регистрации, что не абсолютно надёжно, но и не сильно страшно? можно использовать протокол Диффи — Хеллмана для обмена ключами, но возникает другая проблема, алгоритм уязвим для модификации данных в канале связи, в том числе для атаки «Человек посередине». Если выбирать из двух зол, первое представляется более простым и надёжным, или нет?
Схема работоспособна (кроме совсем параноидальных случаев, что пишется ВЕСЬ трафик клиента, тогда хеш пароля врагам известен), но чем не устраивает стандартные SSL/TLS шифрование?
Smithson: для онлайн игры, где частота отправки пакетов 50 раз в секунду, использовать SSL/TLS будет затратно и медленно (слова разработчика из Epic Games), плюс не хочется тянуть зависимости в проект, принцип минимальной необходимости, если можно обойтись простым решением, то лучше обойтись простым решением.