А сегодня мы будем шифровать весь трафик. А зачем? А чтобы усложнить жизнь читерам.
Если у вас мультиплеер на авторитарном сервере, естественно все действия должны контролироваться на нем. Но зная, какие команды отправлять, можно легко написать бота, который автоматизирует некоторые процессы, нарушая баланс и игру «правильных» игроков. Конечно, если сильно захотеть, можно сломать все что угодно, но усложнить жизнь взломщикам и читерам тоже можно. Будем использовать SSL.
Ничего изобретать не буду, потому что «все уже придумано до нас» :)
Для теста серверной части (на node.js) и генерации ключей используем эти скрипты. Единственное, чего там нет — это как из сертификата и ключа сделать PFX файл:
openssl pkcs12 -export -in client.crt -inkey client.key -out mycert.pfx
Этот файл понадобится для клиента. Для проверки SSL соединения берем пример с сокетами с MSDN и немного переделываем его. Получаем поток и прокидываем его через SSL.
IEnumerator UseSSL () {
NetworkStream stream = new NetworkStream (socket);
SslStream sslStream = new SslStream (stream, false, new RemoteCertificateValidationCallback (CertificateValidationCallback), new LocalCertificateSelectionCallback (CertificateSelectionCallback));
bool authenticationPassed = true;
#if UNITY_EDITOR
X509Certificate2 cert = new X509Certificate2(certPath, certPassword);
#elif UNITY_ANDROID || UNITY_IOS
WWW reader = new WWW (certPath);
while (!reader.isDone)
yield return null;
X509Certificate2 cert = new X509Certificate2 (reader.bytes, certPassword);
#endif
X509Certificate2Collection certs = new X509Certificate2Collection();
certs.Add (cert);
sslStream.AuthenticateAsClient (server, certs, SslProtocols.Tls, true);
authenticationPassed = sslStream.IsAuthenticated;
if (authenticationPassed) {
///
}
yield break;
}
Вот и весь квест. Теперь трафик между игровым сервером и клиентом зашифрован.
Ccылка на Github