如何保护运行在服务器端的 Python 代码是一个问题,和发布到客户端的代码可以打包成可执行文件不一样,服务器端的代码一般是以包(Package)的方式在运行,至多被编译成 .pyc
或者 .pyo
,或者在放到一个压缩文件里面,但是不管怎么样,最终执行的时候都要解压到磁盘的某一个地方执行。
这里介绍一种使用包 PyArmor 保护服务端 Python 源代码的方式,[PyArmor] 可以加密 Python 源代码,然后无缝替换原来的文件。一个被 [PyArmor] 加密后的源代码内容如下
__pyarmor__(__name__, __file__, b'\x0a\x01\x03\x0b\xf1......\x01\x03')
这完全是一个正常的 Python 脚本,所以可以一对一替换原来的脚本。不仅仅如此,[PyArmor] 还会对每一个函数体进行单独加密,在函数被执行之前,解密函数正常执行。一旦函数执行完成,会重新加密函数体,确保运行时刻 Python 代码也不会被泄露[^1]。
下面举例来说明,如何使用 [PyArmor] 加密一个服务器端的包 weblogin
首先安装 [PyArmor]
pip install pyarmor
然后加密包,假设其位于 /path/to/project/weblogin
cd /path/to/project
pyarmor obfuscate -r weblogin/__init__.py
加密脚本存放在 dist
下面,把下面所有的文件拷贝到原来目录,使用加密脚本覆盖原来的文件
cp -a dist/* weblogin/
最后按照原来的方式发布 weblogin
到服务器就可以了。
了解 [PyArmor] 的更多功能,请访问 PyArmor 和 PyArmor
[^1]PyArmor