защита Java-приложения по лицензии или ключу [закрыто]
Я хочу сделать настольное приложение, которое работает только на машинах с ключом или лицензией. Как этого можно достичь?
3 ответов
это полностью зависит от того, насколько безопасно вы хотите сделать это...
проблема с Java заключается в том, что вы можете декомпилировать его. Поэтому, если кто-то захочет, он может загрузить ваше программное обеспечение, скомпилировать его, а затем удалить любую безопасность, которую вы установили (а затем перераспределить ее, если они захотят).
это только проблема, если вы планируете идти на массовый рынок и продавать его, и пиратство на самом деле будет проблемой.
если вы не обеспокоены об этом, то вы можете либо пойти на онлайн, либо в автономном режиме проверки.
компания, с которой я работаю, использует онлайн-метод; есть несколько шагов:
EDIT: с тех пор я изменил, как это работает, так как старый способ был кошмаром обслуживания.
- файл лицензии
- (это может содержать все, что вы хотите на самом деле, это просто должно быть уникальным для каждого пользователя. Большинство людей обычно идут с общими одеяние;
name
company
email
- и
key
. то естьJDU8-AJS9-88DF-SASF-ASF9
вид вещи, которую вы часто видите.
- программа генерирует хэш из файла лицензии.
- поместите все данные из файла лицензии в строку
- передайте строку в функцию хэширования на этой странице могу показать вам, как.
- проверьте программу онлайн (на сервере). Данные кодируются в HTML-запросе (post/get/json / whatever you want) и отправляются на страницу проверки лицензии, которая затем проверяет данные. В данные включена случайно сгенерированная строка, которая используется страницей проверки для генерации другого пароля. Затем он возвращается в программу, которая также использовала случайную строку для создания собственного пароля. Если два совпадают, программа запускается.
для генерации ключей, просто использовать ту же функцию hasing, а затем загрузить хэш на сервер.
если вы хотите, чтобы он был в автономном режиме, вы можете включить хэши в код, я думаю, и проверить их там.
Я должен отметить, однако, что я никоим образом не эксперт по безопасности, я просто разрабатываю для компании как часть PhD, и именно так я это сделал.
Edit: это изображение может быть полезно:
второй Edit:
теперь я включил "автономную проверку" в процесс. Это не совсем Автономная проверка, она просто использует пользователя в качестве прокси - сервера-им нужно получить доступ к интернету другим способом.
он работает следующим образом:
- подключение к интернету не найдено: предоставьте пользователю 4-значный код
- пользователь переходит на страницу автономной проверки (оптимизирована для мобильного использования тоже)
- пользователь выбирает, какое программное обеспечение они используют из выпадающего список
- пользователь вводит свое имя пользователя (это поле запоминает записи)
- пользователь вводит код, который дала им программа, и отправляет
- веб-страница предоставляет 4-значный код, который они затем вводят в программу, и она запускается.
- программа добавляет некоторые специальные данные в файл лицензии, что означает, что этот процесс не нужно будет повторять в течение следующей недели / месяца / как долго.
каждый раз, когда программа успешно проверяет онлайн, он также добавляет пароль автономного доступа к файлу лицензии, что означает, что он надежен против временного простоя в интернете и перестанет работать, только если интернет не работает более недели/месяца/сколько бы времени он ни был настроен для работы.
Это зависит от того, сколько клиентов вы планируете, что и в режиме рассылки. Вы можете использовать сервер лицензий, но для этого требуется подключение к интернету для клиента. Вы также можете использовать USB-ключи для управления лицензирования.
нет идеальной системы, вам нужно сделать comproise между простотой, усилием и ценой.
вы можете отслеживать лицензирование машины с macIP в интернете . Даже в windows вы можете написать в реестре нет api, но все же вы можете это сделать. Найти фрагмент ниже, чтобы прочитать реестр -
public static final String readRegistry(String location, String key){
try {
// Run reg query, then read output with StreamReader (internal class)
Process process = Runtime.getRuntime().exec("reg query " +
'"'+ location + "\" /v " + key);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
String output = reader.getResult();
// Output has the following format:
// \n<Version information>\n\n<key>\t<registry type>\t<value>
if( ! output.contains("\t")){
return null;
}
// Parse out the value
String[] parsed = output.split("\t");
return parsed[parsed.length-1];
}
catch (Exception e) {
return null;
}
}
и на уровне класса, если вы хотите запутать использование должны быть .