一日一技:如何对Python代码进行混淆

开发 前端
Cython、Nuitka在打包大型项目时,需要写大量的配置文件甚至是额外的程序,有一定的使用成本。如果你对安全的要求并没有那么高,那么其实你只需要对Python代码进行混淆,就能防止自己的代码被人轻易看到了。

目前市面上没有任何方法能够完全避免你的程序被人反编译。即便是3A游戏大作,发布出来没多久也会被人破解。现在只能做到增大反编译的难度,让程序相对无法那么快被破解。

我们知道,Python代码默认是公开的。当你要把一个Python项目给别人运行的时候,一般来说别人就能看到你的全部源代码。我们可以使用Cython、Nuitka对代码进行打包,编译成.so文件、.dll文件或者是可执行文件,从而在一定程度上避免别人看到你的源代码。我在字节的时候,内部的一个系统就是使用Cython打包的,然后部署到客户的服务器上。

Cython、Nuitka在打包大型项目时,需要写大量的配置文件甚至是额外的程序,有一定的使用成本。如果你对安全的要求并没有那么高,那么其实你只需要对Python代码进行混淆,就能防止自己的代码被人轻易看到了。

我们可以使用Pyminifier来对Python代码进行混淆。它的使用方法非常简单,pip安装以后,执行几行命令就可以完成。我们来看几个例子。

假设我有一段Python爬虫代码。原始代码是这样的:

import glob
import uvicorn
import random
from pathlib import Path
from fastapi import FastAPI
from fastapi.responses import FileResponse

IMAGE_TYPE = ['*.J*', '*.P*', '*.j*', '*.p*', '*.GIF', '*.gif']
app = FastAPI()


def iter_images(folder='*'):
    images = []
    target_folder = Path('images') / Path(folder)
    if folder != '*':
        if not Path(target_folder).exists():
            return []
    for image_type in IMAGE_TYPE:
        images.extend(glob.glob(str(target_folder / Path(image_type))))
    return images


@app.get('/')
def index():
    images = iter_images()
    if not images:
        return {'success': False, 'msg': 'No Images.'}
    path = random.choice(images)
    return FileResponse(path)


@app.get('/every/{name}')
def get_one_goddess(name):
    images = iter_images(name)
    if not images:
        return {'success': False, 'msg': 'No Images.'}
    path = random.choice(images)
    return FileResponse(path)



if __name__ == '__main__':
    uvicorn.run(app='main:app')

这段代码能够实现一个简单的图片服务器,当我们访问http://127.0.0.1:8000时,就会随机显示一张图片,如下图所示:

图片图片

我们现在来安装pyminifier。由于这个程序的代码很久没有更新了,因此如果你的Python版本比较高,那么需要首先降一下setuptools的版本,然后再安装pyminifier:

pip install "setuptools<58.0.0"
pip install pyminifier

安装完成以后,我们来对代码进行混淆,执行如下命令:

pyminifier --nonlatin --replacement-length=50 main.py > output.py

生成的output.py就是混淆以后的代码,效果如下图所示:

图片图片

这样的代码,显然已经完全没法看了。除非对方就是冲着对你的代码进行破解来的,否则一般人看了这个混淆以后的代码,直接就走了。

混淆完成以后,这个代码依然是直接运行python output.py。功能不受任何影响。

这样的混淆,属于『君子锁』,只放君子不防小人。真的要反混淆其实并不困难。只是增加了几步操作而已。在对保密要求不那么高的情况下可以使用,毕竟非常简单,不需要对已有代码做任何修改。

责任编辑:武晓燕 来源: 未闻Code
相关推荐

2021-10-15 21:08:31

PandasExcel对象

2024-07-30 08:16:18

Python代码工具

2023-10-29 09:16:49

代码安全命令

2021-04-12 21:19:01

PythonMakefile项目

2024-02-20 22:13:48

Python项目Java

2020-05-19 13:55:38

Python加密密码

2022-06-28 09:31:44

LinuxmacOS系统

2023-10-28 12:14:35

爬虫JavaScriptObject

2022-03-12 20:38:14

网页Python测试

2024-11-13 09:18:09

2021-03-12 21:19:15

Python链式调用

2021-04-05 14:47:55

Python多线程事件监控

2021-09-13 20:38:47

Python链式调用

2024-11-11 00:38:13

Mypy静态类型

2021-05-08 19:33:51

移除字符零宽

2021-07-27 21:32:57

Python 延迟调用

2021-11-12 05:00:43

装饰器代码功能

2021-04-27 22:15:02

Selenium浏览器爬虫

2020-12-11 06:30:00

工具分组DataFrame

2022-03-07 09:14:04

Selenium鼠标元素
点赞
收藏

51CTO技术栈公众号