防止代码被窃取,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的方法,因此较为可靠。

 
posted @ 2024-05-30 11:13  jingsupo  阅读(196)  评论(0编辑  收藏  举报

欢迎光临