筑业小筑老师铂金专家
2026-05-14 11:42:55
生成注册码(激活码、序列号)是软件授权管理的核心环节。以下是几种常见的实现方案和代码示例:
### 一、核心设计思路
1. **防篡改**:注册码需包含用户信息(如用户名)并加密
2. **防复制**:绑定硬件信息(CPU序列号/硬盘ID)
3. **有效期控制**:内置时间戳或使用次数限制
4. **验证机制**:服务端验证或离线公钥验证
---
### 二、常用生成方案(附Python示例)
#### 方案1:对称加密(AES) + 用户信息绑定
```python
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
import hashlib
def generate_license(username, secret_key):
# 组合用户信息+时间戳
raw_data = f"{username}|{int(time.time())}"
# 密钥处理 (32字节)
key = hashlib.sha256(secret_key.encode()).digest()
# AES加密
cipher = AES.new(key, AES.MODE_CBC)
ct_bytes = cipher.encrypt(pad(raw_data.encode(), AES.block_size))
# 返回base64编码的注册码 return base64.b64encode(cipher.iv + ct_bytes).decode()
# 使用示例
license = generate_license("user123", "your_secret_key")
# 输出示例: "BQ6vV5Gj7aFb3dRz...(base64字符串)"
```
#### 方案2:非对称加密(RSA签名)
```python
from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
def generate_license(username, private_key_path):
# 加载私钥
with open(private_key_path, "r") as f:
private_key = RSA.import_key(f.read())
# 创建签名对象 data = f"{username}|{int(time.time())}".encode()
hash_obj = SHA256.new(data)
signature = pkcs1_15.new(private_key).sign(hash_obj)
# 组合数据+签名 return base64.b64encode(data + b"||" + signature).decode()
# 使用示例
license = generate_license("user123", "private.pem")
```
#### 方案3:硬件绑定(推荐商业软件使用)
```python
import wmi # Windows需安装pywin32
import hashlib
def get_hardware_id():
c = wmi.WMI()
# 获取CPU序列号 cpu = c.Win32_Processor()[0].ProcessorId.strip()
# 获取磁盘序列号 disk = c.Win32_DiskDrive()[0].SerialNumber.strip()
return cpu + disk
def generate_hardware_license(username, secret):
hw_id = get_hardware_id()
raw = f"{username}@{hw_id}|{int(time.time())}"
# HMAC签名 hmac_code = hashlib.pbkdf2_hmac(
'sha256',
raw.encode(), secret.encode(),
100000, # 迭代次数
16 # 输出长度
)
return base64.b64encode(f"{raw}${hmac_code.hex()}".encode()).decode()
```
---
### 三、进阶安全措施
1. **时间限制**:注册码中嵌入过期时间戳 ```python # 添加有效期(30天)
expiry = int(time.time()) + 30*86400
raw_data = f"{username}|{expiry}"
```
2. **在线验证**:注册时连接服务器验证 ```python import requests def verify_online(license_key):
api_url = "https://your-api.com/verify"
resp = requests.post(api_url, json={"key": license_key})
return resp.json().get("valid", False)
```
3. **混淆技术**:对生成的注册码进行字符替换 ```python def obfuscate(key):
# 示例:Base64字符替换
return key.replace('A', 'X').replace('=', '9')
```
---
### 四、注册码格式设计
推荐采用分段式结构增强可读性和防伪:
```
XXXXX-XXXXX-XXXXX-XXXXX
```
生成算法:
```python
def format_license(raw_key):
clean = raw_key.replace("-", "")[:20] # 取20字符
return '-'.join([clean[i:i+5] for i in range(0, 20, 5)])
```
---
### 五、最佳实践建议
1. **服务端验证**:重要软件必须使用在线验证
2. **密钥分离**:加密密钥不要硬编码在代码中
3. **防止逆向**:
- 使用Cython编译核心模块
- 添加代码混淆(如PyArmor)
4. **异常处理**:伪造注册码的暴力破解检测
5. **版本兼容**:在注册码中嵌入软件版本号
> **注意**:完全无法破解的注册码不存在,核心目标是提高破解成本。商业级系统建议结合在线激活+硬件绑定+定期心跳验证。
点赞0
回复 0
举报