Какая разница, куда вы поместите файл. Вы хотите защитить его содержимое.
На стороне сервера зашифруйте/подпишите информацию о пользователе закрытым ключом и распространите ее среди пользователей. Отправьте файл лицензии по электронной почте, пусть приложение подключится и загрузит его, все равно.
В своем приложении включите открытый ключ. Если вы не можете проверить подлинность/расшифровать файл, потерпите неудачу. Если можете, продолжайте работать. Переподключение к серверу нужно только в том случае, если вы не можете проверить подлинность файла лицензии. Для этого нужен только самый примитивный "сервер лицензий". Если вы отправляете файл по электронной почте, "сервер лицензий" - это просто сценарий, который шифрует строку и отправляет ее пользователю.
Ничто не защитит вас от изощренных попыток взлома вашего приложения. Но это решение лишит случайных пользователей возможности взломать вашу лицензию.
А если вы хотите предотвратить многократную повторную регистрацию пользователя или передачу файла лицензии его друзьям, запишите его MAC-адрес на стороне сервера и в файле лицензии. Лично я не стал бы этого делать. И это не остановит изощренных хакеров, но вам решать, сколько времени тратить на игру в кошки-мышки.
Чтобы проиллюстрировать проблемы с этим подходом, был медиасервер на базе Linux, на котором хранилась бесплатная пробная версия. отметка времени в /usr/bin/.tv
. Чтобы кто-то понял, что к файлу обращаются, требуется всего лишь strace
- в этом случае простое удаление файла перезапустило пробную версию.
Если вы разработчик-одиночка, вам придется потратить много денег и / или времени на реализацию схемы защиты, которая должна быть взломана одним человеком, чтобы быть доступной для всех. Конечно, ваша цель может заключаться только в сдерживании случайных пиратов программного обеспечения, и в этом случае даже самая простая защита (например, метод, описанный выше) сработает.
Если честно, что бы вы ни делали, вас обязательно обнаружат. Если ваша система является автономной, то есть не требует подключения к Интернету или какому-либо другому устройству во время выполнения, то оба ключа блокировки и должны быть в вашем коде или в данных, которые вы пишете. на диск. Таким образом, хотя вы можете скрыть ключ (и, возможно, даже замок), владелец системы может вызвать инструменты трассировки системы или что-то еще, чтобы вас узнать. Но я думаю, вы это знали. Каждый крупный поставщик программного обеспечения пробовал различные методы, чтобы заставить эту работу работать, но каждый раз они не работают.
Я думаю, что ваша единственная реальная надежда - регулярно приносить домой ваш программный телефон, чтобы проверять, есть ли у него действующая лицензия.
Используйте реестр для версии для Windows. Он создан для хранения данных в центральном месте, и в качестве дополнительного бонуса, если пользователь удаляет всю вашу папку, настройки все еще остаются в реестре ( *)
здесь, в stackoverflow , находится статья, описывающая, как получить доступ к реестру с помощью языка программирования Java.
Я не думаю, что у Mac есть что-то подобное, и я знаю, что в Linux этого точно нет, но это только начало.
(*) реестр, конечно, также небезопасен для пользователей, которые могут легко удалить ключи, принадлежащие вашему приложению.
Если говорить конкретно о Mac, то такой файл должен находиться в ~/Library/Application Support/YourAppName, если лицензия пользовательская, или /Library/Application Support/YourAppName для машинной лицензии.
Когда пользователь лицензирует мое приложение, я записываю файл в ~/Library/Application Support/MyAppName, поскольку это не требует специальных разрешений, но стараюсь читать его из обоих мест, чтобы обеспечить возможность машинной лицензии, если я когда-нибудь ее создам.
Для Windows вы можете попробовать использовать Isolated Storage, который будет хранить файл в уникальном месте продукта, которое обычно достаточно туманно (и имеет довольно глубокий путь), и имеет преимущество быть полностью прозрачным для разработчика.
Системы POSIX должны помещать данные приложения в скрытый файл в домашнем каталоге пользователя. Системы Windows должны поместить что-то в CSIDL_APPDATA
.