Что вы используете для связывания / шифрования данных?


14

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

Этот конкретный вопрос вращается вокруг C ++, но я был бы открыт, чтобы услышать, как это делается и в C # / XNA.

Просто чтобы прояснить - я не собираюсь разрабатывать решение для предотвращения взлома. На фундаментальном уровне мы все манипулируем 0 и 1. Но мы хотим, чтобы 99% людей, которые играют в игру, просто не изменяли XML-файлы, используемые для создания игрового мира. Я видел множество игр, объединивших все свои ресурсы. Мне просто любопытно, какие методы они используют.


Хороший вопрос, хотя я не верю, что есть способ на 100% защитить его, я верю, что есть аккуратный способ сжать и запутать его, и я хотел бы узнать больше об этом ...
Prix

Стоит задаться вопросом, следует ли даже считать ваши художественные / аудио активы «чувствительными». Многие игры преднамеренно предоставляют свои ресурсы игрокам для поддержки здорового сообщества модов, что, в свою очередь, может повысить ценность игры (даже для разработчика практически без затрат).
Ян Шрайбер

В основном меня интересуют конфиденциальные данные, которыми управляет игра, управляемая данными (например, xml-файлы). Я только что видел, как игры объединяют все в один или два файла.
Дэвид Макгроу

4
Что не так с игроками, играющими с этими данными?
jsimmons

побить свой собственный барабан .. КЛЛ: iki.fi/sol/cfl
Яри ​​Комппа

Ответы:


8

Хорошая стратегия состоит в том, чтобы создать свой собственный формат архива с нуля и сделать его индексированным с таблицей, указывающей на порции данных, вместо того, чтобы хранить целые последовательные файлы в вашем архиве, затем зашифровывать таблицу индексов и сжимать каждый порцию отдельно, используя LZMA / Bzip2.

Другой подход заключается в том, чтобы использовать биты процедурных генераторов данных здесь и там (если вы захотите зайти так далеко, вы даже можете получить «параметры» для указанных генераторов с онлайн-сервера в качестве дополнительной меры), и выгрузив часть работы на GPU вы также можете предотвратить полный дамп памяти и компенсировать потерю производительности.

Тем не менее, я нахожу, что такие методы обычно снижают производительность и тратят время на разработку, при этом конечному пользователю ничего не предлагая, кроме потенциальных проблем и ненужных ошибок.

Тем не менее, ничто не на 100% безопасно.


+1 за это. Сжатие удовлетворяет как необходимость запутывания, так и улучшит время загрузки и площадь приложения. Архивирование / упаковка данных в любом случае потребует уровня абстракции, поэтому объединение его с чем-то, что может загружать / распаковывать на месте, не должно быть слишком сложным. Если вы все же будете использовать сжатие, я бы позаботился о том, чтобы логика сжатия / распаковки была отделена от содержимого загрузки / архивирования. Таким образом, вы сможете заменить более совершенный алгоритм на более поздний срок, при этом необходимая инфраструктура не меняется между алгоритмами.
MrCranky

@MrCranky: Если вы посмотрите на то, как EA делает это с их форматом архива .package (DBPF) (используется в играх SPORE и The Sims), вы действительно увидите это в действии. У их движка есть дополнительное поле в индексной таблице для «типа сжатия», внутренний код для того, какой алгоритм использовать. Они используют различные алгоритмы сжатия, основанные на типе чанка (например, в текстовых чанках используется специальное сжатие). Система управления версиями, которую они используют, также позволяет интегрировать моды и обеспечивать обратную совместимость. Подробнее о формате DBPF можно прочитать здесь: simswiki.info/DatabasePackedFile
voodooattack,

Интересные вещи: я когда-либо делал это только во время компиляции с помощью #define, но среда выполнения открывает некоторые хорошие возможности (например, возможность изменить тип сжатия без необходимости перестраивать каждый файл для вашей игры).
MrCranky

11

Не отправляйте конфиденциальные данные.

Там нет никакого способа , чтобы отправить зашифрованные данные так , что только игра может получить к нему доступ. Вы можете очень сильно постараться, но вы быстро попадаете в проблемы DRM.

Если вы хотите держать свои игровые активы подальше от посторонних глаз.

  1. застегни это
  2. xor файл
  3. изменить расширение на что-то скучное (то есть нет my_level.zip.xor, использовать my_level.map).

Это остановит 95% вредных пользователей. Остальные 5% получат это независимо от того, что вы делаете.
Вам не нужно на самом деле молнии и xor. Вместо этого вы можете использовать lzma и использовать AES с известным ключом. Дело в том, чтобы не тратить на это много времени.


Это то, что я обычно вижу в большинстве игр ... печенье для тебя.
Prix

2
На самом деле достаточно просто zip + rename.
Coderanger

1
я так не думаю, мне нравится That will stop 95% of mischeivieous users.выходить из этого, хотя я верю, что есть еще люди, которые действительно получат это, я был бы признателен, если бы не все и каждый мог. В наши дни большинство 10-летних детей знают, как открывать файлы в блокноте и переименовывать его ...
Prix

1
Знаешь как, да. Будет когда-нибудь все равно, нет.
Coderanger

zip + rename недостаточно. Linux редко использует расширения файлов для определения типа файла. Вместо этого он просматривает первые несколько байтов и использует их для определения своего типа. Переименованный почтовый индекс все еще обнаруживается как почтовый индекс в Linux. Windows XP не делает этого, она все еще использует расширения. Я не знаю, как Windows7 это делает, но я ожидаю, что в будущем Windows будет использовать аналогичную технику.
deft_code

4

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


4

