Python代码加密方案
Python代码加密方案
方案1:使用Pyarmor工具进行加密
PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑定加密后的Python源代码到硬盘、网卡等硬件设备。
1、安装
pip install pyarmor# 验证是否安装成功, 7.0 以下版本为稳定版
pyarmor --version
2、加密过程
首先把源代码编译成代码块
char *filename = "foo.py"; char *source = read_file( filename ); PyCodeObject *co = Py_CompileString( source, "<frozen foo>", Py_file_input );
接着进行如下处理
使用 try…finally 语句把代码块的代码段 co_code 包裹起来
新添加一个头部,对应于 try 语句:LOAD_GLOBALS N (__armor_enter__) N = length of co_constsCALL_FUNCTION 0POP_TOPSETUP_FINALLY X (jump to wrap footer) X = size of original byte code接着是处理过的原始代码段:对于所有的绝对跳转指令,操作数增加头部字节数加密修改过的所有指令代码...追加一个尾部,对应于 finally 块:LOAD_GLOBALS N + 1 (__armor_exit__)CALL_FUNCTION 0POP_TOPEND_FINALLY
添加字符串名称 __armor_enter, __armor_exit__ 到 co_consts
如果 co_stacksize 小于 4,那么设置为 4
在 co_flags 设置自定义的标志位 CO_OBFUSCAED (0x80000000)
按照上面的方式递归修改 co_consts 中的所有类型为代码块的常量
然后把改装后的代码块转换成为字符串,把字符串进行加密,保护其中的常量和字符串
char *string_code = marshal.dumps( co ); char *obfuscated_code = obfuscate_algorithm( string_code );
最后生成加密后的脚本,写入到磁盘文件
sprintf( buf, "__pyarmor__(__name__, __file__, b'%s')", obfuscated_code ); save_file( "dist/foo.py", buf );
3、加密模式
PyArmor 提供多种加密模式,以满足安全和性能方面的平衡。通常情况下,默认 的加密模式能够满足绝大多数的需要,一般情况下也不需要对加密模式有详细 的了解。仅当对性能有特别的要求或者默认加密模式无法满足需求的时候,才需 要改变加密模式,这就需要理解 PyArmor 的不同加密模式。
默认加密模式
加密脚本命令
pyarmor obfuscate xx.py
超级模式
目前支持版本
python 2.7
python 3.7
加密脚本命令
pyarmor obfuscate --advanced 2 xx.py
高级模式
加密脚本命令
pyarmor obfuscate --advanced 1 xx.py
其他加密模式(不常用)
代码加密模式
代码包裹模式
模块加密模式
约束模式
4、使用pyarmor
加密脚本
pyarmor [command] [options]
常用命令:pyarmor obfuscate main.py
pyarmor会加密main.py文件和相同目录下的所有*.py文件,并创建输出子目录dist, 生成加密的主脚本main,py、相同目录下的**.py、生成的运行加密脚本所需的全部辅助文件保存到dis输出目录
发布加密脚本
发布加密脚本给客户只需要把输出路径dist的所有文件拷贝过去即可
生成新的许可文件(可选)
使用命令 licenses为加密脚本生成新的许可文件license.lic,加密脚本的同时会在输出目录下面生成一个默认许可文件,dist/licnese.lic,需要生成新的许可文件,并覆盖默认许可文件
例如:
pyarmor licneses --expired 2019 -01-01 code-001
执行该命令会生成一个带有效期的认证文件,这样超过指定日期后加密脚本就无法正常运行了
绑定加密脚本到固定机器上(可选)
如果想绑定加密脚本到固定机器上,首先在该机器上面运行下面的命令获取硬件信息
pyarmor hdinfo
然后生成绑定到固定机器的许可文件
pyarmor licenses --bind-disk “100304PBN2081SF3NJ5T” --bind-mac “20:c1:d2:2f:a0:96” code-002,
同样,覆盖默认的许可证,这样加密脚本就只能在指定机器上运行
6、命令手册
点击查看
7、优缺点
优点
使用方便,加密脚本较快且能一键加密,操作较简单
多种加密模式,满足常规绝大多数的加密要求
有文档支持,对于常见的错误异常可以通过查阅官方文档解决
支持其他功能,例如,检查加密脚本的性能、交叉保护机制
可以设置加密文件有效期及绑定在固定机器上
缺点
每个大的版本的改动比较大,安装时需要查看官方文档选用合适的版本进行安装
个别版本交叉发布时脚本无法运行,具体查看官方文档
安装python版本时需要开启静态库的共享进行安装,否则会无法加密文件
运行加密文件时的python版需要和加密时的python版本一致
pyarmor安装的默认是试用版,对加密文件的大小、模块的函数个数等都有限制,用于商业时需要单独购买
方案2:使用cython进行加密
1、安装
pip install cython
2、加密过程
利用Cython将.py文件编译为.c文件
将.c文件编译为为.so或.pyd文件,linux系统为.so文件,Windows系统为.pyd文件
3、使用Cython
创建setup.py加密指定的python文件
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize(["main.py"], language_level=3)
4、简化Cython加密过程
jmpy3为python的一个第三方库,能够将python代码一键加密为.so或者.pyd文件,支持单个文件加密,整个项目加密,加密后会在项目目录中增加一个dist的文件夹,把源文件替换为加密后的文件即可正常运行
安装
pip install jmpy3
切换到项目所在目录,执行以下命令
jmpy -i 项目名称
发布加密脚本
同样加密后会在项目目录中增加一个dist的文件夹,把源文件替换为加密后的文件即可正常运行
5、优缺点
优点
通过jmpy3可以实现一键加密,加密较为方便
加密后代码运行效率有所提升
生成.so或.pyd文件难以破解
缺点
兼容性稍差,对于不同的版本的操作系统,需要重新编译
运行加密文件时的python版需要和加密时的python版本一致
没有官方文档,使用加密后的代码出错后,需要自己排查解决错误
Python代码加密方案相关推荐
- 如何防止你的代码被窃取?Python代码加密方案汇总(带实例验证)
Python代码加密方案汇总 文章目录 Python代码加密方案汇总 需求描述 基础:Python文件格式 `.py` python源代码 `.pyc` 编译得到的字节码文件 `.pyo` 编译优化后 ...
- Python代码加密:py文件转pyd文件
目前使用python语言比较多,尤其是深度学习项目,但是使用python加密比较麻烦,前期接触过几种加密的方案,但是效果都不理想,现在有一种思路比较靠谱:python原文件转pyd,然后用加密狗加密p ...
- Python代码加密混淆
python作为一种解释型语言,源代码加密本身比较困难.但有时候我们在发布一款python产品时又必须考虑到代码的加密性,以避免源代码泄露.为此,我查阅了一些资料,研究了几种python代码加密的常见 ...
- 【python】python代码加密与License控制
背景 在一些使用python的商业项目上,开发人员不想被用户看到源代码时,就需要对python代码进行加密:进一步地,如果想限制用户只能在获得授权的机器上运行你写的代码时(利益相关),就需要使用Lic ...
- python代码加密--pyinstaller
python代码加密需要安装pyinstaller 包 不同系统安装方法 一.windows环境下: 1.安装pyinstaller pip install pyinstaller==3.6.0 2. ...
- python 代码加密
Python代码加密步骤 1.准备文件 main.py为要加密的主脚本 import sys from PyQt5.QtWidgets import QApplication, QWidgetdef ...
- python代码加密解密_在python中加密 – 在Javascript中解密
您的Python代码和CryptoJS代码存在许多问题: >您使用随机IV加密Python中的一些明文.如果要检索该明文,则需要在解密期间使用相同的IV.没有IV,明文就无法恢复.通常,IV只是 ...
- python代码加密 混淆_Python程序的混淆和加密
混淆 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. 如果你觉得有用, 可以购买离线版本. 同时需要注意的是, 这个混淆其实还是被很多人怀疑的, 因为即使混淆了 ...
- python代码加密cython_利用Cython加密python脚本
由于 Python 的动态特性和开源特点,导致 Python 代码很难做到很好的加密.社区中的一些声音认为这样的限制是事实,应该通过法律手段而不是加密源码达到商业保护的目的:而还有一些声音则是不论如何 ...
最新文章
- 新技能 MyBatis 千万数据表,快速分页!
- 使用XML作为配置表,WinForm程序读取配置表来动态显示控件
- Install ArchLinux on SSD
- leetcode算法题--最大平均值和的分组★
- wide_and_deep 思维导图和代码
- mysql中存储引擎是啥_mysql中的存储引擎
- java高级教程_高级Java教程
- JavaWeb学习总结(1-53)
- nginx负载均衡 加权轮询和ip_hash
- Hive什么时候可以用别名?
- 堆栈和内存分配[转]
- Linux 中断下半部
- 用Excel 公式求 金额的差额
- python——问题解决:读取excel文件字符串,写入txt时乱码
- gridview 排序
- 大数据应用能力层次模型
- pandas将df赋值到另一个df_pandas基础
- 使用wps的邮件合并和文档附件制作以照片形式的准考证
- 神经元细胞属于什么细胞,人体有多少神经元细胞
- 使用BootStrap.编写网页
热门文章
- 计算机上没有office2010,电脑装上office2010后,新建里面没有,该怎么处理
- impress.js_与Impress.js和Impressr同步基于Web的演示幻灯片[Quicktip]
- 微信小程序 canvas 卡顿 闪退
- 硬盘对拷速度很慢是什么原因该如何解决?
- 隐形的翅膀 vijos_1237 (离散)
- 达梦数据库 网络通信异常 6001
- 算法问题: 为啥idea的全局搜索这么快?idea的冗余代码检测怎么实现的?
- 投影串口测试程序_小弟求大侠写个模拟程序,投影机RS232串口开机关机程序?...
- 360浏览器的收藏夹隐藏了,怎么处理?
- android仿ios菊花,简易仿ios菊花加载loading图