Я бы не беспокоился о коде, то есть о «шифровании», отправляемом клиенту, это не важно. Важным моментом является то, что вы сохраняете закрытый ключ , используемый для создания действительных лицензий, и отправляете свой открытый ключ вместе с приложением.
Итак, если ваши причины отделить шифрование от дешифрования - это «безопасность», я думаю, это достаточно хорошо, если вы храните свой секретный ключ в секрете.
При этом, с точки зрения объектной ориентации, я бы смоделировал проблему по-другому. Суть вашей проблемы - License
, которая должна была бы проверить себя в данный момент времени, поэтому:
public interface License {
boolean validNow(); // Or whatever you need
}
Затем просто создайте реализацию, которая читает из файла:
public final class FileLicense {
...
}
Таким образом, на данный момент вы можете читать и проверять лицензии из файла.
Хорошо, так как же «создать» License
. Самый простой способ (который в зависимости от ваших требований может подходить или не подходить) состоит в том, чтобы просто создать другую реализацию, например:
public final class NewLicense {
...
public NewLicense(PrivateKey companyKey, license data...) {
...
}
}
В этом проекте вы в основном просто реализуете интерфейс и можете разделять создание и использование лицензий. Вы также можете поместить функцию сохранения / загрузки из файлов непосредственно в класс License
, если вам сейчас нужны только файловые лицензии (KISS, YAGNI).