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

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

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

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

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