Python代码部署的三种加密方案
作者:木尧大兄弟 发布时间:2022-03-22 02:24:40
前言
最近需要源码部署一个项目,因此探索一下保护源码的方式,由简单到复杂主要总结为以下三大类:
代码混淆:主要是改变一些函数名、变量名
代码打包:思路是把Python代码打包成 .exe 的可执行文件
代码编译:思路是将Python代码编译成C,然后编译成动态链接库文件(linux的.so、windows的.dll)
一、代码混淆
代码混淆主要是改变一些函数名、变量名。可使用 Oxyry 对关键源码进行混淆,效果如下:
这种只是降低了代码可读性,严格意义上算不上是加密,不过针对足以应对一大半甲方了(哈哈哈)
二、代码打包
可以用 py2exe 或者 Nuitka 将代码打包成 exe 文件,不过只能从windows系统上运行,也可用 pyinstaller 打包,不过容易被攻破。不太符合我的需求,因此这种方式先立flag,等用到再说。
三、代码编译
这里使用 PyArmor 进行操作。这个工具能加密 Python 脚本,还能有效期限,绑定加密脚本到硬盘、网卡等硬件设备(试用版可以免费用)。
官方文档:https://pyarmor.readthedocs.io
安装:pip install pyarmor
升级:pip install --upgrade pyarmor
查看版本:pyarmor -v
基本语法:pyarmor [command] [options]
3.1 pyarmor快速使用
代码加密:执行 pyarmor obfuscate server.py
,就会把 server.py
作为入口函数且将同目录下的 py 文件加密到 ./dist
文件夹中(如果递归加密子目录下py文件可执行 pyarmor obfuscate --recursive server.py
)。加密后端的代码长这样:
对于不同操作系统,会编译生成不同格式的动态链接库文件:
生成的dist目录内容如下:
运行脚本:cd到 ./dist
文件夹正常执行 python server.py
即可(运行加密后的脚本用到 pytransform
,但不用安装 pyarmor
了)。
3.2 pyarmor进阶使用
设置过期时间:执行代码 pyarmor licenses --expired 2022-01-01 r001
,则在dist同级的当前目录生成 licenses 文件夹:
此外,如果要绑定mac地址或者硬盘,可以执行 pyarmor hdinfo
查看硬件信息,然后执行pyarmor licenses --bind-disk "xxxxxx" --bind-mac "xx:xx:xx:xx:xx:xx" r002
生成证书。
生成证书后,带上 licenses 执行加密命令:pyarmor obfuscate --with-license licenses/r001/license.lic server.py
,生成 dist 后 cd 进去再执行,如果时间过期了(或硬件不对),就会报错(此时即使删掉 licenses 文件夹也没啥用)。
参考文献:
[1] 介绍几种 Python 加密源代码的方法
[2] 使用 PyArmor(官方文档)
来源:https://blog.csdn.net/muyao987/article/details/126488384


猜你喜欢
- 对于跟我一样,自学javascript且没有其他语言学习经验的人来说,一开始的时候,javascript的调试也是一个比较大的难点,很多基础
- 前言最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下:利用套接字技术实现应用程序中对数据库的访问。应用程序只是利
- 前言最近在评估项目时,要开启评估平台,查看平台和保存平台,感觉非常繁琐,开发了一款可以获取评估平台数据,查看项目排期和直接保存数据到数据库的
- 技巧 16:如果页面需要很长时间才能完成,那么执行前使用 Response.IsClientConnected 如果用户性急,他们可能会在您
- 摘要:本篇博客将详细介绍如何使用YOLOv5进行车牌识别模型的训练与评估。我们将搭建训练环境、准备数据、配置模型参数、启动训练过程,以及使用
- oracle远程连接数据库,需要配置本地服务,具体步骤如下:1.2.添加新的服务3.输入服务名(例如:orcl3即服务器数据库名)4.选择T
- 数据库中对数据的操作是一大重要技能,其中,数据的恢复和还原也是常做的事。不知你是否在数据库恢复时遇到诸如“设备激活错误,请使用with mo
- 动机一些bug由于本地环境和线上环境的不一致可能导致本地无法复现本地依赖和线上依赖版本不一致也可以导致一些问题有时一些bug跟数据相关,本地
- Labelme简要介绍通过labelme对图进行标注后,得到的是json文件,而Yolov5对数据进行模型构建的时候,读取需要的是txt格式
- 随着访问量的增加,对于一些比较耗时的数据库读取操作,一般采用将写入与读取操作分开来缓解数据库的压力,数据库引擎一般采用Master/Slav
- 1. 问题截图:(8000端口被占用)2. 第一种是可能会打开了多个运行窗口右键关闭即可:3. 第二种是在你运行python的主机上查询出p
- datetime 时间包认识 datetime 时间包:date:日期;time:时间;所以 datetime 就是 日期与时间的结合体使用
- 在我们进行注册码的有效期验证时,通常使用获取网络时间的方式来进行比对。以下为获取网络时间的几种方式。方法一需要的时间会比较长,个别电脑上可能
- 本文实例讲述了Python中list以及list与array的相互转换实现方法。分享给大家供大家参考,具体如下:python中的list是一
- 一、日志级别1. 级别定义logging模块提供了5种日志级别,分别为:CRITICAL>ERROR>WARNING>IN
- 本文实例讲述了PHP实现登录,注册及密码修改功能的方法。分享给大家供大家参考,具体如下:这里介绍注册,登录,修改密码的界面布局与功能实现:1
- 前言这个只是使用面向对象的方法写的 构思和学生管理系统(JSON模块)是一样的file_manager.py""&quo
- pytorch中的权值初始化官方论坛对weight-initilzation的讨论torch.nn.Module.apply(fn)torc
- 楔子有几天没有更新 Python 文章了,本次我们来聊一下 Python 的集合是怎么实现的?之前我们介绍过字典的实现原理,它底层是基于哈希
- vue-cli 环境变量 process.env使用参考官网: https://cli.vuejs.org/zh/gu