别再裸奔了,你的项目代码安全吗,再不加密就out了
在工作中,有时候我们需要部署自己的Python代码 或进行私有化部署时,尤其现在都是通过docker镜像部署,我们并不希望别人能够看到自己的Python源程序。
加密Python源代码的方式,是将.py文件转化为.so文件,这样加密的可靠性非常高,无法破解,也就很好地保护了源代码。
加密过程中会产生很多多余文件,加密后可以删除,我这里用了脚本一步完成
项目文件加密
将加密的文件移至对应目录下
删除原文件和生成的附属文件夹
设备:Mac
项目:简单测试项目
我们需要在系统环境中安装一些准备工具,包括python3-dev,gcc,Cython,其中Cython为Python的第三方模块。安装的命令如下:
1 2 3 4 5 6 | $ brew install gcc $ pip3 install cython linux上安装 $ sudo apt install python3 - dev gcc $ pip3 install cython |
创建测试项目:
目录如下:
简单介绍文件:
入口函数main.py:
1 2 3 | from origin import Hello t = Hello() t.say() |
被加密的文件origin.py:
1 2 3 4 | class Hello(): def say( self ): print ( "hello world !" ) |
加密的文件setup.py:
1 2 3 4 | dirPath = "origin.py" # 1、文件加密 setup(ext_modules = cythonize([dirPath])) print ( "加密完成" ) |
进入项目下,执行加密文件setup.py:
python3 setup.py build_ext
多了一个文件:origin.c 和 一个文件夹:build
build里就是我们加密后的文件,手动将build/lib下的对应文件替换掉源文件即可,对应的.c文件也可删除
注意:不同的系统产生的build的二级目录不同,但加密后的文件都是lib开头的目录下,都是以.so结尾
处理后的项目目录为:
我们发现原来的origin.py:被替换成了加密后的.so文件
测试项目是否还能正常运行:
项目加密完成!
因为我们不可能通过加密项目,然后一步步移动加密文件,然后删除,再部署项目,那样会导致整个项目代码很乱,也不方便操作
加密文件也是Python代码肯定要用code完成整个过程了,
(加密 -- 源文件替换 -- 删除.c和其他附属文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | dirPath = "origin.py" filePath3 = "build/" # 1、文件加密 setup(ext_modules = cythonize([dirPath])) print ( "加密完成" ) # 2、将加密的文件移至对应目录下 files_1 = os.listdir(filePath3) for files_1_temp in files_1: if "lib" in files_1_temp: files_1 = files_1_temp print (files_1) files_2 = os.listdir(filePath3 + files_1)[ 0 ] so_file = filePath3 + files_1 + "/" + files_2 print (so_file) # 文件移动或拷贝 shutil.copy(so_file, "./" ) # 3、删除原文件和生成的附属文件夹 files2 = os.listdir( "./" ) for file in files2: if file = = dirPath or file .endswith( ".c" ): # 判断文件是否存在 if (os.path.exists( file )): os.remove( file ) print ( '移除后test 目录下有文件:%s' % file ) else : print ( "要删除的文件不存在!" ) #删除附属文件夹 try : shutil.rmtree(filePath3) except Exception as ex: print ( "错误信息:" + str (ex)) #提示:错误信息,目录不是空的 print ( "删除完成" ) |
进入项目下,执行加密文件setup.py: python3 setup.py build_ext
通过 Jenkins + Docker 部署的,那么就要在部署过程中进行加密处理
那么通过Docker部署需要注意点:
1、需要安装python3-dev,gcc,Cython
2、要先安装Cython, 才能执行加密代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 从拉取基础镜像 作为builder FROM registry.cn - hangzhou.aliyuncs.com / ai_images / server - base2 AS builder COPY . / app WORKDIR / app RUN rm - rf . / .git # 注意这里也有builder 会大大减少镜像的大小且项目启动速度也会加快 FROM registry.cn - hangzhou.aliyuncs.com / ai_images / server - base2 COPY - - from = builder / app / / app RUN ln - sf / usr / share / zoneinfo / Asia / Shanghai / etc / localtime RUN echo 'Asia/Shanghai' > / etc / timezone EXPOSE 5009 RUN pip3 install - r . / requirements.txt - i https: / / mirrors.aliyun.com / pypi / simple / # 执行加密文件 RUN python3 setup.py build_ext CMD [ "python3" , "/app/main.py" , "run-server" ] |
小技巧分享:
docker部署时通过二次镜像处理,会大大的减少镜像的大小且加快项目启动
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步