如何保护 python 的源代码?
举个栗子:张三将自己的编写的一个python文件发给了李四,张三希望李四能够正常使用这个文件(可以直接通过标准python解释器执行,或者可以被其他python文件调用),但张三不希望李四看到这个python文件的源代码。
在阅读本文讨论的源代码加密之前,有以下内容需要注意:
- Python是FLOSS(自由/开放源码软件)之一,因此加密python的源代码不符合FLOSS的理念
- 不存在任何技术手段可以完全阻止用户阅读你的代码,但可以通过技术手段使得用户获得可阅读代码的成本更高
- 本文所讨论的代码加密仅仅是一个简单的保护机制,但如果遇到顶级黑客,或许他们甚至会访问内存来查看源码
- 使用法律、商业手段会比技术手段更加有效,例如软件使用许可证、SaaS等
为了理解python代码加密的基本原理,首先来了解下python的文件格式。
python源代码
这个大家都知道,不做过多阐述。这里着重介绍下Python代码的执行。
Python 代码的执行过程和 Java 类似:
- 将文件编译得到 Python 的字节码
- Python 虚拟机(Python Virtual Machine) 执行编译好的字节码
Python 虚拟机和 Java 的 JVM 类似,但 Python虚拟机的抽象化程度更高(但不是性能更强)
编译得到的字节码文件
- 在首次导入一个python库的时候,为了让以后再次导入更方便也更快,python会构建一个包含该库的字节码文件
你可以在你的库文件的文件夹下看到每个文件对应的文件
编译优化后得到的字节码文件
- Python 3.5之前将文件通过优化器()创建的文件,可以略微提升加载速度
- Python 3.5 之后已经取消了文件的概念,优化后的文件也会以文件存储
- 从或文件中读取程序比从文件中读取得更快,但只是优化了加载速度,不会优化运行速度
可被Python调用的Windows DLL文件
- 基本的Windows DLL文件,是Python的动态链接库
- 并非从python代码生成,而是其他语言写成的可以被Python调用的Windows DLL文件,例如C++
- 关于Windows DLL文件的介绍可以参看 Microsoft-什么是DLL?
直接运行结果如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ow9vojcX-1598969435142)(C:UsersMagfinAppDataRoamingTypora ypora-user-imagesimage-20200722154551869.png)]](https://www.mushiming.com/uploads/202410/28/f1c15bc7abe71e92.png)
最基础的加密方法是利用 Python 自带的编译器将源代码文件 编译得到的二进制的字节码文件。
二进制的字节码文件对于初学者而言有一定的代码隐藏作用,但也只能简单隐藏。
在命令行中输入如下代码可以得到文件:
在目录下可以看到字节码文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9xAB0BE-1598969435148)(C:UsersMagfinAppDataRoamingTypora ypora-user-imagesimage-20200722160307492.png)]](https://www.mushiming.com/uploads/202410/28/45551099be83248f.png)
字节码文件可以在别的Python文件中导入使用,也可以直接执行。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J3R8dC8u-1598969435155)(C:UsersMagfinAppDataRoamingTypora ypora-user-imagesimage-20200722160926582.png)]](https://www.mushiming.com/uploads/202410/28/4bf6e0bc2067ebf0.png)
如果要对多个文件或整个项目进行编译,可以使用Python标准库中的库。
但是字节码文件极易被反编译得到源代码。
推荐一个反编译库,可以直接使用 Pip 安装:
在命令行中运行反编译命令:
反编译得到的文件如下:
可以看到和原始代码基本没有区别,所以的加密方式基本相当于裸奔。
对于代码加密,我们可以换个思路:我们可以暴露代码,但是只要你看不懂我的代码,也就无法使用我的代码了。
代码混淆可以使用库,
安装:
使用:
对于单个文件,会直接输出混淆后的代码:
这样混淆的代码可读性变得极差,然而即便如此,还是不难看出代码内部中的逻辑,通过变量名替换等方法还是可以看出其大致的逻辑。
结果:
这样得到的代码完全看不出原来的逻辑,但是Base64非常容易被反编译,因此加密效果还是有限的。
可以考虑将上诉两者混淆方法结合起来,这样可以进一步增大代码的混淆程度。
是一个编程语言,它通过类似Python的语法来编写C扩展并可以被Python调用。能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库。基于它的原理,我们可以得到一种代码加密的思路:将 / 编译为 文件,再将 文件编译为 (Unix) 或 (Windows),这样得到的文件更难反编译。
注意:Windows环境下使用该库可能需要配置Microsoft Visual C++相关库
推荐一个库,该库能够一键完成上诉流程。
安装:
使用:
在文件夹下得到文件
可以在Python文件中导入,并使用其中的方法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxKDNCgj-1598969435161)(C:UsersMagfinAppDataRoamingTypora ypora-user-imagesimage-20200722170908630.png)]](https://www.mushiming.com/uploads/202410/28/7b176ba0656b7e44.png)
关于这种加密方法的安全性,笔者目前尚未发现能将/文件直接反编译为的方法,因此较为可靠。
经过多番搜索,笔者找到了一个比较完善的Python脚本加密方案:
能够加密 Python 脚本,同时还具备以下功能:
- 设置加密脚本的有效期限
- 绑定加密脚本到硬盘、网卡等硬件设备
的加密原理比较复杂,在此不做阐述,感兴趣的可以直接查看他的官方文档。的开发者为中国人,因此文档也是中文,查看起来还是比较方便的。
特别注意
是一个共享软件,试用版免费但存在功能限制(主要是加密代码不能超过 32 MB),完整版的授权价格为 286.00 人民币。
详细的软件许可说明可以参看Pyarmor软件许可
接下来展示的使用。
Pyarmor 的基础使用
安装:
基础使用 加密代码:
在输出目录文件夹下可以看到加密后的脚本,代码内容如下:
除了加密脚本之外,额外的那个目录 叫做 运行辅助包 ,它是运行加密脚本不可缺少的。
脚本可以直接运行:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVSECAb4-1598969435165)(C:UsersMagfinAppDataRoamingTypora ypora-user-imagesimage-20200723174239163.png)]](https://www.mushiming.com/uploads/202410/28/56db830c5dae496e.png)
也可以导入到别的脚本中:

如果需要分享代码的话,需要将目录下的全部文件都发送过去,对方无需安装库。
Pyarmor 的进阶使用
加密脚本的同时会在输出目录下面生成一个默认许可文件 ,它 允许加密脚本运行在任何设备上并且永不过期。
可以根据需求生成指定有效日期、主机MAC地址、硬盘编号甚至是Docker容器ID的许可文件。
生成有效日期到 2020-07-22 的许可文件:、
执行这条命令 会生成一个带有效期的认证文件:
- 创建 ,保存在
- 创建 ,保存在
然后将许可文件文件复制到目录下,替换原来的。
这样,加密脚本在2020年7月22日之后就无法在运行了,比如现在就无法执行了。
执行这条命令 会生成一个带有效期的认证文件:
- 创建 ,保存在
- 创建 ,保存在
然后将许可文件文件复制到目录下,替换原来的。
这样,加密脚本在2020年7月22日之后就无法在运行了,比如现在就无法执行了。
未完待续…
如有帮助,欢迎点赞/转载~
(听说给文章点赞的人代码bug特别少👀)
联系邮箱:
个人公众号:禅与电脑维修艺术
欢迎关注公众号,也欢迎通过邮箱交流。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/11312.html