美文网首页数析python学习交流Python-资料
别再裸奔了,你的项目代码安全吗,再不加密就out了

别再裸奔了,你的项目代码安全吗,再不加密就out了

作者: Python数据分析实战 | 来源:发表于2019-11-26 10:06 被阅读0次

    在工作中,有时候我们需要部署自己的Python应用 或进行私有化部署时,尤其现在都是通过docker镜像部署,我们并不希望别人能够看到自己的Python源程序。

    image

    加密Python源代码的方式,是将.py文件转化为.so文件,这样加密的可靠性非常高,无法破解,也就很好地保护了源代码。

    加密过程中会产生很多多余文件,加密后可以删除,我这里用了脚本一步完成

    加密流程

    1、项目文件加密
    2、将加密的文件移至对应目录下
    3、删除原文件和生成的附属文件夹

    设备:Mac

    项目:简单测试项目

    我们需要在系统环境中安装一些准备工具,包括python3-dev,gcc,Cython,其中Cython为Python的第三方模块。安装的命令如下:

    $ brew install gcc 
    $ pip3 install cython
    linux上安装 
    $ sudo apt install python3-dev gcc
    $ pip3 install cython
    

    创建测试项目:

    目录如下:

    image

    简单介绍文件:

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

    image

    多了一个文件:origin.c 和 一个文件夹:build

    build里就是我们加密后的文件,手动将build/lib下的对应文件替换掉源文件即可,对应的.c文件也可删除

    image

    注意:不同的系统产生的build的二级目录不同,但加密后的文件都是lib开头的目录下,都是以.so结尾

    处理后的项目目录为:

    image

    我们发现原来的origin.py:被替换成了加密后的.so文件

    image

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

    image

    项目加密完成!

    一键完成

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

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

    image

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

    相关文章

      网友评论

        本文标题:别再裸奔了,你的项目代码安全吗,再不加密就out了

        本文链接:https://www.haomeiwen.com/subject/cafewctx.html