python代码加密
前言
加密的多种方式
- 发布编译过的pyc文件
缺点:很容易被反编译 - PyInstaller 是一个用来将 Python 程序打包成一个独立可执行软件包,支持 Windows、Linux 和 Mac OS X。
缺点:不同系统需要不同的包。 - cython。可以防止反编译和破解
缺点:可能需要完善不支持的部分代码。 - 修改字节码定义并且发布pyc:这样你的代码将无法在标准Python解释器/VM上运行,标准的反编译器也无法反编译你的程序。
缺点:需要自带能够支持你私有字节码定义Python解释器/VM - 对按标准字节码定义生成的pyc文件进行字节码混淆,混淆后的程序可以欺骗反编译器以及反汇编器,但仍然能够被Python解释器/VM正确执行。
- 源码混淆:源码混淆替换函数名,变量名为人眼难以正确处理的字符串。
缺点: 逻辑层不变。只是加大了一点 阅读障碍。
pyobfuscate 代码混淆
def my_fuction_to_test ( self , start_date , end_date ) :
iiiii11iII1 = self . get_something ( start_date , end_date )
O0o = [ ]
for oO0 in iiiii11iII1 :
if oO0 [ "isOpen" ] == 1 :
IIIi1i1I = { }
OOoOoo00oo = dt . strptime ( oO0 [ 'calendarDate' ] , '%Y-%m-%d' )
IIIi1i1I [ 'day' ] = OOoOoo00oo . strftime ( '%Y%m%d' )
IIIi1i1I [ 'week' ] = oO0 [ 'isWeekEnd' ]
IIIi1i1I [ 'month' ] = oO0 [ 'isMonthEnd' ]
IIIi1i1I [ 'weekday' ] = OOoOoo00oo . weekday ( )
O0o . append ( IIIi1i1I )
iiI11 = pd . DataFrame ( O0o )
return iiI11
Cython加密
Cython
的主要目的是带来性能的提升,但是基于它的原理:将 .py
/.pyx
编译为 .c
文件,再将 .c
文件编译为 .so
(Unix) 或 .pyd
(Windows),其带来的另一个好处就是难以破解。
不足:
步骤兼容性稍差,对于不同版本的操作系统,可能需要重新编译
虽然支持大多数 Python 代码,但如果一旦发现部分代码不支持,完善成本较高。
步骤
1、安装cython依赖
pip install Cython==0.29.22
2、配置setup.py文件
APP_ID = 'xxx'
# 需要编译的目录
dir_paths = ['apps/configs',
'account',
'common',
'component',
'component/utils',
'component/drf',
'component/drf/mixins',
'config'
]
files = [APP_ID + '/' + i + '/*.py' for i in dir_paths]
# 参数包含build_ext 说明是编译
if 'build_ext' in sys.argv:
# 编译生成so文件
setup(ext_modules = cythonize(files, exclude=['__init__.py']))
else:
# 删除py和.c 文件
for item in dir_paths:
for dirpath, foldernames, filenames in os.walk(item):
for file in filenames:
if dirpath == item + '/migrations':
break
if (file.endswith('.py') or file.endswith('.c') or file.endswith('.pyc')):
os.remove(dirpath + '/' + file)
3、执行
- 拷贝setup.py到项目同级,执行命令,进行编译。加密目录下会生成.c和.so文件
python setup.py build_ext --inplace
- 拷贝setup.py到工程内,执行命令,删除.c和.py源文件
python setup.py
- 删除‘pycache’文件夹和pyc文件,命令需要配置正确路径
find xx/hn_docs_center -name "__pycache__" |xargs rm -rf
注意
- 每个model类中都必须配置app_label属性
- linux上部署的话需要在linux环境进行编译。linux、mac和wins编译不通用
- 加密完成后删除py文件后,重复加密会报错,提示没有源文件。(不能重复加密)
部署
省略