[转]使用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周前
随机推荐
- Series.str——字符串批量处理方法
针对dataframe中的某一行(或列)想做批量字符串处理时,可采用此方法 series.str.python内置的str方法 例如: series.str.replace('A','B') # ...
- ubuntu18.04.2LTS下安装和配置MySql数据库 --ubuntu
1.安装MySql ubuntu@thanlon-Ubuntu:~$ sudo apt install mysql-server 2.mysql安装完成后,默认用户名不是root,为了方便,一般我们需 ...
- Web版记账本开发记录(五)
今天是第五天,不过今天有点事什么都没做,只是看了看一些教学视频, 今天家里有事, 还没来得及实践,等明天再实践,然后再完善完善.
- input type="tel" 输入框显示密文
为了在移动端实现密码输入框且调起的键盘为数字键盘,可以用-webkit-text-security:disc;text-security:disc;属性来实现. 语法: text-security: ...
- mysql(5.5)安装后忘记密码
查看mysql安装的路径
- AngularJS +Kendo UI Grid template
var dataSource = new kendo.data.DataSource({ transport: { dataType: "json", read: inputUri ...
- 精选!15 个必备的 VSCode 插件(前端类)
精选!15 个必备的 VSCode 插件(前端类) 就像大多数 IDE 一样,VSCode 也有一个扩展和主题市场,包含了数以千计质量不同的插件.为了帮助大家挑选出值得下载的插件,我们针对性的 ...
- cout关闭输出缓冲,调试用
cout.setf(std::ios::unitbuf);
- tensorboard中show不出来数据
tensorboard中show不出来数据,可通过在命令中加入training解决,如下: tensorboard --logdir==training:model_dir
- jQ如何选中被选中的单选按钮的值
alert($("label input[name=logintpye]:checked").val());