別再裸奔了,你的項目代碼安全嗎,再不加密就out了

在工做中,有時候咱們須要部署本身的Python代碼 或進行私有化部署時,尤爲如今都是經過docker鏡像部署,咱們並不但願別人可以看到本身的Python源程序。python

Snip20191207_64.png

加密Python源代碼的方式,是將.py文件轉化爲.so文件,這樣加密的可靠性很是高,沒法破解,也就很好地保護了源代碼。linux

加密過程當中會產生不少多餘文件,加密後能夠刪除,我這裏用了腳本一步完成git

加密流程docker

項目文件加密
將加密的文件移至對應目錄下
刪除原文件和生成的附屬文件夾app

設備:Mac函數

項目:簡單測試項目工具

咱們須要在系統環境中安裝一些準備工具,包括python3-dev,gcc,Cython,其中Cython爲Python的第三方模塊。安裝的命令以下:測試

$ brew install gcc 
$ pip3 install cython

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

建立測試項目:ui

目錄以下:加密

Snip20191207_65.png

簡單介紹文件:

入口函數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"
# 一、文件加密
setup(ext_modules = cythonize([dirPath]))
print("加密完成")

進入項目下,執行加密文件setup.py:python3 setup.py build_ext

Snip20191207_66.png

多了一個文件:origin.c 和 一個文件夾:build

build裏就是咱們加密後的文件,手動將build/lib下的對應文件替換掉源文件便可,對應的.c文件也可刪除

Snip20191207_67.png

注意:不一樣的系統產生的build的二級目錄不一樣,但加密後的文件都是lib開頭的目錄下,都是以.so結尾

處理後的項目目錄爲:

Snip20191207_68.png

咱們發現原來的origin.py:被替換成了加密後的.so文件
Snip20191207_69.png

測試項目是否還能正常運行:
Snip20191207_70.png

項目加密完成!

一鍵完成

由於咱們不可能經過加密項目,而後一步步移動加密文件,而後刪除,再部署項目,那樣會致使整個項目代碼很亂,也不方便操做

加密文件也是Python代碼確定要用code完成整個過程了,

(加密 -- 源文件替換 -- 刪除.c和其餘附屬文件)

dirPath = "origin.py"
filePath3 = "build/"

# 一、文件加密
setup(ext_modules = cythonize([dirPath]))
print("加密完成")

# 二、將加密的文件移至對應目錄下
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, "./")

# 三、刪除原文件和生成的附屬文件夾
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
Snip20191207_71.png

Jenkins + Docker 部署
經過 Jenkins + Docker 部署的,那麼就要在部署過程當中進行加密處理
那麼經過Docker部署須要注意點:

一、須要安裝python3-dev,gcc,Cython

二、要先安裝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部署時經過二次鏡像處理,會大大的減小鏡像的大小且加快項目啓動

Snip20191204_47.png

相關文章
相關標籤/搜索