Методы шифрования архива в C ++ - PullRequest
7 голосов
/ 27 января 2011

Я пишу игру, в которой будет много информации (конфигурация, некоторый контент и т. Д.) Внутри некоторых XML-документов, а также файлов ресурсов.Это облегчит мне и другим редактирование программы без необходимости редактировать фактические файлы C ++ и без перекомпиляции.

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

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

  1. Установите для него пароль (например, защищенный паролем ZIP), а затем укажите пароль, когда это потребуется программе
  2. Зашифруйте архив с помощью Crypto ++ или аналогичного
  3. Изменить файлслегка заголовок, как «временное» шифрование, и исправьте заголовки файла, пока файл загружен

Я думаю, числа 1 и 2 похожи, но я не смог найти никакой информации о том, может ли zlib обрабатыватьЗащищенные паролем архивы.

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

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Я думаю, вы неправильно понимаете возможности, предоставляемые шифрованием.

Пока программа выполняется на ненадежном хосте, невозможно гарантировать что-либо.

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

То же самое относится и к предотвращению вмешательства пользователя в конфигурацию.Каким бы ни был метод (CRC, Hash -> между прочим, шифрование не предназначено для предотвращения взлома), все еще возможно выполнить его реинжиниринг при наличии достаточного времени и средств (и мотивации).

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

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

Примечание: да, это незаконно, но давайте прагматично ...

Примечание: что касается мотивации, чем умнее вы защищаете программу, тем привлекательнее она для хакеров -> это для них как головоломка для мозга!

Итак, как вы предоставляете защищенную услугу?

  • Вам нужно доверять человеку, который выполняет программу
  • Вам нужно доверять человеку, который хранит конфигурацию

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

На вашем месте, я бы просто позаботился о том, чтобы обнаружить несанкционированное вмешательство в конфигурацию (относитесь к ней как к враждебной и проверяйте данные, прежде чем запускать что-либо).Ведь вероятность повреждения всего файла одинакова, и если поврежденный файл конфигурации означал испорченную клиентскую машину, то было бы чертовски дорого:)

1 голос
/ 27 января 2011

Установите для него пароль (например, ZIP-архив, защищенный паролем), а затем укажите пароль, когда это потребуется программе

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

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

Теперь по другим пунктам. zlib не поддерживает шифрование , и, как они указывают, PKZip все равно сломан .Я подозреваю, что если бы вы были настолько склонны к поиску, вы бы, вероятно, нашли бы библиотеку zip / сжатие, способную обрабатывать шифрование.( ZipArchive Я думаю, что обрабатывает Zip + AES, но вы должны заплатить за это).

Но я второй ответ Даниэля, который только что отображается на моем экране.Зачем?Шифрование / сжатие не принесет вам никакой пользы, если пользователь не предоставит какую-либо форму токена (пароль, смарт-карту и т. Д.), Отсутствующую в ваших скомпилированных двоичных или связанных файлах.Точно так же, если вы не расходуете много места на диске, зачем сжимать?

1 голос
/ 27 января 2011

Если бы мне пришлось выбрать один из трех вариантов, я бы выбрал Crypto ++, поскольку он прекрасно вписывается в C ++ iostreams.

Но: вы

  • сериализуетеданные в XML
  • сжимают их
  • шифруют их

все в памяти и обратно.Я бы действительно пересмотрел этот выбор.Почему бы не использовать, например. SQLite для хранения всех ваших данных в файловой базе данных (для SQLite не требуется какой-либо внешний процесс базы данных)?

Шифрование можно добавлять с помощью различных расширений ( SEE или SQLCipher ).Это безопасно, быстро и полностью прозрачно.

Вы не получаете сжатие, но опять же, с использованием SQLite вместо XML, это не будет проблемой в любом случае (или я так думаю).

...