Рейтинг:0

Как убедиться, что файлы на клиентском компьютере не были изменены клиентом?

флаг ro

Я разрабатываю программу, которую клиенты могут загрузить на компьютер. Эта программа должна регулярно синхронизироваться с моим онлайн-сервером, чтобы убедиться, что срок действия кода активации клиента не истек, и он оплачивает свои счета. Однако я хочу, чтобы программа могла работать до 5 дней без необходимости подключения. Это позволит клиенту использовать программу какое-то время, если он потеряет подключение к Интернету. Это был бы большой бонус по сравнению с другими программами, которые используют мои клиенты, которые становятся совершенно бесполезными без интернета.

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

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

Я рассмотрел следующее:

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

  2. Какой-то способ подписи файла для обеспечения подлинности. Я мало что знаю о шифровании, но это звучит точно так же, как № 1.

  3. Асимметричное шифрование. Но я не уверен, как это может быть достигнуто здесь. Когда программа синхронизируется, онлайн-сервер может зашифровать метку времени с помощью открытого ключа и отправить ее обратно в программу для сохранения зашифрованного содержимого в файле. Затем его можно было расшифровать с помощью закрытого ключа. Это гарантирует, что временная метка была создана моим сервером, а не клиентом. Проблема в том, что любой может зашифровать временную метку с помощью открытого ключа и поместить ее в файл, потому что открытый ключ является открытым. Кроме того, закрытый ключ должен храниться внутри программы, что возвращается к той же проблеме, что и № 1.

Возможно ли вообще достичь того, чего я пытаюсь достичь?

Рейтинг:0
флаг my

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

Я рассмотрел следующее:

  1. Какой-то способ подписи файла для обеспечения подлинности.

Это было бы ближе всего; очевидным способом было бы, если бы у сервера был закрытый ключ подписи, а у программы был соответствующий открытый ключ. Затем, когда вы подключитесь, сервер может подписать текущую отметку времени и отправить эту отметку времени и подпись клиенту.

Затем, когда клиент не может подключиться, он затем проверяет более позднюю отметку времени/подпись, которая была загружена, и проверяет эту подпись (используя открытый ключ, установленный вместе с клиентом); если это подтверждается, вы проверяете, не старше ли метки времени более пяти дней.

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

Злоумышленник не может изменить отметку времени, потому что он не может изменить подпись (и проверить ее); он может заменить временную метку/подпись на предыдущую, однако это ничего не даст.

Возможные способы атаки:

  • Изменить «текущее время»; большинство ОС позволяют вам устанавливать время так, как хочет пользователь. Это предполагает проверенную (хотя и не очень точную) отметку времени.

  • Измените программу (либо для изменения открытого ключа, либо, что более вероятно, замените логику проверки чем-то, что всегда говорит: «это действительно»). Это всегда проблема, когда вы работаете в ненадежной вычислительной базе.

флаг ro
Привет, @poncho, спасибо за отличные идеи. Мне потребуется некоторое время, чтобы переварить это и вернуться к вам. Грасиас
флаг ro
Я ценю вашу помощь. Думаю, я понимаю, о чем вы говорите. Асимметричное шифрование RSA можно использовать в обратном порядке, когда закрытый ключ что-то подписывает, а затем открытый ключ можно использовать для подтверждения подлинности. Сохраните подписанную версию и исходное сообщение, а затем убедитесь, что они совпадают. Подпись могла быть только из закрытого ключа. Имеет смысл. Что касается атаки, можно ли изменить код в скомпилированной программе? Я мало что знаю об этом.Можно ли в принципе изменить любую программу, и это просто то, с чем приходится смириться разработчикам?
poncho avatar
флаг my
@Geoff: «Что касается атаки, можно ли изменить код в скомпилированной программе?»; это не тривиально, но это может сделать кто-то с небольшим опытом и правильными инструментами.

Ответить или комментировать

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