Каков наилучший способ написания приложения C# "kill switch"?
Мне нужно написать "kill kill" в моем приложении C# для целей лицензирования / выставления счетов. Каков наилучший способ сделать это?
Требования следующие (на самом деле это два выключателя):
1 - "переключатель пассивного уничтожения" - если конкретный пользователь не входит в приложение в течение X дней, приложение перестает работать.
2 - "Активный выключатель" - пользователь может войти в систему и установить дату в будущем, когда приложение перестанет работать.
Я могу придумать различные способы сделать это с базой данных, но пользователи могут обойти это. Есть ли способ, которым я могу использовать зашифрованную базу данных или что-то в этом роде? Или, может быть, защищенный файл, который может содержать эти данные?
5 ответов
Независимо от того, что вы придумали, будет способ взломать его. Сколько времени и усилий вы потратите на борьбу со своими пользователями вместо того, чтобы писать функции, которые им нужны? Достаточно просто сохранить время в виде простого текста в реестре, чтобы большинство обычных пользователей не связывалось с ним. Если опытные пользователи захотят пиратствовать в вашей программе, они не будут иметь значения, что вы делаете. Я бы сказал, не тратьте свое время, пытаясь предотвратить это, и дайте им то, что заставит их хотеть платить за ваш продукт.
Достаточно талантливый пользователь всегда сможет победить вашу функциональность "kill switch".
Лучшее, на что вы можете надеяться, - это создать пару открытый / закрытый ключ и вставить открытый ключ в ваше приложение. Затем периодически делайте так, чтобы он "звонил домой" серверу с закрытым ключом, который ответит аутентифицированным сообщением о том, нужно ли завершать работу приложения или нет.
Однако злонамеренный пользователь все еще может изменить ваш исполняемый файл напрямую, чтобы отключить процедуру "телефон домой" (например, всегда возвращая значение true). Пока конечный пользователь имеет исполняемый файл на своем собственном компьютере, предотвратить это невозможно.
1 - "переключатель пассивного уничтожения" - если конкретный пользователь не входит в приложение в течение X дней, приложение перестает работать.
2 - "Активный выключатель" - пользователь может войти в систему и установить дату в будущем, когда приложение перестанет работать.
Для реализации любого из них вам необходимо надежно хранить информацию о состоянии вашего приложения. Варианты того, где можно сохранить состояние, просты: в файловой системе, в базе данных (SQL Server, Access, Active Directory и т. Д.), В реестре или в каком-либо удаленном хранилище.
Для опции файловой системы вы можете сохранить ее непосредственно в виде файла или в виде потока NTFS, прикрепленного к файлу. Потоки хороши тем, что они не отображаются в простом списке DIR, и потому что они будут следовать за связанным файлом, если он где-то скопирован. Например, вы можете поместить данные в "file.exe:key".
Наиболее безопасный подход, вероятно, состоит в том, чтобы использовать несколько местоположений и проверять расхождения в процессе проверки. Вы можете использовать шифрование, чтобы запретить одному пользователю копировать проверочные данные с одного компьютера на другой - возможно, путем создания ключа, который включает MAC-адрес локального компьютера.
Вы также можете рассмотреть возможность использования DPAPI для хранения любых ключей шифрования, которые вы используете; это делает их более безопасными, чем просто использование файла в файловой системе.
Если люди сделали это, люди могут сломать это, это неизбежная правда. Но если вы хотите добавить что-то, что замедлит работу среднего пользователя, вот что я бы сделал.
Создайте сценарий с базовой аутентификацией Windows, а затем второй набор программной аутентификации. Базовая аутентификация Windows никогда не меняется, но аутентификация на странице меняется. (Создать учетную запись для каждого человека). Заставьте эту страницу вернуть какой-нибудь XML со случайной строкой.
На рабочем столе приложения при запуске отправьте запрос с:
the windows auth info
the random string
И, если пользователь является текущим, они будут аутентифицироваться, получать случайную строку с сервера, сопоставлять ее со случайной строкой из приложения (использовать алгоритм для ее генерации) и, если они совпадают, позволить приложению работать. Если они не совпадают, разместите какое-то уведомление.
Таким образом, когда вам нужно убить переключение приложения, вы просто удаляете или отключаете его учетную запись. Тогда они не могут войти или соответствовать строке.
Конечно, это может быть побеждено также шестнадцатеричным редактором или умным внутренним веб-сервером, но если они настолько умны и решили, что получат приложение, несмотря ни на что.
Надеюсь это поможет.
Вы всегда можете попробовать DotFuscator, который поставляется с Visual Studio, лично я никогда не пытался сам попробовать, но с точки зрения безопасности это может сработать.
Надеюсь, я в любом случае нахожусь на одной линии с вами.