防止代码被窃取,Python代码加密常用方案
基础:Python文件格式
为了理解python代码加密的基本原理,首先来了解下python的文件格式。
.py python源代码
这个大家都知道,不做过多阐述。这里着重介绍下Python代码的执行。
Python 代码的执行过程和 Java 类似:
将.py文件编译得到 Python 的字节码
Python 虚拟机(Python Virtual Machine) 执行编译好的字节码
Python 虚拟机和 Java 的 JVM 类似,但 Python虚拟机的抽象化程度更高(但不是性能更强)
.pyc 编译得到的字节码文件
在首次导入一个python库的时候,为了让以后再次导入更方便也更快,python会构建一个包含该库的字节码*.pyc文件
你可以在你的库文件的__pycache__文件夹下看到每个.py文件对应的.pyc文件
.pyo 编译优化后得到的字节码文件
Python 3.5之前将*.pyc文件通过优化器(-O)创建的文件,可以略微提升加载速度
Python 3.5 之后已经取消了.pyo文件的概念,优化后的文件也会以.pyc文件存储
从.pyc或.pyo文件中读取程序比从.py文件中读取得更快,但只是优化了加载速度,不会优化运行速度
.pyd 可被Python调用的Windows DLL文件
基本的Windows DLL文件,是Python的动态链接库
并非从python代码生成,而是其他语言写成的可以被Python调用的Windows DLL文件,例如C++
关于Windows DLL文件的介绍可以参看 Microsoft-什么是DLL?
基础加密:.pyc加密
加密难度:⭐️
安全性:⭐️
最基础的加密方法是利用 Python 自带的编译器将源代码文件.py 编译得到的二进制的字节码文件.pyc。.pyc只能在特定版本的解释器上运行。
二进制的字节码文件对于初学者而言有一定的代码隐藏作用,但也只能简单隐藏。
在命令行中输入如下代码可以得到.pyc文件:
编译指令:
python -m py_compile main.py
python -m compileall main.py
批量
在.\__pycache__目录下可以看到字节码文件.pyc
字节码文件.pyc可以在别的Python文件中导入使用,也可以直接执行。
但是字节码文件极易被反编译得到源代码。
进阶加密:.pyd/.so加密
加密难度:⭐️ ⭐️ ⭐️
安全性:⭐️ ⭐️ ⭐️
Cython是一个编程语言,它通过类似Python的语法来编写C扩展并可以被Python调用。能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库。基于它的原理,我们可以得到一种代码加密的思路:将 .py/.pyx 编译为 .c 文件,再将 .c 文件编译为 .so(Unix) 或 .pyd(Windows),这样得到的文件更难反编译。
原理:将 .py/.pyx 编译为 .c文件,再将 .c文件编译为 .so(Unix) 或 .pyd(Windows)
注意:Windows环境下使用该库可能需要配置Microsoft Visual C++相关库
1
|
pip install Cython |
setup.py
1
2
3
4
|
from distutils.core import setup from Cython.Build import cythonize setup(name = 'main' , ext_modules = cythonize( 'main.py' )) |
python setup.py build_ext
Linux环境下相关报错:fatal error: Python.h: No such file or directory
原因:包含需要编译的调用python api的c/c++文件,而Linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包。以python为例,以下情况你是需要python-dev的:
ubuntu下
apt-get install python-dev apt-get install python3-dev
centos下
yum -y install python-devel yum -y install python3-devel
注意如果是python3可以直接安装python3-dev
关于这种加密方法的安全性,笔者目前尚未发现能将.so
/.pyd
文件直接反编译为.py
的方法,因此较为可靠。
-------------------------------------------
个性签名:无论在哪里做什么,只要坚持服务、创新、创造价值,其它的东西自然都会来的。
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!