2012-04-12 1 views
3

Примечание: Это относится к Android специально, но лучший ответ может быть не специфичным для платформы, поэтому другие теги.Как я могу заставить игроков взломать данные уровня игры?

Рассмотрите игру, похожую на сердитых птиц: у вас есть куча уровней. Каждый раз, когда вы заканчиваете уровень, следующий уровень доступен для игры, но не раньше. Как я могу заставить игроков взломать мои игровые файлы и разблокировать уровни, которые не должны быть доступны? Предположим, что данные прогрессии хранятся локально.

Мои мысли:

на андроид, все файлы приложения хранятся в папке, которую пользователь может только доступ, если они имеют корневой доступ (по умолчанию, они никогда не делают, но это, как правило, очень легко получить до тех пор, пока вы google немного). Сейчас я использую SQLite базу данных, которая выглядит примерно так:

LevelId = pk | UnlockStatus = int, 0 = locked, 1 = unlocked, 2 = completed with 1 star, ... 

Это хорошо до тех пор, пока пользователь не имеет корня или вообще не знакомы с тем, где файлы приложения хранятся. Однако, если у них есть root, этот файл очень легко редактировать.

Насколько я могу судить, сердитые птицы хранят данные своего уровня в файле .lua, по крайней мере, согласно его названию. Я не могу найти текстовый файл или файл db, содержащий информацию об уровне. Открытие этого .lua в текстовом редакторе не отображает ничего, кроме тарабарщины. Я не пробовал hex-редактор.

Использование таблицы sql очень удобно. Есть ли простой способ сохранить данные о прогрессии в таблице sql, так что пользователю будет сложнее понять это? В идеале, это также не должно быть слишком трудоемким для реализации. Будучи автономной игрой, мне все равно, если игрок взломает ее или нет, поэтому я ищу лучшее качество - компромисс времени реализации. Тем не менее, теоретические ответы, которые дают намного больше времени реализации для получения более высокого качества.

+0

как насчет шифрования данных, а затем их хранения ... не пробовал себя .. Я думаю, что это возможно ... – ngesh

+4

Как вы уже упоминали: если игрок хочет погубить его для себя, зачем идти в проблемы с попыткой остановить их? – shambulator

+0

Это уже довольно сложно сделать, и определенно вне досягаемости для большинства ваших игроков. Зачем беспокоиться о том, чтобы сделать это сложнее? –

ответ

4

Лучше всего сохранить данные с помощью своего рода шифрования. В android SQLite не предлагает шифрование на уровне базы данных. Однако вы можете зашифровать значения (записи) в таблице и расшифровать их после запроса.

Другим способом может быть сохранение ваших данных в виде пары ключ/значение в виде текстового файла (пример .lua in angrybirds) во внутренней или внешней памяти и выполнения шифрования содержимого файла. С другой стороны, расшифруйте его во время выполнения и прочитайте пары ключ/значение.

Tadaaa! problemo resolved :)

+0

Каким будет мой ключ шифрования? Это нормально, если я просто кодирую некоторую случайную строку? Кроме того, я должен был бы зашифровать больше, чем просто значение статуса, поскольку 'encrypt (1)' будет иметь одинаковое значение для всех уровней. Будет ли шифрование кода статуса, связанного с номером уровня, достаточно хорошим? – IVlad

+0

В одном из моих приложений я использую Bluetooth-адрес устройства (или вы можете попробовать wifi mac-address) в качестве ключа шифрования для шифрования данных. Ooops, я только что объявил о моей логике шифрования? : p В любом случае, с таким ключом, ваше дешифрование данных привязано к тому конкретному устройству, которое только шифрует его. Это зависит от того, сколько данных вы хотите зашифровать. Я бы сказал, что шифрование/дешифрование всех параметров не будет проблемой для обработки. – waqaslam

+0

Вы абсолютно правы, что если вы хотите легко расшифровать данные (не запрашивая пароль пользователя), вам нужно немного сохранить ключ, и как только кто-то узнает, откуда вы получаете этот ключ, они могут его восстановить и расшифровывать данные (и повторно шифровать измененные данные) сами. Вы не можете действительно решить эту проблему, просто кутитесь с тем, как вы храните/формируете ключ, чтобы сделать вещи более трудными для вашего злоумышленника, чтобы замедлить их и, надеюсь, занять достаточно времени, чтобы он больше не стоил им. – jeffsix

1

простой способ: магазин различный уровень данные для каждого игрока.

код менее 5 строк:

//encrypt code: 
save_level = "level_txt" + "#"+ md5("gamename" + "playername" + level_txt) 

//decrypt code: 
level_plaintxt, md5_level = save_level.split("#") 
if (md5_level == md5("gamename" + "playername" + level_plaintxt)) 
    return level_plaintxt 
+0

изменить строковый ключ на то, что я не знаю. Или, я взломаю ур игру -_ !!! – fanlix

+0

Что вы имеете в виду для каждого игрока? У меня только один игрок, так как это оффлайн-игра. Кроме того, если игрок 'x' знает, что' asdf' отображает для уровня, который он закончил, он знает, что он должен добавить 'asdf', чтобы разблокировать другие уровни, не так ли? – IVlad

+0

Oh noes O (n) сложность! Это будет медленным, если у вас более 50000 уровней! Не используйте хеш, когда вы действительно хотите зашифровать. – pgsandstrom

1

Взлом данных (игровые приложения/уровня данных/рекордами-таблицы и т.д.), которые хранятся локально на устройстве (или в конечном счете будет удаленно) всегда быть доступным (и декодируемым) кем-то, кто действительно хочет и знает, как это сделать.

Каждый уровень безопасности, который вы добавляете, только усложнит (а это займет больше времени) для хакера. Иногда даже добавление дополнительного уровня безопасности требует больше времени для реализации на вашей стороне, чем для хакера, чтобы это понять. (Известны примеры в истории вычислений, один - XBox IIRC).

Безопасность от неизвестности - это то, что вы пытаетесь сделать при шифровании данных в вашем случае. Этого недостаточно в долгосрочной перспективе. Особенно, когда вы проектируете встречу с большой аудиторией.