转自:http://blog.csdn.net/chenyulancn/article/details/77168621

最近,我在做一个需要使用Cython来保护整个代码库的Python项目。

起初尽管保护Python源码免受逆向工程的影响似乎是一项徒劳无功的任务,但是所有代码的cythonizing都会带来合理的安全性(二进制文件非常难以拆解,但是还可以通过程序的猴子补丁程序来完成)。

这种安全性是有代价的 - Cython的主要用途是编写可以轻松与Python代码连接的编译扩展。

因此,对复杂模块/包结构的支持是相当有限的,我们必须做一些额外的工作来实现所需的结果。

我们必须克服的第一个障碍是很难用Cython编译整个Python包(如“包含__init__.py文件的目录”)。想象一下下面的结构:

推荐的cythonizing方法是使用setup.py文件,如下所示:

setup.py或多或少是使用Cython的项目所期望的。但是有两件事要注意。第一,always_allow_keywords指令通过禁用具有大量参数的函数只允许使用关键字参数这一优化,使Flask视图函数可以正常工作。其次,我们不使用一些指南建议的ext_package参数,因为这会将cythonized代码放入另一个包中。通过省略这个参数,编译的代码保存在同一个地方。

但是,在使用python setup.py build_ext构建项目之后,我们注意到生成的程序包无法导入 - 它缺少__init__.py文件。__init__.so可以从Python导入,但这还不足以使目录成为Python的一个包。 无法导入包不是唯一的问题 - 其中的代码也无法执行包相对导入(例如.foo import foo),这会破坏其功能。

要解决这个问题,我们可以在构建项目的其余部分后从源代码树中复制__init__.py文件。 一个很好的方法是覆盖setup.py中的build_ext类:

我们已经成功地创建了可以导入的Python包。它们在build / lib.linux-x86_64-3.6或类似的目录下。 遗憾的是,这不足以分发我们的包。理想情况下,我们希望安装一个仅包含已编译代码的软件包。目前Python存档的标准是wheel格式(.whl),其目的是替换.egg格式。所以,让我们尝试用python setup.py bdist_wheel创建wheel格式! 命令完成后,应该有一个包含wheel文件的dist文件夹。打开就能产生这样的东西:

显然,归档不仅包含编译代码,还包含源代码。有一种方法可以解决这个问题,但是它似乎是反直觉的。我们需要在调用setup时删除packages参数中的包名。这样,仍然可以构建扩展并包含在wheel中,但源代码将不会在其中。

构建的wheel的内容应该如下所示:

可以使用pip install dist/*.whl安装wheel。如果我们不需要检查wheel或手动分配wheel,我们可以在项目目录中运行pip install,构建并安装wheel。

也可以从.egg存档中删除Python源代码,但它涉及到从setuptools覆盖bdist_egg命令。我不会在这里覆盖,但如果您有兴趣,请查看上述命令类的--exclude-source-files选项和zap_pyfiles方法。

通过遵循本指南,你应该能够利用复杂软件包/模块结构对Python代码库进行cythonize,从而让恶意黑客难以对其进行逆向工程并窃取你的编程成果。

英文原文:https://bucharjan.cz/blog/using-cython-to-protect-a-python-codebase.html

[转]使用Cython来保护Python代码库的更多相关文章

  1. Cython保护Python代码

    注:.pyc也有一定的保护性,容易被反编译出源码... 项目发布时,为防止源码泄露,需要对源码进行一定的保护机制,本文使用Cython将.py文件转为.so进行保护.这一方法,虽仍能被反编译,但难度会 ...

  2. 如何保护你的 Python 代码 (一)—— 现有加密方案

    https://zhuanlan.zhihu.com/p/54296517 0 前言 去年11月在PyCon China 2018 杭州站分享了 Python 源码加密,讲述了如何通过修改 Pytho ...

  3. python实用库

    参考:https://github.com/programthink/opensource/blob/master/libs/python.wiki#35_ Python 开源库及示例代码 Table ...

  4. 使用 Mypy 检查 30 万行 Python 代码,总结出 3 大痛点与 6 个技巧!

    作者:Charlie Marsh 译者:豌豆花下猫@Python猫 英文:Using Mypy in production at Spring (https://notes.crmarsh.com/u ...

  5. 使用cython库对python代码进行动态编译达到加速效果及python第三方包的制作安装

    1.测试代码:新建  fib.pyx # coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.cl ...

  6. paip.输入法英文词库的处理 python 代码 o4

    paip.输入法英文词库的处理 python 代码 o4 目标是eng>>>中文>>atian 当输入非atian词的时候儿,能打印出 atian pinyin > ...

  7. python代码规范与标准库参考

    python代码规范与标准库参考 python代码规范参考文献: http://www.runoob.com/w3cnote/google-python-styleguide.html https:/ ...

  8. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  9. [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案

    如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前

随机推荐

  1. Qgis练手

    师妹推荐了一个神器 Qgis,因为看我拿Echarts和Excel缝缝补补效率实在太低下. 还记得,以前写过一个“echarts画中国地图并上色”的笔记,那个应付一下事还行,真正需要精细画图的时候还得 ...

  2. 虚拟环境之virtualenvwrapper

    原来的virtualenv工具使用特别麻烦,主要体现在以下几点 1 创建虚拟环境的命令太长,太难记 2 管理特别麻烦 3 进入虚拟环境需要找到这个虚拟环境的存放目录才行,如果没有统一的存放目录,很难找 ...

  3. struts2必备jar包(2.1.6版本)

    struts2必备jar包(2.1.6版本) struts2(2.1.6版本)必备的jar包有6个 struts2-core-2.1.6.jar freemarker-2.3.13.jar commo ...

  4. ES6学习笔记(二)—— 通过ES6 Module看import和require区别

    前言 说到import和require,大家平时开发中一定不少见,尤其是需要前端工程化的项目现在都已经离不开node了,在node环境下这两者都是大量存在的,大体上来说他们都是为了实现JS代码的模块化 ...

  5. angular 多端打包

    1.在environments文件夹里新建三个文件: //生产环境 environment.prod.ts: export const environment = { production: true ...

  6. MapServer Tutorial——MapServer7.2.1教程学习——教程背景

    MapServer Tutorial——MapServer7.2.1教程学习——教程背景 一.前言 目前处于MapServer学习入门阶段,所以每一步都需要打下扎实基础.尽自己最大的努力,去学习知识的 ...

  7. PS切图采坑

    博客记录我的各种采坑,有的坑很水,比如下面这个 谨记录自己的坑,以后作为入门笑料. 拿到设计师的psd设计图,理清事件逻辑,接下来就要切图啦.结果PS老是crash!检查了PS版本,也不低啊2017. ...

  8. DOM获取元素的方法

    DOM:document object module 文档对象模型 DOM就是描述整个html页面中节点关系的图谱,如下图. 1,通过ID,获取页面中元素的方法:(上下文必须是document) do ...

  9. django+celery +rabbitmq

    celery是一个python的分布式任务队列框架,支持 分布的 机器/进程/线程的任务调度.采用典型的生产者-消费者模型 包含三部分:1. 队列 broker :可使用redis ,rabbitmq ...

  10. Centos7修改分区空间

    一:缩小/home空间 1.1:备份/home内容 cp -r /home/* /homebak 1.2:删除挂载/home umount /home 1.3:删除/home所在lv lvremove ...