Python code 保护(一)
(一)初衷
Python优点很多,比如简单易学,代码量少,能做的事很多等等,和其他语言一样,Pyhton也有一些不可掩盖的缺点,版本不兼容,运行效率不高等等。
其中一个缺点,让不少开发者头疼不已,由于Python解释器开源的关系,导致Python代码无法加密,代码的安全性得不到保障。
(二)加密方式
主流的加密方式主要有使用字节码、创建可执行文件、使用Cython和代码混肴的方式
###1)使用字节码
Python解释器在执行代码的过程中,会首先生成.pyc文件,然后再解释执行.pyc中的内容,当然,解释器也能直接执行.pyc文件。
.pyc文件是一个二进制的文件,是不具备可读性的。
假如我们发到客户环境时,是.pyc文件,而不是.py,那么是不是就可以保护我们的Python代码?
想要做到这一点,并不难。Python标准库就提供了一个名叫compileall的库,使用它就可以做到。
####优缺点:
- 简单方便,提高了一定的破解门槛
- 兼容性不好,不同的Python版本之间不能进行移植
- 有现成的反编译软件Free Software Foundation site 可以破解,破解成本低
###2)使用可执行文件
通过pyInstall和py2exe等工具,将python代码和解释器嵌入到一个可执行文件中
#####优缺点: - 打包的可执行文件方便分发和执行,不依赖执行环境的python,相比.pyc门槛较高
- 只能生成.exe文件,兼容性差
- 生成的文件较大
###使用Cython
将py/pyx编译成.c文件再将文件编译成.so(Unix)或者.pyd(Windows).可以有效的提升性能并且可以加密。
- 创建.py文件
- 编写setup.py
from distutils.core inport setup
from Cython.Build import cythonize
setup(name="hello HIK",
ext_modules=cythonize(main.py))
- 编译成c,再进一步编译为.so或者是.pyd
python setup.py build_ext --inplance
–inplance 表示将.so创建在当前目录
执行python -c "from hello import hello()"
即可直接引用盛恒的二进制文件中的hello()函数。
####优缺点:
- 破解相对困难,并且有一定的性能提升
- 不同的操作系统需要重新编译,兼容性不好
- 不同的python版本也需要重新编译
- 只能针对单个的文件加密,不能够进行联级加密
###代码混淆:
代码混淆,也是一种常见的“加密”方式,严格意义上说,这一方法并不是加密,而是上代码的可读性变差。比如删除注释,添加毫无意义的注释,添加无效代码,对变量、函数、类进行重命名等。
内容不可读,代码就受到了保护。
代码混淆的工具很多,一个比较好用的混淆库是pyobfuscate(GitHub - astrand/pyobfuscate: pyobfuscate)。这个库可以对类、函数进行重命名,并且插入无关的代码,甚至自动加空格等等。
这一方法很简单,也提高了破解的门槛。但由于代码结构未发生变化,字节码也能获取,破解难度也不高。
一般而言,使用这一方式较为简单,实用.
####优缺点
- 简单方便,兼容性好
- 代码结构不变,而且访问字节码,破解并不困难。