目录
一. 背景介绍
二. Pyarmor库介绍
核心功能
典型使用场景
三. Pyarmor许可证购买
四. Pyarmor许可证激活
1.安装
2.激活
五. 使用Pyarmor对项目源码加密
1.项目源码架构
2.如何进行加密
3.加密后的使用
4.加密过程中遇到的问题
六. 总结
一. 背景介绍
在正式开始之前先对项目背景做一个简单介绍。
首先,为什么要对项目源码进行加密;由于该项目产品本身就是一个还没量产的项目,且该工具是本地自研开发的一个功能,后期项目可能要交给下游客户使用,所以领导层决定对项目进行一些加密工作,也就是说发布工具时不要包含源码。
其实做测试开发这几年来开发的工具基本都是公司内部使用,或者分公司使用,也不涉及到保密问题,所以对于python源码加密这个领域不是非常熟悉。
需求确定以后,那么就开始寻找合适的加密工具。问了一下Deepseek将常见的几种加密方式列了一下,根据我的项目需要它主推pyinstaller和pyarmor两个库。
关于pyinstaller我之前用过一次,整体使用起来很好用,但是缺点就是打包成.exe后文件很大(需要把python安装包以及依赖的库集成进去)
所以这次我选择使用pyarmor库,因为pyarmor对源码混淆加密后仍然以.py的文件格式存在,这样就便于我后续调用。
二. Pyarmor库介绍
使用之前必须先了解pyarmor是什么?以及它的工作原理,在这一点上还是有必要花点时间的
pyarmor中文是护盾,护甲,盔甲的意思,由此可知该库的主要作用是源码的安全防护。
pyarmor Github地址:https://github.com/dashingsoft/pyarmor
以下是我总结的几点:
PyArmor 是一个用于 保护 Python 脚本 的工具,通过对 Python 代码进行混淆(Obfuscation)和加密(Encryption),防止代码被直接反编译或篡改。它常用于保护商业软件或闭源项目的知识产权。
该软件作者还是个中国人,而且此人还是pyinstaller的开发成员之一,此时不由得竖起大拇指!
此乃吾辈学习榜样啊!!哈哈
核心功能
代码混淆
重命名变量、函数、类名,使代码难以阅读。
打乱代码结构,删除注释和空行。
代码加密
许可证控制
绑定脚本到特定设备、IP 或时间限制。
生成试用版或分时段授权的脚本。
典型使用场景
分发商业 Python 工具但需保护源码。
防止用户篡改关键逻辑(如许可证验证)。
限制脚本只能在特定环境运行
这里是pyarmor官方文档中文版:https://pyarmor.readthedocs.io/zh/latest/index.html
初次使用pyarmor多少会遇到些问题,与其浪费很多时间去解决问题,不如一开始多花几十分钟仔细阅读文档,因为官方文档能解决你遇到的90%问题。
pyarmor分为免费版和付费版,对比如下:
而且免费版对要混淆加密的代码行数也有限制,好像超过1000行时加密不了。 所以就涉及许可证购买。
不同版本许可证区别如下:
不同版本许可证的价格如下:
经过仔细分析官方文档,于我而言基础版(298元)的许可证就够用了,以下都是基于基础版许可证的操作步骤。
三. Pyarmor许可证购买
官方文档中已经有了购买地址,为了节省大家时间,特此贴上购买链接:
pyarmor许可证购买地址:https://pyarmor.dashingsoft.com/cart/order.html
购买成功几分钟后邮箱会收到购买成功邮件(含许可证激活码),大概下面这个样子
邮件中也会附有许可证的激活步骤,下面来逐一介绍。
四. Pyarmor许可证激活
Pyarmor 基础版 许可证的激活步骤:Pyarmor 基础版 许可证的激活步骤:
1.安装
pip install -U pyarmor # 在cmd中通过此命令安装pyarmor库 pyarmor -v #通过此命令来查看pyarmor版本号,并确认 Pyarmor 的版本大于 9.0
2.激活
首先下载邮件的附件并保存为 "pyarmor-regcode-91xx.txt";然后cmd指令进入刚才附件保存的路径,输入如下指令:
pyarmor reg -p "XXX" pyarmor-regcode-91xx.txt
注意:
1.请替换 "XXX" 为真实的产品名称或者 "non-profits" (仅当用于加密非商业化的脚本)
2.pyarmor-regcode-91xx.txt是我附件的名称,具体根据你的附件名称来
3.激活成功
激活成功之后,会在当前目录生成许可证的注册文件 "pyarmor-regfile-9166.zip" 重要说明 * 请妥善保管和备份激活文本 "pyarmor-regcode-9166.txt" ,但是不要再继续用它来注册 Pyarmor * 请妥善保管和备份注册文件 "pyarmor-regfile-9166.zip" ,Pyarmor 开发组不提供找回服务 * 使用注册文件 "pyarmor-regfile-9166.zip" 在所有构建设备上注册 Pyarmor * 请勿使用此注册文件在 Docker 容器或者 CI/CD 管线环境中
五. 使用Pyarmor对项目源码加密
1.项目源码架构
我的项目代码简化后大概是这个样子(实际上比图中复杂很多),仅供参考
my_project/ ├── library/ │ ├── testware/ │ │ ├── function1.py │ │ └── function2.py │ ├── utils/ │ │ ├── helper.py │ │ └── common.py │ └── drivers/ │ └── function01.py ├── setup/ │ ├── setup.bat │ └── requirements.txt ├── config.yaml └── README.md
2.如何进行加密
CMD进入到my_project文件夹输入如下指令:
pyarmor gen -O dist -r -i library/
gen:是generate缩写
-O: 是Output缩写
dist: 是混淆加密后的文件存放的目标地址
-r : 是recursion的缩写,是递归的意思,用于将library中的subfolder中文件全部混淆加密
-i : 是internal缩写,会把运行辅助包保存到包目录内部
该指令运行成功后如图所示:
此时项目根目录下会生成一个名为dist的文件夹,里面存放的是加密后的libray,libray中还会生成一个pyarmor_runtime_xxxx的package,这个包就是运行辅助包
辅助包内容如下:
此时混淆加密后的其他.py文件变成了如下内容:
由此可见所有的源码都被混淆加密成了十六进制数据,从而一定程度上隐藏的源码。
pyarmor的优点就是混淆加密后的源码仍然以原文件名,原格式存在,这样一来对于外部调用就显得非常友好!
3.加密后的使用
混淆加密后的.py文件如何使用呢?很简单,可以直接把dist 下面的 library 直接copy到项目根目录替换原有的 library 即可。
此时如果想调用执行某一个加密后的.py文件,仍然可以像原来那样调用,比如直接在cmd中输入:
python -m library.testware.xxx_testing
跟混淆加密前的调用一模一样! 是不是很惊喜?
4.加密过程中遇到的问题
新手初次使用pyarmor难免会遇到一些问题,我也不例外;下面是我遇到过的问题:
问题1: 加密过程中报错:ERROR out of license
原因: 免费版对加密的代码行数有限制,超过1000行加密失败(我的部分.py文件中代码行数超过1000行),
解决方案:需要购买许可证(根据个人需求)
问题2:运行加密后的.py文件报错:ImportError: attempted relative import with no known parent package
原因:from .pyarmor_runtime_000000 import __pyarmor__
解决方案:不要使用 -i 或者 --prefix 去加密脚本
下面是常见问题的汇总,仔细阅读该文档能解决你90%的问题:
3.5. 错误消息 — Pyarmor 9.0.8 文档
六. 总结
总体而言pyarmor还是很好用的,对于我来说很符合我的需求,不仅对源码有一定的保护作用,还能保持原有的文件格式,而且使用起来也相对简单。要说缺点嘛? 那就是稍微进阶一点的功能就需要付费,不过也完全可以理解,毕竟知识付费的年代!
如果你也想使用pyarmor库对项目源码进行混淆加密,那么我只有一个建议:
深入阅读并理解官方文档,因为不会读文档的RD不是一位合格的RD!!!
《完》