il : |
21.3.19 01:00 |
Выложу сюда свои мысли по тому, как бы я защищал игру наподобие варкрафта от мапхака, если бы я был ее разработчиком: Не секрет, что владелец компьютера может залезть в память любого процесса на своем компьютере и подсмотреть любые данные. В том числе, данные обо всем, что "знает" его компьютер о других игроках.
Можно пытаться затруднить эти действия хитроумными способами, но это игра на чужом поле, которая в общем случае обречена на провал. Единственный способ по-настоящему не дать хакеру подсмотреть, что делает противник - не передавать на компьютер игрока тех данных, которых он на данный момент не имеет права знать.
Как это сделать: 1. Gолучается, самый простой вариант защиты от мапхака - толстый клиент. Когда все игровые процессы выполняются на сервере, а на клиентах только картинка рисуется. 2. А самый правильный вариант если самим делать игру - получается с сервером-посредником: каждый клиент передает данные о том что он делает не другим клиентам, а серверу. А сервер уже выдает клиентам только те данные о других клиентах, которые они в данный могут видеть. Фактически как вариант 1, только тонкий клиент.
А если делать обмен данными с защитой от мапхака без посредников то схема придумалась, но получается большой объем данных: Но теоретическое решение существует. Упрощенная задача к которой сводится наша: допустим, у нас игровое поле размером N клеток, мы хотим узнать у противника, что находится на k-й клетке. Т.е. мы ее разведываем. Надо чтобы противник: 1. не узнал что мы разведываем именно k-ю клетку. Иначе понятно что мы именно там находимся, 2. хотя бы в конце игры он узнал что k-ю клетку мы разведывали по праву. Т.е. что мы действительно там были или что-то туда кастанули, а не обманули его, чтобы он нам нам показал ту клетку, которую мы просмотреть не могли. Мысль такая: - генерируем пары ключей - N пар, по одной паре на каждую из клеток поля. - По массиву закрытых ключей строим хеш и отправляем его противнику. В конце игры мы отправим ему этот массив закрытых ключей чтобы он с помощью этого хеша проверил что мы не жульничали а именно эти ключи использовали. - чтобы узнать содержимое k-й клетки, отправляем ему открытый ключ для k-й клетки, но для какой именно клетки не говорим. Он этим ключом шифрует все N клеток и весь массив отправляет нам. Мы можем расшифровать только содержимое k-й клетки, поскольку наш закрытый ключ подходит только к ней. Остальные данные для нас - мусор.
Таким образом противнику приходится вместо одной клетки передавать нам все. В конце игры мы передадим противнику массив закрытых ключей, он проверит их по хешу, убедится что они подлинные и потом убедится что этот открытый ключ подходил действительно только к k-й клетке. Таким образом, имеем гарантию что все честно.
Другой вариант: мы хотим узнать содержимое не одной, а сразу многих клеток: Мы можем отправить сразу массив длины N открытых ключей от тех клеток которые узнать надо и мусор от тех клеток которые узнавать не надо. Массив в том же порядке, как и расположены клетки. Противник шифрует каждым ключом свою клетку и отправляет нам. Те к которым у нас есть ключи - мы расшифровываем, остальные игнорируем как мусор. Таким образом, за 1 шаг имеем передачу N значений в одну сторону и N в другую. В конце игры отдаем противнику изначальные закрытые ключи чтобы он убедился что мы узнали у него именно те клетки которые действительно имели право узнать. Как-то примерно так.
Конечно, этот вариант гораздо хуже и затратнее по трафику, чем способ используемый в вар2: там передаются только изменения. Т.е, фактически, только действия игроков в данный момент. В моем же алгоритме приходится передавать просто огромный объем данных: например для карты 256x256 приходится передавать 65536 зашифрованных пакетов, и это - на каждом цикле синхронизации! Не говоря уж про то, что для этого приходится производить 65536 операций шифрования. И как это оптимизировать. я не знаю. Но теоретически, такой вариант есть. А вы что думаете по этому поводу?
[ Редактировано il в 21.3.19 00:06 ] | |
|