Мои первые мысли о завершении уровней - просто записать информацию в файл после завершения уровня и загрузить ее, как только приложение снова откроется. Но как я могу уберечь это от вмешательства и предотвратить мошенничество?
Мои первые мысли о завершении уровней - просто записать информацию в файл после завершения уровня и загрузить ее, как только приложение снова откроется. Но как я могу уберечь это от вмешательства и предотвратить мошенничество?
Ответы:
Хранение информации о завершении в локальном файле - это простой и совершенно приемлемый способ сделать это. По сути, именно это будет делать каждая игра для отслеживания прогресса (в некотором роде, хотя конкретные форматы, используемые для данных и механизма хранения, будут различаться).
Защита файла от несанкционированного доступа более сложна. Если нет веской причины (нет преимущества, которое может получить игрок, нет наград и т. Д.), Вы обычно можете избежать неприятностей.
Но если вам все равно, и вы, и если вы можете разумно ожидать, что ваша платформа закрыта (например, консоли и устройства без джейлбрейка на iOS), вам также не нужно слишком беспокоиться. Пользователь, как правило, физически не может получить доступ к файлу, чтобы вмешаться в него (при условии, что вы используете соответствующие API-интерфейсы ОС для хранения данных в «частных» и общедоступных местах (например, сохранение этого файла на iCloud Drive пользователя на iOS это, вероятно, не очень хорошая идея).
Если вы абсолютно обеспокоены тем, что вмешательство не должно произойти (например, когда есть преимущество, которое может получить игрок, у которого пройдено больше уровней), вам необходимо хранить данные на стороне сервера. Все, что хранится на стороне клиента, в конечном итоге может быть скомпрометировано и ему нельзя доверять: это машина пользователя, в руках пользователя. Динамика управления просто не в вашу пользу.
Конечно, нет ничего невозможного в том, чтобы взломать файлы, хранящиеся на стороне сервера, но гораздо сложнее, если у вас есть разумная система учета.
Preference
конкретный класс LibGDX
помочь мне. Я мог бы хранить простые булевы значения для уровней и, возможно, даже с одной высокой оценкой.
{"finalLevelCompleted":true}
. Выполнено.
Вы можете создать файл воспроизведения в качестве доказательства работы, пока проигрыватель играет. Запустите игру, сохраните начальные условия, включая название уровня и псевдослучайное начальное число, запишите точные временные состояния ввода (движения мыши, нажатия клавиш или кнопок и т. Д.), Которые входной слой вашей игры передает на логический уровень, и остановите запись, как только цель достигнута. Вы можете сжать входной журнал с помощью кодирования длины серии (RLE), чтобы только изменения состояний кнопок (нажатий, отпусканий и т. П.) Вызывали события журнала. Исходные условия и входной журнал позволяют проверить выполнение задачи, воспроизведя входные данные в физику игры и ИИ.
В журналах, подобных этому, есть несколько приложений, знакомых игрокам видеоигр.особенно эмулируемые игры. Игроки могут пересматривать игру локально из бревна, чтобы искать недостатки стратегии или хвастаться местным друзьям. Режим привлечения вашей игры может состоять из логов для выбранных уровней. Сетевая игра в играх, использующих движок GGPO, структурирована аналогично, с задержкой в несколько кадров между входом и игровым движком, чтобы дать время для входа другого игрока через Интернет. И вы можете потребовать, чтобы участники списка лидеров загрузили журнал, и тогда ваш сервер запустит его в ускоренном режиме на урезанной копии игры без графического движка. Чтобы предотвратить повторную атаку, когда один игрок загружает журнал другого, информация, используемая для заполнения генератора псевдослучайных чисел в игре, может включать в себя идентификатор пользователя в таблице лидеров игрока. Таким образом, сервер может сравнить их,
Некоторые чрезвычайно преданные игроки будут вручную создавать входной журнал, который представляет собой доказательство работы. Это называется «скоростная работа с помощью инструмента». Если вы не хотите, чтобы TAS входил в ваши публичные списки лидеров, вы можете требовать, чтобы игры на самых высоких уровнях соревнований проводились при подключении к Интернету. Сервер будет отправлять значение ключа каждые несколько секунд, а клиент будет отправлять входной журнал в режиме реального времени, как если бы он был в сетевой игре, зашифрованный этим ключом. Этот ключ меняется каждые несколько секунд, и в играх, использующих какой-то случайный элемент, он может повторно заполнять генератор псевдослучайных чисел. Если длительная задержка между отправкой ключа и получением соответствующих входных пакетов превышает несколько секунд, мы можем предположить, что пользователь пытается что-то «смешное».
Если вы хотите сделать это полностью на стороне клиента и не считаете, что личное хранилище, предоставляемое вашей платформой, является достаточно безопасным (например, если для прохождения уровней требуются реальные деньги), то вам нужно доказательство работы. Ваш файл сохранения должен содержать информацию, разработанную таким образом, чтобы создание информации было трудно рассчитать, если вы не прошли соответствующий уровень, но его легко проверить третьей стороной, которая не обязательно прошла этот конкретный уровень (предпочтительно без необходимости знать само решение). Чем больше разница в сложности расчета доказательства работы до и после прохождения уровня, тем более надежным является доказательство работы.
К сожалению, это доказательство работы должно быть таким, чтобы оно было привязано к игровому процессу, поэтому нет никакого общего способа, которым это можно сделать для произвольных игр, и ваш исполняемый файл игры не должен каким-либо образом содержать решение игры, иначе Достаточно легко извлечь доказательства работы из исполняемого файла. В большинстве случаев вам почти всегда придется специально разрабатывать свой игровой процесс в соответствии с этим конкретным требованием, чтобы доказательство работы было надежным, поэтому вы также потеряете некоторую свободу творчества.
Например, например, в игре «Судоку», доказательством работы может быть заполненная доска Судоку (обратите внимание, что доска должна быть создана доверенной третьей стороной, поскольку большинство алгоритмов создания доски Судоку должны предварительно рассчитать решение, что ослабляет доказательство работать, если это сделано на клиенте). Или игра факторизации большого составного числа, доказательство работы - главные факторы (я бы назвал такую игру RSA vs NSA).
Чтобы быть по-настоящему безопасным, ваша игра должна содержать несколько случайных элементов, потому что, если ваша игра полностью детерминирована, можно обмануть, скопировав доказательство работы от кого-то еще, кто завершил уровень (это атака повторного воспроизведения).
Цель доказательства работы - сделать обман как минимум таким же сложным, как создание бота для игры. Таким образом, чтобы обмануть игру судоку, вам понадобится решатель судоку и т. Д.
Это очень сложно. Если это игра для одного игрока, лучше сохранить свободу творчества и не беспокоиться об обмане. Это их игра, они ее купили, и если они обманывают, это не повлияет на вашу прибыль. Или превратите его в серверную игру и выполните всю свою важную игровую логику на сервере.
Если вы предпочитаете использовать внешний файл для хранения сохраняемой информации, и он находится в месте, которое может быть взломано пользователями, вы можете прочитать о том, как работает шифрование, и использовать его, чтобы никто не смог внести значимые изменения в файл. Что-то вроде шифра Фейстеля должно быть хорошей отправной точкой и будет достаточным, чтобы помешать кому-то без большого количества времени и ноу-хау изменить файл сохранения. http://en.wikipedia.org/wiki/Feistel_cipher
Помимо этого, Джош ударил по гвоздю по голове, когда речь заходит о клиентских и серверных хранилищах.
Если кто-то сможет выбрать двоичный файл и выяснить алгоритм - вы никогда не сможете этого предотвратить, так что не беспокойтесь.
Для остановки просто используйте криптографический хеш!
Предположим, у вас есть это:
function computeHash(levels) {
code = "";
for(level in levels) {
code = hash(code+level+level.isComplete()+"MAGICSALT")
}
}
Это действительно просто, но это означает, что вам нужно написать код в конце файла, затем проанализировать этот файл, как обычно, и выполнить computeHash(levelListReadFromFile);
Если этот хэш = код, прочитанный в файле, то это ОЧЕНЬ ВЕРОЯТНО "законно". Под этим я подразумеваю ... кто-то с шестнадцатеричным редактором не взломает его, это займет кого-то, кто знает их вещи.
Кстати, всегда отдавайте предпочтение локальному хранилищу - если, конечно, это не MMO, люди не хотят, чтобы вы использовали их данные, ходили в поездах и делали всякие вещи. Я ненавижу программы, которые требуют доступа в интернет без уважительной причины.