Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как установить лицензионную защиту кода на Pyth...

Как установить лицензионную защиту кода на Python и обезопасить данные с помощью HASP?

Вячеслав Жуйко (МТС ИИ лид команды разработки Audiogram). Как установить лицензионную защиту кода на Python и обезопасить данные с помощью HASP?

Как подружить C/C++ и Python с помощью Cython
Как передавая ПО на Python не отдавать исходники
Как использовать зашифрованные модели из Python

Выступление: https://moscowpython.ru/meetup/79/license-defence-for-code/

MoscowPython: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru

Moscow Python Meetup

February 04, 2023
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Решение https://ru.wikipedia.org/wiki/Cython “Cython — язык программирования, упрощающий написание модулей С/C++

    кода для Python. Кроме стандартного синтаксиса Python, поддерживаются: • прямой вызов функций и методов C/C++ из кода на Cython; • строгая типизация переменных, классов, атрибутов классов. Код Cython преобразуется в C/C++ код для последующей компиляции и впоследствии может использоваться как расширение стандартного Python или как независимое приложение со встроенной библиотекой выполнения Cython.”
  2. Возможности Cython • Ситонизация – трансляция Python кода в C/C++

    • Интеграция нативных библиотек в Python • Ускорение критичных участков Python кода
  3. Ситонизация Любой (почти) код на Python можно транслировать в C/C++,

    собрать из него бинари и поставлять их вместо скриптов. Как именно работает трансляция? Cython гененирует код на C/C++ на основе кода на Python используя его C- API
  4. Интеграция нативных библиотек в Python Cython позволяет довольно легко интегрировать

    библиотеку на нативном языке в Python. Для этого нужны: • Заголовочный файл .h • Библиотека .so | .a • Или исходники библиотеки на C/C++ • Обертка на Cython
  5. Ускорение критичных участков Python кода Python def fib(n: int) ->

    int: if n == 0: return 0 if n == 1: return 1 return fib(n-1) + fib(n-2) fib(35) # 2.5 seconds
  6. Ускорение критичных участков Python кода Cython cpdef int fib(int n):

    if n == 0: return 0 if n == 1: return 1 return fib(n-1) + fib(n-2) fib(35) # 0.02 seconds
  7. Сборка Cython расширения. setup.py from setuptools import setup, Extension from

    Cython.Build import cythonize setup(language_level='3', ext_modules=cythonize(Extension( 'fib', sources=['fib.pyx'], ))) $ python setup.py build_ext --inplace
  8. Python int != Cython int Python int – unlimited Cython

    int, фактически C int – 2^31-1 на типовых платформах
  9. Альтернативы • ctypes – A foreign function library for Python

    • Nuitka – Nuitka is a source-to-source compiler which compiles Python code to C source code • CFFI – C Foreign Function Interface for Python • Numba – Numba is an open-source JIT compiler that translates a subset of Python and NumPy into fast machine code using LLVM
  10. HASP (Hardware Against Software Piracy) — мультиплатформенная аппаратно- программная система

    защиты программ и данных от незаконного использования и несанкционированного распространения
  11. Почему именно HASP? • Аппаратная защита • Подсчет ресурсов. Лимиты

    • Защита от взлома бинарников • Средства для управления лицензиями
  12. Sentinel HASP Задачи: • Шифруем данные (модели) на этапе сборки

    • Встраиваем в код расшифровку данных • Защищаем бинари от взлома
  13. Шифрование данных Средства Sentinel SDK позволяют шифровать данные которые можно

    расшифровать только при наличии действующей лицензии
  14. Встраиваем в код расшифровку данных. 1 Создаем библиотеку на C++

    с функцией расшифровки данных Вставляем в нужные Python файлы следующий кусок на Cython cdef extern from "sentinel.h": vector[unsigned char] sentinel_decrypt(const string& path) except +
  15. Встраиваем в код расшифровку данных. 2 def sentinel_open(path: Union[str, bytes,

    os.PathLike], mode: str, **kwargs) Создаем класс для чтения данных с расшифровкой на замену io.FileIO class SentinelFileIo Переименовываем .py → .pyx Полный исходник можно посмотреть в статье на Хабр
  16. Сборка • Генерируем с помощью Cython код на C++ •

    Компилируем и линкуем с нативной библиотекой
  17. Защита В состав Sentinel SDK входит утилита Envelope: • Шифрует

    ресурсы исполняемых файлов • Предотвращает отладку с помощью дебагера • Привязывает исполняемый файл к железу через лицензию
  18. Итог • Избавились от исходников • Перешли на работу с

    зашифрованными моделями • Защитили бинарные исполняемые файлы • Привязались к железу