[转]使用Cython来保护Python代码库
转自: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代码库的更多相关文章
- Cython保护Python代码
注:.pyc也有一定的保护性,容易被反编译出源码... 项目发布时,为防止源码泄露,需要对源码进行一定的保护机制,本文使用Cython将.py文件转为.so进行保护.这一方法,虽仍能被反编译,但难度会 ...
- 如何保护你的 Python 代码 (一)—— 现有加密方案
https://zhuanlan.zhihu.com/p/54296517 0 前言 去年11月在PyCon China 2018 杭州站分享了 Python 源码加密,讲述了如何通过修改 Pytho ...
- python实用库
参考:https://github.com/programthink/opensource/blob/master/libs/python.wiki#35_ Python 开源库及示例代码 Table ...
- 使用 Mypy 检查 30 万行 Python 代码,总结出 3 大痛点与 6 个技巧!
作者:Charlie Marsh 译者:豌豆花下猫@Python猫 英文:Using Mypy in production at Spring (https://notes.crmarsh.com/u ...
- 使用cython库对python代码进行动态编译达到加速效果及python第三方包的制作安装
1.测试代码:新建 fib.pyx # coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.cl ...
- paip.输入法英文词库的处理 python 代码 o4
paip.输入法英文词库的处理 python 代码 o4 目标是eng>>>中文>>atian 当输入非atian词的时候儿,能打印出 atian pinyin > ...
- python代码规范与标准库参考
python代码规范与标准库参考 python代码规范参考文献: http://www.runoob.com/w3cnote/google-python-styleguide.html https:/ ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案
如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前
随机推荐
- html代码换行造成空格间距问题
连续几个内联标签或表单元素标签的换行在浏览器会被解释为一个空格. 比如下面代码: <span style="border:1px solid #f20">hello&l ...
- liunx存储管理之基础知识
存储基础知识 ====================================================================================主要知识点: 基本 ...
- 『TensorFlow』滑动平均
滑动平均会为目标变量维护一个影子变量,影子变量不影响原变量的更新维护,但是在测试或者实际预测过程中(非训练时),使用影子变量代替原变量. 1.滑动平均求解对象初始化 ema = tf.train.Ex ...
- mybatis的jdbcType和javaType、oracle,MySQL的对应类型
JdbcType介绍 数据库列字段都是有类型的,不同的数据库有不同的类型.为了表示这些数据类型,Java源码是采用枚举来定义的: public enum JDBCType implements SQL ...
- 【IDE】我的花里胡哨VS
我的 VS2017 效果图,花里胡哨但十分养眼,利于C/C++ Coding~ 一.主题设置 工具 → 扩展和更新 下载插件 Color Theme Editor for Visual Studio ...
- Python *Mix_w6
is 和 == 小数据池 python中有两个数据类型存在小数据池:数字int范围 -5 ~ 256 字符串中如果有特殊字符+ - * / @ 等等,他们的内存地址就可能不一样 字符串中单个*20以内 ...
- python 多个脚本
1.增删改查haproxy.conf配置文件 1.查询输入:www.oldboy1.com 2.删除输入:{'backend': 'www.oldboy2.org','record':{'server ...
- chrome扩展应用实例
chrome extensions 基本组成,唯一必要的文件就是manifest.json这个应用的配置清单 manifest.json中前三个参数为必要参数,其他的可选: { "name ...
- leetcode python 011
####给定n个非负整数a1,a2,...,an,其中每个表示坐标(i,ai)处的点.##绘制n条垂直线,使得线i的两个端点位于(i,ai)和(i,0).##找到两条线,它们与x轴一起形成一个容器,这 ...
- LeetCode 46 全排列
题目: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3 ...