python源代码文件加密

由于python设计的初衷是开源的,因此py文件是可以直接看到源码的。但开发商业软件,代码加密保护就比较重要了。

python编译后程序

pyc文件是py文件经过编译后生成的二进制文件,因此可以发布pyc文件以隐藏源代码。pyc文件拥有更快的加载速度,执行速度没有区别。pyc是一种跨平台的字节码,pyc的内容是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的。
python提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是py_compile模块:
生成单个pyc文件
python -m py_compile test.py
python -O -m py_compile test.py
-O 优化成字节码(pyo)
-m 表示把后面的模块当成脚本运行
-OO 表示优化的同时删除文档字符串
批量生成pyc文件
python -m compileall

对服务器脚本敏感信息加密的程序,就可以使用这种方式生成pyc文件,提高一层保护的功能,当然反编译在很大程度上还是能还原回来的:

#对程序进行编译
[root@localhost encrypt]# python -m py_compile optcrypt.py
[root@localhost encrypt]# python -m py_compile server.py 
[root@localhost encrypt]# python -m py_compile __init__.py
#生成文件
[root@localhost encryptc]# ls
global.properties  __init__.pyc  optcrypt.pyc  server.pyc  test.sh

程序加密

目前软件开发商对 Python 加密时可能会有两种形式,一种是对python转成的exe或者可执行文件进行保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举几种形式的保护流程。

1.pyexe、PyInstaller、py2app 打包软件

这些工具用于将一个Python项目打包成单个可执行的文件,对 python转exe或者可执行文件,方便(在没有Python环境的机器上)使用。但通过压缩包可以方便地得到所有pyc文件或源文件,与C/C++编译生成的可执行文件有本质上的区别,基本上是零保护。

1.1 pyinstaller用法

pip install pyinstaller
#系统的python打包
pyinstaller -F ./autocheckin.py -p '~/.local/lib/python3.8/site-packages/'
#pyenv的虚拟环境打包(系统自带的库路径是不是需要指定呢?)
pyinstaller -F ./hello.py -p '~/.pyenv/versions/tele/lib/python3.8/site-packages/','/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.8/dist-packages'

2.对.py/.pyc加密

第一步,使用加壳工具对 python 安装目录下的 python.exe 进行加壳,将 python.exe 拖入到加壳工具 VirboxProtector 中,配置后直接点击加壳。
第二步,对.py/.pyc 进行加密,使用 DSProtector 对.py/.pyc 进行保护。

3.使用cython保护python的代码(推荐)

先安装cython
pip install cython
有些系统要求Cython大写
pip install Cython

No package cython available.

  • Maybe you meant: Cython

然后安装python开发包
centos系统下
yum install python-devel
然后对python代码文件进行转换:
cython hello.py --embed #把python代码转换成c代码
会生成一个名为hello.c的c语言的源文件。
然后使用gcc编译成二进制可执行文件,这时候需要制定头文件、编译选项、链接选项:(macOS下测试通过)

gcc `python-config --cflags` `python-config --ldflags`  hello.c -o hello

注:使用`符号,而不是单引号’。

如果python版本较高的话可以使用

gcc `python3-config --cflags --ldflags` hello.c -o hello

这样代码就被编译成二进制的可执行程序了。
链接错误的话试试:(centOS下测试通过,如果hello.c -o hello放在最后则centOS编译会报错)

gcc `python-config --cflags` -o hello hello.c  `python-config --ldflags`

4. 加密.py文件为.so文件

4.1 安装 cython, python-devel, gcc
4.2 新建一个setup.py,内容是:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["helloworld.py"]))

其中helloworld.py是需要加密的文件。setup.pyhelloworld.py放在相同文件夹。

4.3 运行setup.py脚本
python setup.py build_ext --inplace

其中build_ext代表外部模块,--inplace参数则表示在当前目录生成文件。

4.4 运行脚本后,在当前文件夹会生成helloworld.so文件

然后直接导入helloworld这个模块即可。如果你定义了类,可能还会遇到和__init____call__相关的错误。解决办法就具体问题具体分析了。

Note:Windows下会生成.pyd文件,而非.so文件

4.5 另外一种编译方法(未测试)
cython helloworld.py
gcc -c -fPIC -I/usr/include/python2.7/ helloworld.c
gcc -shared helloworld.o -o helloworld.so

Note: 编译后的文件与平台和python版本相关性比较高,我的做法是使用docker来进行部署。

参考文献:

  1. python源代码文件加密 - 简书
  2. python文件编译成so介绍 - 1.使用cython将py文件编译成so文件 - linyonghui1213的专栏 - CSDN博客
  3. Cython编译python为so 代码加密 - 经验集锦 - CSDN博客
  4. Python编译成.so文件进行加密后调用 - weixin_44216589的博客 - CSDN博客
  5. python将py编译成so方法 - 牧飞 - CSDN博客
  6. python 源代码保护 之 xx.py -> xx.so - TonyZhang24 - 博客园
  • 6
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Python源代码可以通过加密来保护其内容,使其更难以理解和修改。下面是一些常见的Python代码加密方法: 1. 字节码编译:使用Python内置的`compile()`函数将源代码编译为字节码文件(.pyc)。这种方法可以防止直接查看源代码,但仍然可以通过反编译字节码文件来获取代码。 例如,可以使用以下命令将源代码编译为字节码文件: ```python python -m py_compile script.py ``` 2. 加密工具:使用第三方工具来加密Python源代码,例如PyArmor、PyCrypt等。这些工具通常会将源代码转换为加密的二进制文件,并提供一个解密器来运行加密后的代码。 例如,使用PyArmor可以通过以下命令对源代码进行加密: ```python pyarmor obfuscate script.py ``` 3. 加密算法:使用加密算法对源代码进行加密,并在运行时进行解密。这种方法需要在代码中嵌入解密算法,并在运行时将加密的代码解密为可执行的Python代码。 以下是一个简单的示例,使用AES算法对源代码进行加密和解密: ```python from Crypto.Cipher import AES import base64 key = b'mysecretpassword' cipher = AES.new(key, AES.MODE_ECB) # 加密 def encrypt(plain_text): padded_text = plain_text + (16 - len(plain_text) % 16) * ' ' encrypted_text = cipher.encrypt(padded_text.encode()) return base64.b64encode(encrypted_text).decode() # 解密 def decrypt(encrypted_text): encrypted_text = base64.b64decode(encrypted_text) decrypted_text = cipher.decrypt(encrypted_text).decode() return decrypted_text.rstrip(' ') # 测试 source_code = ''' print("Hello, World!") ''' encrypted_code = encrypt(source_code) print(encrypted_code) decrypted_code = decrypt(encrypted_code) print(decrypted_code) ``` 请注意,这种加密方法并不能完全防止代码被破解,只能增加破解的难度。加密后的代码仍然可以被动态分析和反编译

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值