参考文章:参考这篇
目前主流的Python加密方法
- 打包成
.pyc
格式 - 混淆代码
- Cython
- 使用pyinstaller
- 使用带密码的Zip文档
一、打包成.pyc格式
原理
Python在运行时,实际上是先由解释器将.py
文件生成.pyc
文件,再去执行的,这也就意味着Python是可以直接执行.pyc
文件的。由于.pyc
是二进制文件,无法直接看出源码的内容,这也就实现了源代码的加密。
优点
- 简单,方便,可以直接import
- 平台兼容性好,
.py
文件能在哪里运行,.pyc
文件就能在哪里运行
不足
- 解释器兼容性差,
.pyc
只能在特定版本的解释器上运行 - 有现成的反编译工具,破解成本低,如python-uncompyle6。
pip install uncompyle6
实现方法
Python 标准库中提供了一个名为compileall的库,可以通过命令行方便的生成.pyc
文件
执行以下命令可以遍历某个目录下的所有.py
文件,将其编译为.pyc
文件。进入到项目所在的根目录下,执行以下命令:
python -m compileall
这时你会发现,在原本的项目目录下,会生成一个新的名为pycache的文件夹,生成的.pyc
文件就在此文件夹下
编译完成后如果想要运行.pyc
文件需要注意两点
- 要把
.pyc
从pycache目录中移出来,放到原本.py
文件对应的目录下 - 修改
.pyc
文件名,生成的pyc文件的文件名一般为.cpython-37.pyc
。pyc文件可以和py文件一样用import导入,但是在此之前需要将pyc文件重命名。注意,这里的'.cpython-37'是根据你自己的python版本号生成的。
使用命令行批量修改文件名的方法请参考:
这里总结一下对单个文件和多个文件进行编译的命令
# 对单个文件
python -m py_compile <your_file>.py
# 对多个文件
python -O -m compileall -b <PY_DIR>
上述第2行命令,
<your_file>.py
是指你自己需要编译的单个.py
文件,例如main.py
上述第5行命令,可以遍历PY_DIR目录中的所有
.py
文件,并一一将其编译成为.pyc
文件。-O
表示对源码进行优化,-b
表示在同级目录下产生.pyc
文件。
二、代码混淆
原理
通过一系列转换,让代码不那么容易让人明白,比如可以采用下面的方法增加代码的阅读困难:
- 移除注释和文档
- 改变缩进
- 重命名函数、类或者变量名
- 在空白行插入无效代码
混淆后的代码如下图所示:
优点
简单方便,提高了一点源码破解门槛
兼容性好,只要源码逻辑能做到兼容,混淆代码亦能
不足
只能对单个文件混淆,无法做到多个互相有联系的源码文件的联动混淆
代码结构未发生变化,破解难度不大
实现方法
在线混淆工具:https://pyob.oxyry.com/
离线混淆工具:pyobfuscate离线工具
三、使用Cython编译
原理
Cython
的原理为:将.py
/.pyx
编译为.c
文件,再将.c
文件编译为.so
(Unix)或.pyd
(Windows)文件。它的主要目的是带来性能提升,但另一个好处就是难以破解。
优点
- 生成的二进制
.so
或.pyd
文件难以破解 - 性能提升
不足
- 不同版本的操作系统需要重新编译
实现方法
首先创建算法文件main.pyx
# 注意以下都是你自己算法的内容,此处为了举例写了一个最简单的例子。
print("Hello World")
在同一目录下创建setup.py
文件,内容如下:
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("main.pyx")
)
运行setup.py
文件,将main.pyx
编译成为.so
(Unix)或.pyd
(Windows)文件。在终端输入:
python setup.py build_ext --inplace
示例:
四、使用Pyinstaller(仅Windows平台)
原理
pyinstaller
可以将Python源码编译为.pyc
文件,加上必要的依赖文件(包括Python解释器),一起打包成一个.exe
可执行文件。
优点
能够直接打包成
.exe
,方便分发和执行。生成的.exe
可执行文件可以直接拷贝给用户运行,而用户的计算机不需要安装python环境。破解门槛比
.pyc
更高一些
不足
只能运行在Window系统上
生成的可执行文件内的布局是明确的,可以找到源码对应的
.pyc
文件,进而反编译出源码
实现方法
安装pyinstaller
:
pip install pyinstaller
进入程序所在文件目录,在终端输入:
pyinstaller -F <your_file>.py # 打包单个文件
对于pyinstaller
命令,还可以通过在命令中输入不同的参数来实现不同的打包效果,包括但不限于:
-F, –onefile # 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir # 打包多个文件,在dist中生成很多依赖文件
-w,–windowed,–noconsole # 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console # 使用控制台子系统执行(默认)(只对Windows有效)
五、使用Zip加密
原理
将算法文件使用zip命令生成加密文档后,使用第三方库ArchiveImporter进行解压及解密。
优点:
- 简单快捷,类似于我们平常使用的压缩包,输入密码才能看到里面的内容。
缺点:
- 有明文密码,在调用被加密的文件时,需要写入密码。
实现方法
假设我们现在有下面的目录结构,我们想要用zip命令加密mod.py
文件,并在主程序main.py
中将它调用成功。
.
├── mod.py # 子程序文件
├── main.py # 主程序,调用mod.py
首先我们需要使用zip命令来加密mod.py
文件,打开终端,进入根目录后,输入:
zip -P 12345 -e ./mod.pyz ./mod.py
# 其中12345是你打开此文档的密码,自己设置,一定要牢记
# 第一个./mod.pyz是指用zip加密后生成的文件名及路径
# 第二个./mod.py是指你需要加密的文件
然后下载ArchiveImporter文件,根据需要将其放在合适的文件目录下。这里为了示例,我们将其与主程序放在同一文件夹下,此时我们的目录结构变为:
.
├── mod.py # 子程序文件
├── main.py # 主程序,调用mod.py
├── ArchieveImporter.py # 第三方程序文件
最后我们需要修改main.py
文件,在算法开始前加上下面的内容:
import ArchiveImporter
ArchiveImporter.addZip("mod.pyz", "12345")
import mod
(END)