使用Pyarmor加密、混淆Django项目源码再使用PyInstaller打包
2024 年 12 月 24 日更新:
完善 Linux 环境下的混淆与部署。
Pyarmor、PyInstaller简介
PyArmor 是一个用于保护 Python 脚本的工具,旨在防止源代码被反编译或未经授权的访问。它通过对 Python 文件进行加密和混淆,增强了代码的安全性,特别适合在分发和部署 Python 应用程序时保护核心逻辑。
PyInstaller 是一个将 Python 程序打包为独立可执行文件的工具。通过 PyInstaller,我们可以将 Python 脚本打包成无需安装 Python 解释器即可运行的程序,这对于分发 Python 应用非常有用。
自然而然,先使用 PyArmor 对 Python 项目进行加密和混淆,保护代码逻辑免遭反编译或未经授权的修改,然后再通过 PyInstaller 将加密后的项目打包为独立的可执行文件,这是一种双重保护代码资产并便于分发应用的有效方法。
使用 Pyarmor 加密、混淆 Django 项目
使用 Pyarmor-webui 加密项目
Pyarmor 官方手册:
Pyarmor-webui Github 地址:
首先安装 Pyarmor 和 Pyarmor-webui。
PyArmor-WebUI 是 PyArmor 的一个基于 Web 的图形用户界面工具。它为用户提供了一种更加直观和便捷的方式,来管理 PyArmor 的加密、混淆以及代码保护操作,而无需使用命令行。这特别适合不熟悉命令行工具的开发者或需要更高效率的用户。
1 |
|
该代码升级指定的包到最新版本,或
1 |
|
安装完成后在命令行输入:
1 |
|
该命令还有一些常用参数:
-h
,-help
- 显示帮助信息
--port
- 指定 Web UI 启动时使用的端口号
--host
- 指定 Web UI 的主机名,默认为
127.0.0.1
只允许本地主机上服务,绑定为0.0.0.0
允许任何 IP 访问。
打开图形化界面。
页面端口默认为
9096,右上角English
可以切换语言为简体中文。
点击
我的工程
->创建
修改工程
类型
(这里建议选择加密工程中的所有脚本,直接选择打包会出现奇怪错误Command '['D:\\ProgramData\anaconda3\envs\\prodfm backend\\python.exe','-m','Pylnstaller','--clean',--workpath','.pyarmor\\pack\\build','api_doc_img.spec']'returned non-zero exit status 1.
,这里只加密,后面手动进行打包)修改
源路径
,即需要打包的 Django 项目排除路径
,即不需要加密或混淆处理的文件或文件夹。输出
、加密模式
、高级选项
可根据需要进行设置。点击
构建(调试)
,便可以加密项目,如果遇到错误能够输出报错内容。 如无问题,会把加密后的代码保存到源路径的dist
文件夹下。加密后生产的文件夹:
加密之后就是正常的 Django 项目,在 PyCharm 里打开命令行,切换到 dist 目录,可以使用命令:
1 |
|
可以成功运行加密后的项目。
到此,加密的步骤已经完成。
使用 PyInstaller 打包项目
PyInstaller 官方文档:
安装 PyInstaller:
1 |
|
安装完成后运行:
1 |
|
其中,manage.py
是项目的入口脚本。
该命令会创建一个 manage.spec
文件,用于后面构建 Django
项目,后续我们需要编辑该文件。
接着我们运行:
1 |
|
该代码用于打包项目:
图上是说明打包后保存的 dist
路径不为空,是否需要移除,输入y
即可。
如果部署在 Windows 环境下,输入代码:
1 |
|
如果部署在 Linux 环境下,输入代码:
1 |
|
如果不添加--noreload
,可能会有莫名报错:
1 |
|
--noreload
的作用:禁用 Django
开发服务器的自动重载功能。
然后不出所料,应该会遇到各种的ModuleNotFoundError: No module named 'XXX'
,这是因为在打包的时候,PyInstaller
自动依赖检测工具可能漏掉了一些动态导入的模块或子模块,这个时候我们需要手动添加上去。
打开之前的manage.spec
文件,编辑其中的hiddenimports
字段,把没导入的模块手动添加上去,然后再运行pyinstaller manage.spec
重新构建项目,然后再运行manage.exe runserver --noreload
重新运行项目,这个时候还可能会出现ModuleNotFoundError: No module named 'XXX'
问题,那么需要重复手动添加模块,直到可以正常运行,下图是我多次尝试手动添加的结果:
顺利的话,多次尝试之后最终可以顺利运行:
需要注意的是,打包的 Django 项目建议是纯后端项目,不建议携带网页以及各种静态 CSS、JS 资源,否则可能会出现加载不出来网页和静态资源找不到的问题(如打开 rest_framework 的相关默认页面)。