| 加密算法基础 |
特点:单向不可逆,相同输入永远得到相同输出;
注意:现已能被彩虹表破解,建议加盐(salt)或改用 SHA-256。
import hashlib# 加盐哈希存储密码salt = "random_salt_per_user"hash_password = hashlib.sha256(f"{password}{salt}".encode()).hexdigest()特点:可逆,不提供任何安全性。
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()| Python源码编译 |
.pyd:windows 下的 Python 动态链接库,本质是 DLL;
.so:linux 下的共享对象文件;
它们由 Cython 或 CPython 编译生成,反编译难度远高于 .pyc,逆向者面对的是机器码而非字节码。
pip install cythonfrom setuptools import setupfrom Cython.Build import cythonizesetup( ext_modules = cythonize("core.py", compiler_directives={'boundscheck': False}))python setup.py build_ext --inplacewindows下生成:
core.cp39-win_amd64.pyd
linux下生成:
core.cpython-39-x86_64-linux-gnu.so
# 重命名为 core.pyd 或 core.soimport core # 实际调用的是编译后的二进制文件| 授权系统设计 |

| username | TEXT(PK) | |
| password | ||
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| PyQt5桌面端 |


![]() | ![]() | ![]() |


| Flash Web网页端 |









| 结束语 |