zoukankan      html  css  js  c++  java
  • 别再裸奔了,你的项目代码安全吗,再不加密就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
    

    创建测试项目:

    目录如下:

    简单介绍文件:

    入口函数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文件

    测试项目是否还能正常运行:

    项目加密完成!

    一键完成

    因为我们不可能通过加密项目,然后一步步移动加密文件,然后删除,再部署项目,那样会导致整个项目代码很乱,也不方便操作

    加密文件也是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 部署

    通过 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部署时通过二次镜像处理,会大大的减少镜像的大小且加快项目启动

  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/blogs/p/12003428.html
Copyright © 2011-2022 走看看