别再裸奔了,你的项目代码安全吗,再不加密就out了
在工作中,有时候我们需要部署自己的Python代码 或进行私有化部署时,尤其现在都是通过docker镜像部署,我们并不希望别人能够看到自己的Python源程序。
加密Python源代码的方式,是将.py文件转化为.so文件,这样加密的可靠性非常高,无法破解,也就很好地保护了源代码。
加密过程中会产生很多多余文件,加密后可以删除,我这里用了脚本一步完成
项目文件加密
将加密的文件移至对应目录下
删除原文件和生成的附属文件夹
设备:Mac
项目:简单测试项目
我们需要在系统环境中安装一些准备工具,包括python3-dev,gcc,Cython,其中Cython为Python的第三方模块。安装的命令如下:
$ brew install gcc
$ pip3 install cython linux上安装
$ sudo apt install python3-dev gcc
$ pip3 install cython
创建测试项目:
目录如下:
aaarticlea/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="" />
简单介绍文件:
入口函数main.py:
from origin import Hello
t = Hello()
t.say()
被加密的文件origin.py:
class Hello():
def say(self):
print("hello world !")
加密的文件setup.py:
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文件
测试项目是否还能正常运行:
aaarticlea/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="" />
项目加密完成!
因为我们不可能通过加密项目,然后一步步移动加密文件,然后删除,再部署项目,那样会导致整个项目代码很乱,也不方便操作
加密文件也是Python代码肯定要用code完成整个过程了,
(加密 -- 源文件替换 -- 删除.c和其他附属文件)
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, 才能执行加密代码
# 从拉取基础镜像 作为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部署时通过二次镜像处理,会大大的减少镜像的大小且加快项目启动
别再裸奔了,你的项目代码安全吗,再不加密就out了的更多相关文章
- 记一次MongoDB裸奔
导言 大意失荆州,裸奔的 MongoDB 被黑了.虽然并不是什么非常重要的数据,但也给自己敲响的一个警钟.虽然我们平时不容易接触到数据安全,但我们在开发,部署项目的时候,一定要养成良好的安全意识. 根 ...
- 裸奔着造房子——对政府禁止采购Win8系统的一些看法
前段时间有消息称政府招标的项目将禁止使用Win8系统,原因是Win8系统的安全架构将有利于暴露敏感信息给微软,而微软的老子是美利坚,老子想要知道什么,儿子当然不敢不从.因此Win8也被打入冷宫,微软多 ...
- 跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
前言 撸码需谨慎,裸奔有风险.经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加 ...
- S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...
- 网骗欺诈?网络裸奔?都是因为 HTTP?
先跟大家讲个故事,我初恋是在初中时谈的,我的后桌的后桌.那个时候没有手机这类的沟通工具,上课交流有三宝,脚踢屁股.笔戳后背以及传纸条,当然我只能是那个屁股和后背,还不是能让初恋踢到的后背. 但是说实话 ...
- 裸奔的智能插座:博联Broadlink SP2/SP mini的分析、破解
https://www.jianshu.com/p/028b10bc3dd1 智能设备的联动通常采用IFTTT的方式,但这种方式受限于官方软件提供的功能.想要自主地灵活控制,需要有官方SDK,或知道协 ...
- (转)裸奔的后果!一次ssh被篡改的入侵事件
裸奔的后果!一次ssh被篡改的入侵事件 原文:http://blog.51cto.com/phenixikki/1546669 通常服务器安全问题在规模较小的公司常常被忽略,没有负责安全的专员,尤其是 ...
- 裸奔的支付X聊天,你还敢用吗?
- 语音消息 使用HTTP明文传输,没有任何加密措施,使用域名为up-mayi.django.t.taobao.com,从报文中可以看出,语音消息是以文件形式在网络中传输的,下图为一次语音的发送传输过 ...
- PJzhang:如何在裸奔的年代找到一些遮羞布
猫宁!!! 很久以前的一篇,搬过来. 我一直在“裸奔”,而且很久了,只是不太愿意承认. 想起了“皇帝的新装”,好奇何种经历和灵感让安徒生写出了如此精彩的故事. 一次百度了一个商品,不久接到了大规模电话 ...
随机推荐
- Spring源码之XmlBeanDefinitionReader与Resource
一.DefaultListableBeanFactory类, 里面有一个成员变量beanDefinitionMap,Bean定义对象的Map, BeanDefinition就对应XML的属性配置 /* ...
- 关于PHP中token的生成的解析
背景 很多时候我们需要用 token 来作为一些标识, 比如: 一个用户登录后的认证标识. 实现方式 md5 的方式: $v = 1; // 自己定义的 需要hash 的value 值 $key = ...
- Android studio: Android Studio 3.5格式化布局代码时错乱
Android studio 又来搞事情了,更新到3.5版本后,格式化布局文件代码时,布局文件代码竟然会发生变化,意思是不让格式化代码了呗? 垃圾的IDE. 解决办法: “File”-"Se ...
- 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)
转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...
- iptables 4张表 5条链
- Dart介绍和环境搭建
/* Dart介绍: Dart是由谷歌开发的计算机编程语言,它可以被用于web.服务器.移动应用 和物联网等领域的开发. Dart诞生于2011年,号称要取代JavaScript.但是过去的几年中一直 ...
- 013-docker-安装-Centos7
1.搜索镜像 docker search centos 2.拉取合适镜像 选择合适tag:https://hub.docker.com/,下载合适版本 docker pull centos:6.6 d ...
- php 微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo
get_wx_data.php <?php /** * 获取微信用户信息 * @author: Lucky hypo */ class GetWxData{ private $appid = ' ...
- oracle数据库【表复制】insert into select from跟create table as select * from 两种表复制语句区别
create table as select * from和insert into select from两种表复制语句区别 create table targer_table as select ...
- C# WinForm获取 当前执行程序路径的几种方法(转)
1.获取和设置当前目录的完全限定路径. string str = System.Environment.CurrentDirectory; Result: C:xxxxxx 2.获取启动了应用程序的可 ...