当前位置:首页>python>从加密到授权:Python代码保护与证书授权管理系统

从加密到授权:Python代码保护与证书授权管理系统

  • 2026-10-11 06:04:20
从加密到授权:Python代码保护与证书授权管理系统
作为Python开发者,写好的代码在裸奔,知识产权保护几乎是透明的。本文将从加密算法基础、源码编译保护、授权证书系统设计三个维度,带你打造一套完整的Python软件保护方案。
01
加密算法基础
(1)MD5 —— 哈希指纹,不可逆转
用途:密码存储、文件完整性校验;

特点:单向不可逆,相同输入永远得到相同输出;

注意:现已能被彩虹表破解,建议加盐(salt)或改用 SHA-256。

import hashlib# 加盐哈希存储密码salt = "random_salt_per_user"hash_password = hashlib.sha256(f"{password}{salt}".encode()).hexdigest()
(2)Base64 —— 不是加密,只是编码
用途:将二进制数据转为可见 ASCII 字符,常用于传输(如 JWT);

特点:可逆,不提供任何安全性。

import base64encoded = base64.b64encode(b"Hello").decode()  # SGVsbG8=decoded = base64.b64decode(encoded)         # b'Hello'

(3)对称加密(AES) —— 一把钥匙开一把锁

用途:大量数据加密、本地配置文件保护;

特点:加解密使用同一密钥,速度快,适合批量数据;

隐患:密钥管理困难,一旦泄露则全盘皆输。

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes# 生产环境推荐使用 pycryptodome 库

(4)非对称加密(RSA) —— 公钥加密,私钥签名

用途:数字签名、激活码防伪、安全传输对称密钥;

特点:私钥签名,公钥验证;公钥加密,私钥解密;

为何用于授权系统:服务端用私钥生成激活码,客户端用内置公钥验签,私钥永不离开服务器。

from cryptography.hazmat.primitives.asymmetric import rsa, padding# 生成密钥对private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)public_key = private_key.public_key()
02
Python源码编译
(1)什么是 .pyd 和 .so
  • .pyd:windows 下的 Python 动态链接库,本质是 DLL;

  • .so:linux 下的共享对象文件;

它们由 Cython 或 CPython 编译生成,反编译难度远高于 .pyc,逆向者面对的是机器码而非字节码。

(2)Cython编译
第一步:安装 Cython
pip install cython
第二步:准备 setup.py
from setuptools import setupfrom Cython.Build import cythonizesetup(    ext_modules = cythonize("core.py", compiler_directives={'boundscheck': False}))
第三步:执行编译
python setup.py build_ext --inplace
  • windows下生成:

    core.cp39-win_amd64.pyd

  • linux下生成:

    core.cpython-39-x86_64-linux-gnu.so

第四步:重命名并调用
# 重命名为 core.pyd 或 core.soimport core   # 实际调用的是编译后的二进制文件
注意:编译后就能 100% 防破解吗?不能!但安全等级提升到了专业级,没有绝对的安全,我们的目标是让破解成本高于软件价值。
03
授权系统设计
(1)一机一码流程
整个授权流程分为客户端和服务端两部分:
  • 服务端(管理员操作)
客户提供机器码 UID -> 管理员选择授权主题、设置过期时间 -> 服务端用 RSA 私钥对授权信息签名 -> 生成 Base64 激活码,导出给客户。
  • 客户端(用户软件)
