Идея иметь ограниченную по времени лицензию и проверить ее в локальной программе не будет работать. Даже при идеальном запутывании, проверка лицензии может быть удалена. Однако, если вы проверите лицензию на удаленной системе и запустите значительную часть программы на своей закрытой удаленной системе, вы сможете защитить свой IP.
Не позволяя конкурентам использовать исходный код как свой собственный или писать свою вдохновленную версию того же кода, один из способов защиты - это добавить сигнатуры в логику вашей программы (некоторые секреты, чтобы доказать, что код был украден у вас) и запутывать исходный код на python, поэтому его трудно читать и использовать.
Хорошая запутанность добавляет к вашему коду в основном ту же защиту, что и компиляция его в исполняемый файл (и бинарный двоичный код). Выяснить, как работает запутанный сложный код, может быть даже сложнее, чем написать собственную реализацию.
Это не поможет предотвратить взлом вашей программы. Даже с запутанным кодом лицензионный материал будет взломан, и программа может быть изменена, чтобы иметь немного другое поведение (так же, как компиляция кода в двоичный файл не помогает защитить нативные программы).
В дополнение к запутыванию символов может быть хорошей идеей нерефакторизовать код, что делает все еще более запутанным, если, например, графы вызовов указывают на множество разных мест, даже если на самом деле эти разные места в конечном итоге делают одно и то же.
Логическая подпись внутри обфусцированного кода (например, вы можете создать таблицу значений, которые используются программной логикой, но также используются в качестве подписи), которая может использоваться для определения того, что код произошел от вас. Если кто-то решит использовать ваш обфусцированный модуль кода как часть своего собственного продукта (даже после того, как его повторно обфусцируют, чтобы он выглядел иначе), вы можете показать, что код украден с вашей секретной подписью.