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

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

Как установить лицензионную защиту кода на 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
PRO

February 04, 2023
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

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

    View Slide

  2. Проблема
    Как передавая заказчику ПО на Python не отдавать исходники

    View Slide

  3. Решение
    https://ru.wikipedia.org/wiki/Cython
    “Cython — язык программирования, упрощающий написание модулей С/C++ кода
    для Python. Кроме стандартного синтаксиса Python, поддерживаются:
    ● прямой вызов функций и методов C/C++ из кода на Cython;
    ● строгая типизация переменных, классов, атрибутов классов.
    Код Cython преобразуется в C/C++ код для последующей компиляции и
    впоследствии может использоваться как расширение стандартного Python или
    как независимое приложение со встроенной библиотекой выполнения Cython.”

    View Slide

  4. Возможности Cython
    ● Ситонизация – трансляция Python кода в C/C++
    ● Интеграция нативных библиотек в Python
    ● Ускорение критичных участков Python кода

    View Slide

  5. Ситонизация
    Любой (почти) код на Python можно транслировать в C/C++, собрать из него
    бинари и поставлять их вместо скриптов.
    Как именно работает трансляция?
    Cython гененирует код на C/C++ на основе кода на Python используя его C-
    API

    View Slide

  6. Интеграция нативных библиотек в Python
    Cython позволяет довольно легко интегрировать библиотеку на нативном
    языке в Python. Для этого нужны:
    ● Заголовочный файл .h
    ● Библиотека .so | .a
    ● Или исходники библиотеки на C/C++
    ● Обертка на Cython

    View Slide

  7. Ускорение критичных участков 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

    View Slide

  8. Ускорение критичных участков 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

    View Slide

  9. Сборка 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

    View Slide

  10. Аугментация
    .pxd
    cpdef int fib(int n)
    Не требует изменения Python кода

    View Slide

  11. Python int != Cython int
    Python int – unlimited
    Cython int, фактически C int – 2^31-1 на типовых платформах

    View Slide

  12. PEP 484 – Type Hints
    Частичная поддержка

    View Slide

  13. Альтернативы
    ● 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

    View Slide

  14. HASP
    (Hardware Against Software Piracy) — мультиплатформенная аппаратно-
    программная система защиты программ и данных от незаконного
    использования и несанкционированного распространения

    View Slide

  15. Почему именно HASP?
    ● Аппаратная защита
    ● Подсчет ресурсов. Лимиты
    ● Защита от взлома бинарников
    ● Средства для управления лицензиями

    View Slide

  16. Sentinel HASP
    Задачи:
    ● Шифруем данные (модели) на этапе сборки
    ● Встраиваем в код расшифровку данных
    ● Защищаем бинари от взлома

    View Slide

  17. Шифрование данных
    Средства Sentinel SDK позволяют шифровать данные которые можно
    расшифровать только при наличии действующей лицензии

    View Slide

  18. Встраиваем в код расшифровку данных. 1
    Создаем библиотеку на C++ с функцией расшифровки данных
    Вставляем в нужные Python файлы следующий кусок на Cython
    cdef extern from "sentinel.h":
    vector[unsigned char] sentinel_decrypt(const string& path) except +

    View Slide

  19. Встраиваем в код расшифровку данных. 2
    def sentinel_open(path: Union[str, bytes, os.PathLike], mode: str, **kwargs)
    Создаем класс для чтения данных с расшифровкой на замену io.FileIO
    class SentinelFileIo
    Переименовываем .py → .pyx
    Полный исходник можно посмотреть в статье на Хабр

    View Slide

  20. Встраиваем в код расшифровку данных. 3
    Заменяем:
    open(path, 'rb') → sentinel_open(path, 'rb')

    View Slide

  21. Сборка
    ● Генерируем с помощью Cython код на C++
    ● Компилируем и линкуем с нативной библиотекой

    View Slide

  22. Защита
    В состав Sentinel SDK входит утилита Envelope:
    ● Шифрует ресурсы исполняемых файлов
    ● Предотвращает отладку с помощью дебагера
    ● Привязывает исполняемый файл к железу через лицензию

    View Slide

  23. Итог
    ● Избавились от исходников
    ● Перешли на работу с зашифрованными моделями
    ● Защитили бинарные исполняемые файлы
    ● Привязались к железу

    View Slide

  24. Спасибо

    View Slide