Python代码保护

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版本和环境有依赖),不需要再使用源代码。