在项目中有时不想别人看到我们写的python脚本内容,这时候我们需要将我们的python脚本进行加密,其实是不像让别人看到我写的代码太LOW了,(*^_^*)
python脚本加密常用的有两种方式,一种是将文件.py文件转换为.pyc文件,但是这种加密方式可以被反编译,骗骗小白还是可以的,另一种方式则是使用cython将我们的脚本转换为.so文件
我的测试代码很简单
func.py文件,存放在test_func目录下
#!/usr/bin/python3 #coding:utf-8 def test(name): return "hello {} !".format(name)
test.py文件
#!/usr/bin/python3 #coding:utf-8 from test_func.func import test print(test("sulao"))
上述执行python3 test.py脚本执行直接返回
hello sulao !
这里我们对func.py文件进行加密,不像让别人看到我的函数具体内容,然后再进行测试
1.转换为pyc文件的方式很简单,执行命令
python -m compileall test_func #打印 Listing 'test_func'... Compiling 'test_func\\func.py'...
接着我们去test_func目录下看到出现了一个__pycache__目录,下面有一个func.cpython-37.pyc的文件,接着我们删除原有的test_func目录下的func.py文件,将生成的func.cpython-37.pyc文件改名为func.pyc文件复制到原来func.py文件目录,发现再次执行test.py和原来未加密前的结果一致,没有任何报错
上述加密方式操作很简单,但是目前来说这种加密方式很容易破解,基本只要一条命令即可换远程原有py脚本,而且此种加密方式兼容性很差
接着我们来看看第二种加密方式吧
2.将py文件转换为.so加密文件
此操作需要切换到linux上操作,需要使用到gcc和python-dev
我们需要进行安装
yum install gcc python3-devel -y
我们需要cython模块
pip3 install cython
然后我们需要编写一个setup.py转换文件
#!/usr/bin/python3 #coding:utf-8 from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize(['func.py']))
执行
python3 setup.py build_ext
看到多出来了一个build目录和func.c文件
build目录下lib.linux-x86_64-3.6下有一个func.cpython-36m-x86_64-linux-gnu.so文件,temp.linux-x86_64-3.6目录下有一个func.o文件
接下来我们将so文件移到test.py同级目录
mv build/lib.linux-x86_64-3.6/func.cpython-36m-x86_64-linux-gnu.so ./
然后删除func.py文件,再次执行python3 test.py
hello sulao !
发现返回还是之前的结果,说明我们的加密成功了