0、前言

深度学习领域,常常用python写代码,而且是建立在一些开源框架之上,如pytorch。在实际的项目部署中,也有用conda环境和python代码去部署服务器,在这个时候,又分为两种情况。

部署方式可分为两种,一种是在线部署,算法服务器归公司所有,只开放API给客户,客户通过POST请求访问算法服务器,上传数据并得到返回结果。这种情况客户当然看不到代码。还有一种是离线部署,就是给客户私有化部署,把公司的代码放到客户的服务器上运行,这种情况下客户能够看到代码。如果是python部署的项目,就需要保护两个东西,一个是模型文件,一个是python源代码。

1、python源代码的保护

由于 Python 的动态特性和开源特点,导致 Python 代码很难做到很好的加密。在实际工程部署中,如果不想让客户看到代码,一般使用C++来部署。

可是自己把代码改成c++也太费劲了,还好python提供了转c++代码的工具cpython,代码转成c++之后,编译成.so(linux)的库文件,就完成了加密效果了。整个过程已经有人写好了响应的工具,如jumy,具体参考:GitHub - Boris-code/jmpy: python 代码加密|加固

使用之前先安装jumy

pip install jmpy3

然后找到找到项目目录,在当前打开终端,并执行下面命令就能够完成编译。

jmpy -i "xxx project dir" [-o output dir]

加密后的文件默认存储在 dist/project_name/ 下。注意工程文件夹下,凡是带有if __name__=="__main__"的只要存在都不编译,注释掉一样不编译。其他的py文件才编译。所以在使用时可以把main文件暴露出来,其他的文件都编译成了.so的库文件。

优点:.so文件为二进制文件,无法反编译出源代码,源码可以得到有效保护。

缺点:编译过程会编译一些底层的代码进去,如python版本之类的,所以编译后的工程依旧依赖于环境,不能把其他机器上编译好的文件直接拿过去用。

二、pytorch模型.pth的加密

对于一个文件的加密其实还是容易,这里我们用AES(一种对称加密算法)对模型文件进行加密。

首先要安装一个包,里面包含很多加密算法,ubuntu上安装命令为‘

pip install pycrypto

然后写一个python脚本,实现读取模型文件,加密后保护的功能,和读取加密文件,解密后保存的功能。

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex# 如果text不足16位的倍数就用空格补足为16位
def add_to_16(text:bytes):if len(text) % 16:add = 16 - (len(text) % 16)else:add = 0text = text + (b'\0' * add)return text# 加密函数
def encrypt(text:bytes):# key = '9999999999999999'.encode('utf-8')key = 'tqsktqsktqsktqsk'.encode('utf-8')mode = AES.MODE_CBCiv = b'qqqqqqqqqqqqqqqq'text = add_to_16(text)cryptos = AES.new(key, mode, iv)cipher_text = cryptos.encrypt(text)# 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串return b2a_hex(cipher_text)# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):key = 'tqsktqsktqsktqsk'.encode('utf-8')iv = b'qqqqqqqqqqqqqqqq'mode = AES.MODE_CBCcryptos = AES.new(key, mode, iv)plain_text = cryptos.decrypt(a2b_hex(text))return plain_textif __name__ == '__main__':# encryption modelwith open('detect_model/checkpoints/xxx_ori.pth', 'rb') as f1:encrypted = encrypt(f1.read())with open('detect_model/checkpoints/xxx_encryp.pth', 'wb') as f2:f2.write(encrypted)# decryption modelwith open("./detect_model/checkpoints/xxx_decryp.pth", 'wb') as f:content = open('detect_model/checkpoints/xxx_encryp.pth', 'rb').read()f.write(decrypt(content))

这里用的是Crypto.Cipher模块的AES算法。模型文件加密后会比加密前的内存大一倍左右。

问题出现了。pytorch读取模型的函数torch.load()只能读取文件,并且返回一个FileIO的对象,来对文件进行操作。底层都是封死的,如果我们使用加密文件的时候要先解密成文件,那还怎么保密,可是没有办法,只能这么做。

理论上一个可行的办法是,把加密后的文件读入内存,然后对读取的内容(Bytes指针类型)进行解密,此时解密后的内容在内存中。但torch.load()只能读取文件,所以只能使用C++自己来写一个工具,完成内存解密的内容,加载到pytorch模型的操作,这个流程就比较复杂了,暂时没有实现。

