Самый простой способ подписать / сертифицировать текстовый файл в C ++? - PullRequest
9 голосов
/ 01 июня 2010

Я хочу проверить, не были ли подделаны текстовые файлы журнала, созданные моей программой, запущенной на сайте моего клиента. Как вы предлагаете мне делать это? Я искал кучу здесь и Google, но не смог найти свой ответ. Спасибо!

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

Ответы [ 5 ]

5 голосов
/ 01 июня 2010

Обязательная преамбула: Сколько здесь поставлено на карту? Вы должны предположить, что вмешательство будет возможно, но вы можете сделать это очень сложно, если потратите достаточно времени и денег. Итак: сколько это стоит для вас?

Это говорит:

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

1 голос
/ 01 июня 2010

Это действительно зависит от того, чего вы пытаетесь достичь, что находится на ставках и каковы ограничения.

По сути: то, что вы просите, просто невозможно (изолированно).

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

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

Если в вашем распоряжении есть сеть, вы можете сохранить хэш на удаленном (под вашим контролем) диске, а затем сравнить его. 2 трудности здесь:

  • Хранение (как убедиться, что это ваш двоичный файл?)
  • Получение (как убедиться, что вы разговариваете с нужным сервером?)

И, конечно же, в обоих случаях остерегайтесь человека в середине синдрома ...

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

1 голос
/ 01 июня 2010

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

1 голос
/ 01 июня 2010

Это довольно сложная вещь, если вы не можете каким-то образом защитить пару ключей, используемую для подписи данных. Для подписи данных требуется закрытый ключ, и если этот ключ находится на компьютере, человек может просто изменить данные или создать новые данные и использовать этот закрытый ключ для подписи данных. Вы можете хранить закрытый ключ на «защищенном» компьютере, но как тогда гарантировать, что данные не были подделаны до того, как они покинули исходный компьютер?

Конечно, если вы защищаете только данные в движении, все становится намного проще.

Подписать данные легко, если вы можете защитить личный ключ.

После того, как вы разработали теорию более высокого уровня, обеспечивающую безопасность, посмотрите на GPGME , чтобы выполнить подписание.

0 голосов
/ 01 июня 2010

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

Примечание: Вы можете поместить все свои файлы журнала в отдельную папку. Например, в моем приложении у нас есть много библиотек DLL, каждая из которых имеет свои собственные файлы журналов, и, конечно, приложение имеет свои собственные.

Поэтому в фоновом режиме выполняется отдельный процесс, который отслеживает папку на наличие уведомлений об изменениях, таких как

  • изменение размера файла
  • попытка переименовать файл или папку
  • удалить файл и т.д ...

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

API окна для мониторинга папки приведен ниже:

HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName,
BOOL bWatchSubtree,
DWORD dwNotifyFilter
);

lpPathName: 
Path to the log directory.

bWatchSubtree:
Watch subfolder or not (0 or 1)

dwNotifyFilter:
Filter conditions that satisfy a change notification wait. This parameter can be one or more of the following values. 
FILE_NOTIFY_CHANGE_FILE_NAME
FILE_NOTIFY_CHANGE_DIR_NAME
FILE_NOTIFY_CHANGE_SIZE
FILE_NOTIFY_CHANGE_SECURITY
etc... 
(Check MSDN)

Как заставить это работать?

Подозреваемый A : Наш процесс

Подозреваемый X : Другой процесс или пользователь

Инспектор : процесс, который мы создали для мониторинга папки.

Inpector видит изменения в папке. Запрашивает у Suspect A , сделал ли он какие-либо изменения в нем.

если так,

change is taken as VALID.

если нет

clear indication that change is done by *Suspect X*. So NOT VALID! 
File is certified to be TAMPERED.

Кроме этого, ниже приведены некоторые методы, которые могут (или не могут :)) помочь вам!

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

  2. Измените права доступа к файлу на только для чтения после записи в него журналов. В какой-то программе или кто-то хочет изменить его, они пытаются изменить свойство только для чтения. Это действие изменяет дату / время, измененное для файла.

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

  4. Использование механизма сжатия и распаковки (сжатие может помочь вам защитить файл с помощью пароля)

У каждого способа могут быть свои плюсы и минусы. Сила логика основана на ваших потребностях. Вы даже можете попробовать комбинацию предложенных методов.

...