Моя работа связана с защитой от взлома. Я знаю кого-то, кто взломщик игр старой школы. Он взламывает игры, как дыхание. Вы не можете остановить таких людей, как он. Если ваша игра достаточно популярна, несколько взломанных версий игры появятся на торрент-сайтах всего через несколько дней после релиза, независимо от того, что вы делаете. Мой совет - просто сделать минимум, чтобы не пускать среднего Джо, который думает, что, возможно, захочет нанести удар этой вещи с реверс-инжинирингом.


1
Это цель. У меня нет абсолютно никакого желания бороться с хакерами.
Дэвид Макгроу

1

Хороший вопрос, но на этот вопрос нелегко ответить.
Исходя из моего опыта с безопасностью данных, вы должны думать о следующем:

1) Что вы защищаете, от кого и каково влияние, если эти данные небезопасны - безопасность гораздо больше относится к оценке рисков, чем к системным техническим решениям
2) Я предполагаю, что ваша платформа является настольной (например, Windows / OSX) в этом случае у вас есть другое проблемное пространство, чем проприетарное оборудование, такое как PS3 / Xenon, которые имеют свои собственные попытки защиты на уровне ядра (является ли это действительным решением, открытым для обсуждения)
3) Шифрование! = безопасность. Шифрование только гарантирует, что ваши данные не могут быть прочитаны , но и не гарантирует, что ваши данные не могут быть записаны или воспроизведены / проксированы.

Если ваши требования состоят в том, чтобы защитить ваши данные от подделки, вам нужно подумать о хешировании ваших данных (желательно с SHA-256 или SHA-512). Чтобы повторить итерацию, подумайте, почему это важно и что вы получаете от повышения безопасности своего система.
Также стоит знать, что добавление технологии шифрования к вашему продукту может иметь юридические последствия из-за экспортных ограничений (технология шифрования классифицируется как технология ограничения вооружений, верите или нет), поэтому рекомендуется использовать библиотеки, которые преодолели эти юридические проблемы.
Наконец - никогда, никогда не используйте свою собственную технологию шифрования - используйте хорошо известные, документированные, исследованные алгоритмы, такие как AES, Blowfish, RSA и т. Д.

ps Открытый / закрытый ключ не подходит или не подходит для шифрования больших объемов данных, поэтому DRM / PGP и т. д. используют гибридную симметричную систему RSA +, т. е. защищают симметричный ключ с помощью RSA, а затем выполняют стандартное симметричное шифрование с использованием этого ключа.

Это очень большой сложный предмет, и я определенно не сделал это справедливо

надеюсь, это поможет


1

Если вам нужен пример формата, который был спроектирован и создан (возможно, чрезмерно усиленный) для того, чтобы он был маленьким (сжимаемым), смехотворно безопасным и гибким, вам следует обратиться к формату Blizzard MPQ.

http://wiki.devklog.net/index.php?title=The_MoPaQ_Archive_Format

Общий формат архива выглядит следующим образом:

Данные файла данных файла заголовка архива - Специальные файлы Таблица блоков хэш-таблицы Таблица расширенных блоков Сильная цифровая подпись

Этот формат имеет ВСЕ. Блокируемая, расширенная блокируемая, данные разбиваются на сектора (для упрощения потоковой передачи), поддержка 7 (!) Алгоритмов сжатия (если вы считаете сжатие звука), которые можно произвольно комбинировать, слабая цифровая подпись, сильная цифровая подпись и так далее.

Если бы вы купили API от Blizzard, который занимается файловой архитектурой, вы получили бы все, что вам когда-либо понадобится, и многое другое.


Спасибо за ссылку, я никогда не думал о том, чтобы заглянуть в детали MPQ (и вообще предполагал, что они будут недоступны)
Билл

Если он настолько безопасен, то почему он до такой степени спроектирован и даже имеет сторонние библиотеки для взаимодействия с ним? ;-)
coderanger

Большинство (читай: все) инструменты для взаимодействия с * .mpq файлами зависят от Stormlib, который написан и поддерживается одним парнем.

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

И фактически с «World of Warcraft», Blizzard является пионером потоковой технологии, позволяющей вам играть в игру, загружая на жесткий диск всего несколько процентов всей информации. Формат * .mpq отлично справляется с такой работой. Не говоря уже о том, что когда Blizzard выпустила установщик Starcraft 2 за несколько дней до официального выпуска игры, ее архивы были настолько сильно зашифрованы, что их нельзя было открыть до выхода игры. : P

0

Поскольку это было недавно возрождено, ваш вопрос (и, следовательно, все ответы на данный момент), кажется, имеет дело только с загрузкой файла, которая настолько же безопасна, как исполняемый файл, который хочет его загрузить. На ПК нет ничего действительно защищенного (вы просто задерживаете людей), вы можете проверять данные на серверах, но даже эта проверка может быть удалена, так что модифицированные exe-файлы можно запускать независимо от того, что. Консоли по-прежнему «довольно» защищены, поэтому в большинстве случаев я генерирую хэш важных файлов, затем подписываю хэш с закрытым ключом, встраиваю открытый ключ в код и проверяю защищенный хэш для файла.

Я думал, что добавлю еще одну атаку в разговор, с чем я столкнулся только в прошлом году, потому что я не склонен много загружать на ПК. Cheat Engine - очень аккуратная маленькая программа, которая почти автоматизирует создание ваших собственных хаков (а это значит, что каждый может ее использовать). Он довольно продвинут в том, что он может делать, многие хаки / читы, которые я видел, что люди продают, сделаны этим или чем-то очень похожим на то, что я видел (все массовые). С некоторой работой вы можете защитить себя от подобных вещей снова, я думаю, все зависит от того, насколько популярна игра и если кто-то заботится о том, чтобы беспокоиться.

Оппс, забыл упомянуть, что хорошей библиотекой для шифрования (в C ++) является LibTomCrypt .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.