未完待续吧......

Python源码加密与Pytorch模型加密相关推荐

  1. python代码加密运行_python源码下载后怎样进行加密

    python源码下载后怎样进行加密 发布时间:2020-11-19 09:23:24 来源:亿速云 阅读:60 作者:小新 这篇文章主要介绍了python源码下载后怎样进行加密,具有一定借鉴价值,需要 ...

  2. 【Python基础】加密你的Python源码顺便再打个包如何?

    本篇为专属于"交通科研Lab"志愿者系列推文活动,为大家带来交通高校硕博们原创推文.为作者点赞,欢迎大家关注交流!!! 点击蓝字 关注我们 成为一个智慧.快乐和富有的人. --王宇 ...

  3. python源码加密实现

    本文参考如何保护你的 Python 代码对其想法进行实现. 源码地址:spython@github RAYENCRY rayencry使用AES算法对指定目录中的Python源码加密. 内容 背景 安 ...

  4. 对python源码进行编译,加密python脚本

    对python源码进行编译 1.生成.pyc文件 import py_compile py_compile.compile('hello.py') 2.优化源码文件 python -O -m py_c ...

  5. essential c++源码_Goldenmask - 一键化保护你的 Python 源码

    项目地址: https://github.com/youngquan/goldenmask​github.com Goldenmask 直译为金色的罩子,灵感来自"金钟罩"的&qu ...

  6. python编译器源码_编译python源码

    广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! 尝试通过源码自己编译 python,使用的系统是 ubuntu14.04 l ...

  7. 【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目

    车牌识别基础功能演示 摘要:车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符.英文字母.阿 ...

  8. python提取发票信息发票识别_(附完整python源码)基于tensorflow、opencv的入门案例_发票识别二:字符分割...

    (附完整python源码)基于tensorflow.opencv的入门案例_发票识别二:字符分割 发布时间:2018-05-14 20:16, 浏览次数:1201 , 标签: python tenso ...

  9. python预测算整理集合 python根据历史数据,预测未来数据 神经网络时间序列预测python 销售收入分析与预测 神经网络预测控制 Python 源码 4个lstm做数据预测的案例源代码

    python 预测未来/神经网络/负荷/飞机零件故障/链路预测程序源码 1.python实现TensorFlow2股票股价预测(源码) 2.负荷预测(py thon例子,实时负荷预测,15分钟到4小时 ...

最新文章

  1. golang goroutine 协程原理
  2. python scrapy 环境搭建_python+scrapy环境搭建步骤描述
  3. [转]Create Custom Exception Filter in ASP.NET Core
  4. c++提供的可有效分配对象空间的运算符是_Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
  5. 中文分词之正向最大匹配算法
  6. Linux01-学习记录
  7. 新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目
  8. AD19 add pins to nets错误_NGINX 502 Bad Gateway错误疑难解答
  9. Volley源码学习2--cache类
  10. css滤镜使文字变3D效果
  11. php+mysql图书管理系统
  12. 原创力文档怎么免费下载_谁说下载文档需要下载券?老司机分享的良心工具,全网文档免费下...
  13. UESTC 1636 梦后楼台高锁,酒醒帘幕低垂 最小生成树Kruskal算法的扩展
  14. 新元宇宙每周连载《地球人奇游天球记》第十八回冥王遇鬼
  15. Thinkpad E450c WIN8 重装系统 如何U盘启动
  16. Python使用geany工具配置方法
  17. 如何将word转换成excel表格格式
  18. java 结束程序_如何优雅地停止Java进程
  19. uni-app日期选择组件-基于mx-datepicker修改
  20. IDM的介绍、下载、注册激活使用教程详解 V6.38.2021

热门文章

  1. JVM详解【三】JVM的内存结构
  2. JDK配置环境变量详解
  3. mysql中外键设置级联删除_MySQL中利用外键实现级联删除、更新
  4. Re26:读论文 Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
  5. java动态代理原理剖析
  6. 华中大计算机专业出国留学情况,华中大
  7. 【信号去噪】基于鲸鱼优化算法优化VMD实现数据去噪附matlab代码
  8. Ubuntu16.04设置分辨率1920*1080
  9. 电力行业企业管理软件
  10. opencv 图像雾检测_opencv-python烟雾图像处理