Python等解释性脚本语言都需要源码明文存储,所以有两种情况需要考虑代码保护的问题:
- 代码逻辑的保护:代码本身有版权或者不能公开源代码
- 涉及用户名、密码等关键信息的配置
代码保护方法
Python代码保护往往采用以下方法,但每个方法都有利有弊,需要时保护级别和要求来选择。
-
发布pyc文件
和java的class文件类似,反编译异常简单,和发布源吗基本无区别。
-
代码混淆
利用oxyry或pyobfuscate等工具混淆代码,参考混淆的结果往往效果一般,只是降低了代码的可读性,但代码逻辑和文本信息等仍旧可以看到。
-
利用py2bin或py2exe发布二进制文件
可选方法,需要借助第三方工具打包成二进制文件,多文件依赖时效果一般。
源文件的文本信息预计无法加密。
-
利用Cython
利用Cython把python代码处理成库文件(.so文件)可以有效的保护代码逻辑,但源文件中的文本信息无法加密。
-
解释器加壳自定义加密解密算法
开发成本高,也不利于发布。对于加密要求很高的项目建议采取此方案。
Cython方案
由于我的需求是保护用户名和密码,对代码逻辑本身没有强保密要求。虽然用户名、密码等数据应该使用数据加密的方法,但由于一般需要明文存储,还需要第三方发布或使用,因此为了简化,会直接写入代码。考虑这种不常见的需求,决定采用Cython方案,专门编写一个用户名密码的记录库,通过代码级混淆外加Cython抗反编译来完成。这样做的好处是,所有的python脚本都可以方便的使用。
使用Cython需要先利用pip安装Cython模块:
pip install Cython
加入你要编译的文件是hello.py,其中发布一个函数say(),编写setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(name='Hello',
ext_modules=cythonize('hello.py'))
然后执行:
python setup.py build_ext --inplace
即可生成hello.***.so的python模块文件,在其他python文件中直接可以使用(确保在sys.path路径中可以找到这个so文件):
import hello
hello.say()
发布时只需要发布这个so文件即可(注意对python版本和环境有依赖),不需要再使用源代码。