Как сделать файл защищенным от несанкционированного доступа?
У меня есть (запланированная) коммерческая программа, которая записывает журнал использования. В рамках своей лицензии пользователи должны будут отправлять журнал обратно в компанию каждые несколько недель. Как я могу убедиться, что файл не был подделан?
Система пишется на C# и Winforms или WPF.
Обновление: Хммм... довольно удивлен тем, как сделать файл защищенным от несанкционированного доступа? Считается "точной копией" какой методики может защитить секрет от полностью доверенного пользователя? Во всяком случае, племя высказалось.
8 ответов
Как упоминал Кен, это та же проблема, что и системы DRM. Они используют различные методы для хранения ключей, где пользователи не смогут (легко) найти их. Вы бы объединили схему цифровой подписи с чрезмерно сложной схемой хранения ключа. Разделите его на несколько частей, разбросанных по системе пользователя - некоторые части в реестре, некоторые в файлах в файловой системе, некоторые закодированы в датах модификации и именах файлов различных невинных файлов. Кроме того, сделайте подсистему DRM вашего кода намеренно неясной и трудной для отладки.
Другой альтернативой может быть периодическая отправка данных подписи в некоторую удаленную систему (если вы можете зависеть от наличия интернет-соединения).
Разве это не просто еще один случай проблемы DRM, то есть вы даете пользователям ключ и блокировку и пытаетесь убедиться, что они не используют его так, как вы этого не хотите?
Даже если бы вы могли гарантировать, что файл журнала не был затронут, как вы собираетесь гарантировать, что бинарный файл, который сгенерировал его, не был затронут? Там нет конца этому. Если ваш код работает на компьютере полностью под их контролем, вы SOL.
(Хорошая новость заключается в том, что вам, вероятно, все равно. Просто включите это в контракт. Маленькие пользователи не захотят мириться с отправкой файла журнала. Крупные компании не захотят нарушать условия контракта, потому что много денег на кону.)
Вы можете заставить приложение создавать цифровую подпись для файла, но это означает, что приложение должно каким-то образом содержать закрытый ключ, и, таким образом, пользователь может потенциально взломать приложение, чтобы обойти эту систему.
Дело в том, что пользователь имеет полный контроль над своей системой, и вы не можете помешать ему делать определенные вещи в своей системе. Я бы посоветовал вам приложить больше усилий для добавления полезных функций к вашему программному обеспечению, которые повышают уровень признательности вашего программного обеспечения, так что пользователи с меньшей вероятностью будут пиратствовать в программное обеспечение.
Единственный способ, которым я вижу, - это заставить приложение связаться с удаленным сервером. Шифрование файла будет бессмысленным, поскольку у злоумышленника есть программа для создания зашифрованного файла.
Так почему бы не заставить приложение связываться с удаленным сервером каждый раз, когда ему нужно что-то регистрировать? (и если с сервером невозможно связаться, приложение выручает). Программа также может использовать некоторые основные проверки ключа, потому что хорошо...
Скажем, программа сообщает серверу "Я делаю вещи", и сервер отправляет обратно "Ok" с подписанным PGP для проверки. В этом случае закрытый ключ будет защищен и хранится на сервере, а открытый ключ будет на клиенте и гарантирует, что сервер не будет подделан клиентской сетью.
Я предполагаю, что вы пытаетесь зарегистрировать использование вашей программы или что-то в этом роде.
Слегка связано, но посмотрите на мой вопрос Создание подписи для защиты от несанкционированного доступа к некоторым данным?
Похоже, все согласны с тем, что вам нужен внешний источник для создания подписи / безопасной временной метки, который вы можете использовать для подписи ваших данных, и что вам в основном не повезло, если приложение полностью внутреннее, так как клиент может просто перепроектировать любую контрольную сумму механизм.
Конечно, возможно, подход, при котором вы шифруете данные перед записью на диск, "достаточно хорош" - в зависимости от ваших клиентов и важности получения журналов без изменений.
Используйте некоторую криптологию - например, подпишите файл журнала.
Может быть достаточно добавить MD5-хеш, сгенерированный из содержимого файла, и некоторый "секрет", известный только вашему приложению (обратите внимание, что это может быть легко обойдено путем обратного инжиниринга приложения). Конечно, есть более безопасные подходы, включающие сертификаты или другие вещи, все это зависит от ваших требований безопасности.
Вы можете поместить файл в каталог, который пользователи не имеют разрешения на просмотр. Конечно, если у пользователя есть полный, неограниченный доступ, вы ничего не можете сделать. Ничего. У них всегда будет возможность добраться до файла (даже если он тупой и неловкий).
Вы можете зашифровать его, но они могут открыть его в текстовом редакторе и испортить его (даже если они не знают, что такое содержимое, добавление одного символа может испортить файл).
Есть ли шанс, что вы можете отправить данные онлайн, а не сохранять их в файле? Это будет держать данные вне системы пользователей, и потребует от них взломать работающую программу, если они собираются взломать что-нибудь.