当前位置: 首页 > 互联网, 大杂烩, 系统安全 > 正文

使用Cython编译Python项目的关键类库达到保护源码的目的

如何保护解释性语言的源码呢,比如python,毕竟Python编译过的pyc很容易被人反编译回来,这里尝试了下Cython,使用方便、加密效果还可以。当然没有绝对的安全,使用Cython可以对某些关键的类库进行编译处理,然后再其他地方可以调用里面的函数,下面是我简单测试:

Cython 是 Python 编程语言和扩展 Cython 编程语言(基于 Pyrex)的静态编译器。可以保护Pyhton源码和提高代码执行效率。
Cython官网
Cython文档:

我是在MAC下测试的,使用的Python-3.6.1
(1)使用Pip3安装Cython:

 ~sudops.com>/ pip3 install Cython
Collecting Cython
  Downloading Cython-0.26.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.
  macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.6MB)
    100% |████████████████████████████████| 4.6MB 161kB/s
Installing collected packages: Cython
Successfully installed Cython-0.26.1

(2)编写需要被编译的python代码/函数

 ~sudops.com>/ cat helloworld.py
def hello(name):
    print("Hello %s!" % name)

(3)Cython编译所需要的setup.py文件

 ~sudops.com>/ cat setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(
  name = 'Hello world app',
  ext_modules = cythonize("helloworld.py"),
)

(4)执行Cython的编译命令:

 ~sudops.com>/ python3 setup.py build_ext --inplace
Compiling helloworld.py because it changed.
[1/1] Cythonizing helloworld.py
running build_ext
building 'helloworld' extension
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c helloworld.c -o build/temp.macosx-10.6-intel-3.6/helloworld.o
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.6/helloworld.o -o /Users/fisher/tools/helloworld.cpython-36m-darwin.so
 ~sudops.com>/

(5)现有已有四个文件,其中一个为编译好的so文件
helloworld.py setup.py helloworld.c helloworld.cpython-36m-darwin.so

(6)创建一个调用so文件的pyhton文件,测试编译后的so是否正常工作:

 ~sudops.com>/ cat run.py
from helloworld import hello
hello('sudops.com ')
	
运行:
 ~sudops.com>/ python3 run.py
Hello sudops.com !

现在已经看到了 python3 run.py 这个脚本已经可以正确的调用helloworld.cpython-36m-darwin.so中的函数。

现在我们来看看编译好的 helloworld.cpython-36m-darwin.so 文件是什么样子的:
(1)Mac下使用VIM查看:

(2)使用Sublime以16进制打开

乍一看,看不出是什么东东,仔细看还不如乍一看? :)

总结一下:可以针对项目本身的实际情况对重要的函数进行编译,其他非核心的可以直接使用pyhton,而不需要全部进行编译。

另外您要是说即使是编译好了.so文件,还不是可以根据其他代码中的函数调用关系知道编译好的模块具有的功能吗?这样只需要修改前端显示部分,核心还是使用so里面的也相当于代码被盗了啊! 这个回答是肯定的,当然您可以对全部代码使用Cython进行编译,但这样也并非完全安全,因为绝对的安全是不存在的。

本文固定链接: https://sudops.com/use-cython-complie-python-to-protect-source-code.html | 运维速度

该日志由 u2 于2017年09月19日发表在 互联网, 大杂烩, 系统安全 分类下,
原创文章转载请注明: 使用Cython编译Python项目的关键类库达到保护源码的目的 | 运维速度
关键字: ,

报歉!评论已关闭.