Python语法简单,使用方便。我们可以用它来快速编写程序和构建应用程序。写好程序后,就要分发程序了。如果我们写一个图形界面的程序,可能会打包成对应操作系统平台的二进制运行文件(当然也可以直接把Python代码发给别人运行)。如果我们写的是web应用,需要部署在指定的服务器上。而这就涉及到源代码保护的问题。我们不需要程序的用户能够看到程序的源代码。但是,作为一种动态语言和脚本语言,Python不需要静态编译和打包就可以运行通过它编写的程序。加密其代码是繁琐、复杂和困难的。如果构建出来的Python应用只是供我们内部使用,或者以SaaS的形式部署在服务器上供用户使用,那么就不需要考虑Python代码加密和源代码泄露的问题。但是,如果我们编写的程序需要商业授权怎么办?源代码的保护是必须的。虽然很难,虽然不完美,但多加一个门槛,也能抵挡一些懒得破解的人。下面介绍几种常见Python应用程序的代码加密方法,供参考:1.桌面图形程序加密通常使用PyQt5、Tkinter、WxPython等框架编写的图形程序,都会用PyInstaller打包生成平台二进制运行文件,如exeWindows下的文件。但是用PyInstaller编译出来的打包程序很容易被反编译。例如使用工具pyinstxttractor,可以恢复PyInstallers编译的exe;之后就可以反编译恢复的pyc文件了。具体使用方法可以上网搜索,文章很多。如何提高图形程序打包的二进制文件的安全性?在介绍PyQt5程序打包的时候,我们提到了使用Nuitka工具来减小生成的二进制文件的大小。实际上,Nuitka会将Python程序转换成C语言程序,然后编译打包成二进制文件。众所周知,反编译C程序的难度是巨大的。这样,我们就高度保证了GUI程序的源代码安全。2、Web应用对于用Python编写的Web应用,我们一般直接部署在服务器上,然后对外提供服务。但如果是私有部署的应用,则需要部署在客户的机器上,客户并不想看到应用的源代码。这时可以考虑将Python代码文件编译成C文件,再将C文件编译成操作系统的动态链接库文件(Linux下为.so文件,Windows下为.pyd文件)。以上步骤需要用到第三方库cython,然后写一个setup.py文件指定要处理的Python文件,例如:fromdistutils.coreimportsetupfromCython.Buildimportcythonizesetup(ext_modules=cythonize(["zmister.py"]))这样就可以将Python文件编译成特定操作系统平台的动态链接库文件。同时还有一个第三方库jmpy3对上述过程进行了优化,支持单个文件和整个工程的编译,使用更友好:需要注意的是,这种方式加密的文件需要使用生成时的Python版本,这也是一个小缺点。但是这个缺点可以通过打包成Docker镜像来解决。3.通用加密除了以上两种解决方案,还有一种工具——PyArmor可以对Python代码进行加密。PyArmor是一种用于加密和保护Python脚本的工具。可以保护Python脚本的二进制代码在运行时不被泄露,设置加密Python源代码的有效期,将加密Python源代码绑定到硬盘、网卡等硬件设备。其保护机制主要包括:对编译后的代码块进行加密,保护模块中的字符串和常量,在脚本运行时对每个函数(代码块)的二进制代码进行动态加解密,代码执行后清除堆栈局部变量块完成。授权文件限制加密脚本的有效期和设备环境。PyArmor除了可以对Python代码进行加密,还可以设置Python程序的授权方式,比如设置程序的生命周期,设置允许运行的设备,扩展其他的认证方式等:我们直接使用pip命令即可安装:pipinstallpyarmor然后,使用obfuscate选项加密代码:pyarmorobfuscatefoo.py使用licenses选项生成许可证文件:pyarmorlicenses\--expired"2018-12-31"\--bind-disk"100304PBN2081SF3NJ5T"\--bind-mac"70:f1:a1:23:f0:94"\--bind-ipv4"202.10.2.52"\r001使用--with-license参数指定许可文件:pyarmorobfuscate--with-licenselicenses/r001/license.licfoo.py使用pack选项打包脚本:pyarmorpackfoo.py需要注意的是pyarmor是共享软件,安装后处于试用模式。试用模式有一些限制。买的话也不贵,298的价格还是很良心的。4.最后,除了代码加密,Python社区的很多观点也认为加密是徒劳的,任何加密都有可能被破解。有一个很好的具有法律约束力的条款可能是更好的选择,而今天的商业模式更倾向于对服务而不是对产品收费。
