python原始碼加密實現

2020-08-14 19:09:37

本文參考如何保護你的 Python 程式碼對其想法進行實現。
原始碼地址:spython@github

RAYENCRY

rayencry使用AES演算法對指定目錄中的Python原始碼加密。

內容

背景

由於Python爲解釋形語言,原始碼直接暴漏在生產環境中,爲了防止Python原始碼泄露造成不必要安全問題,可以改造Python直譯器用於執行加密後的python程式碼。
在这里插入图片描述
在这里插入图片描述

安裝

1. 目錄結構

目錄 描述
doc 文件
src 原始碼
configure.json 組態檔例子
install.sh 安裝指令碼
uninstall.sh 解除安裝指令碼
Makefile Makefile

2. 編譯依賴

rayencry依賴libssl庫,使用如下兩種方法安裝libssl均可:

  • apt install libssl-dev
  • 原始碼編譯安裝libssl

3. 編譯安裝

  • 修改decrypt_file.c中的AES密匙和AES的cbc向量。注意:均爲128位元。
  • 使用sudo make編譯
  • 使用sudo make install或者執行指令碼install.sh安裝
  • 使用sudo make uninstall或者執行指令碼uninstall.sh解除安裝
  • 使用sudo make clean清除編譯結果

使用說明

1. 設定configure.json檔案:

{
    "select":"/home/src",
    "except":[
        "except_file.py",
        "except_directory"
    ],
    "archive":"/home/src_en"
}
屬性 必要性 型別 描述
select 必選 string 需要加密的原始碼目錄(只能是目錄)。請使用絕對地址。
except 可選 array 需要在加密檔案中排除的目錄或者路徑。請使用相對地址。
archive 必選 string 解密目錄名字。請使用絕對地址。

2. 使用rayencry加密原始碼目錄

rayencry <config file>

修改Python原始碼(僅針對Python-2.7.15

下載Python-2.7.15直譯器的原始碼並對其進行如下的修改以執行加密的Python原始碼:

推薦使用aliyun映象下載python原始碼

1. 新增檔案

複製檔案./src/Python/decrypt_file_acs.cPython-2.7.15/Python
複製檔案./src/Include/decrypt——fileacs.hPython-2.7.15/Python

2. 新增解密函數到Python原始碼中


Module/main.c
------------

...
- 609            if ((fp = fopen(filename, "r")) == NULL) {
+ 609            if ((fp = d_open(filename, "r")) == NULL) {
...

Python/import.c
------------

...
-1579            fp = fopen(buf, filemode);
+1579            fp = d_open(buf, filemode);
...

3. 禁止生成.pyc檔案

由於開發者可以通過.pyc反編譯出python原始碼,所以需要禁用生成.pyc檔案

Module/main.c
------------

...
+ 445 Py_DontWriteBytecodeFlag++;
...

Python/pythonrun.c
------------

...
- 194 if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
- 195     Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
...

4. 禁止存取位元組碼

./Objects/codeobject.c
------------

...
- 205     {"co_code",         T_OBJECT,       OFF(co_code),           READONLY},
...

5. 修改Makefile.in.pre

Makefile需要鏈接libssl庫,生成decrypt_source_file.o

./Makefile.pre.in
------------

... 
- 188 SYSLIBS=	$(LIBM) $(LIBC)
+ 188 SYSLIBS=	$(LIBM) $(LIBC) -lcrypto -lssl
... 
295 ##########################################################################
296 PYTHON_OBJS=	\
+ 297	Python/decrypt_source_file.o \
298		Python/_warnings.o \
299		Python/Python-ast.o \
... 
752 ############################################################################
753 # Header files
754
755 PYTHON_HEADERS= \
+ 756 		Include/decrypt_source_file.h \
757 		Include/Python-ast.h \
758 		Include/Python.h \
759 		Include/abstract.h \
...

6. 編譯安裝Python

sudo ./configure --prefix=$PREFIX
sudo make
sudo make install

Contributor

萬炳江@echoechoin

Email: [email protected]
QQ: 614699596

Reference

[1] 如何保護你的 Python 程式碼
[2] Python 2.7.18 documentation