采集本机硬件信息生成 UID -> 用户输入激活码 -> 客户端用内置的 RSA 公钥验签 -> 校验通过后,解析授权信息并比对机器码、有效期 -> 通过则激活,否则拒绝。
图 1 一机一码授权验证流程图
(2)数据库设计
采用 SQLite 数据库,授权记录表(licenses)设计如下:
字段
类型
说明
id
INTEGER
自增主键
topic
TEXT
证书主题
uid
TEXT
机器码
issue_date
TEXT
签发时间
expire_date
TEXT
过期时间
description
TEXT
授权描述
activate_code
TEXT
激活码
用户登录表(users)设计如下:
字段
类型
说明
usernameTEXT(PK)
用户名
password
TEXT
密码
created_date
TEXT
创建时间
(3)核心逻辑代码
服务端 RSA 签名生成激活码:
def generate_activate_code(topic, uid, expire_date, description):    # 组装授权数据    auth_data = json.dumps({        "topic": topic,        "uid": uid,        "issue": datetime.now().strftime("%Y-%m-%d"),        "expire": expire_date,        "description": description    }).encode()    # 使用私钥签名(PSS填充)    signature = private_key.sign(        auth_data,        padding.PSS(            mgf=padding.MGF1(hashes.SHA256()),            salt_length=padding.PSS.MAX_LENGTH        ),        hashes.SHA256()    )    # 组合数据与签名,Base64编码    combine = auth_data + b"|||" + signature    return base64.b64encode(combine).decode()
客户端验签代码:
def verify_activate_code(activate_code, expected_uid):    # Base64解码    combine = base64.b64decode(activate_code)    auth_data, signature = combine.split(b"|||")    # 解析授权信息    info = json.loads(auth_data.decode())    # 公钥验签    public_key.verify(        signature,        auth_data,        padding.PSS(            mgf=padding.MGF1(hashes.SHA256()),            salt_length=padding.PSS.MAX_LENGTH        ),        hashes.SHA256()    )    # 校验机器码和有效期    if info['uid'] != expected_uid:        raise Exception("机器码不匹配")    if info['expire'] < datetime.now().strftime("%Y-%m-%d"):        raise Exception("授权已过期")    return info
04
PyQt5桌面端
技术栈:PyQt5 + cryptography + sqlite3
(1)管理员端
界面:RSA秘钥管理,支持生成密钥对、保存私钥、导出公钥功能。
图 2 RSA秘钥管理图
界面:激活码管理,支持授权签发、查看授权详情、续期、删除、以及模糊搜到功能。
图 3 激活码管理图
图 4 新增查看续期图
(2)客户端
界面:支持获取本机机器码、验证激活码功能。
图 5 客户端机器码获取图
图 6 客户端激活码验证图
05
Flash Web网页端
技术栈:Flask + SQLite + HTML/CSS/JS + JWT认证
(1)管理员登录
为了保证网页端的授权保密性,必须具有管理员账户才能登录系统进行授权操作。
图 7 管理员登录页面图
(2)RSA秘钥管理
支持生成密钥对、保存密钥对、从文件加载等功能。
图 8 RSA秘钥管理页面图
(3)激活码列表
支持输入主题、机器码、描述信息模糊搜索授权信息。
图 9 授权列表页面图
(4)授权签发
支持授权签发的功能,输入授权主题、用户机器码、授权描述、过期时间等信息;生成激活码、保存激活码、复制激活码功能。
图 10 授权签发页面图
(5)查看授权详情
点击列表中的某个授权信息,可以查看具体的授权信息。
图 11 授权详情页面图
(6)授权续期
支持对某个授权进行续期操作。
图 12 授权续期页面图
(7)下载授权信息
支持对某个授权进行下载的功能,下载的文件为.zip文件格式。
图 13 授权下载页面图
授权文件具体内容:
license.txt:具体的激活码内容文件;
public.pem:具体的公钥内容文件;
README.txt:相关的授权明细信息文件。
图 14 授权文件列表图
(8)删除授权
支持删除某个授权信息,包括删除服务器端存储的数据库记录以及存储盘上的具体文件。
图 15 授权删除页面图
06
结束语
保护软件不仅是技术问题,更是对自身劳动成果的尊重。每一个BUG调试的坚持、每一行精心设计的逻辑,都值得被认真对待。给代码加上授权,不是不信任用户,而是让付费的用户感受到公平,让自己的付出获得应有的回报。

往期推荐

最新文章

随机文章