BodyBalanceEvaluation/document/软件使用授权控制方案.md

168 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 软件使用授权控制方案BodyBalanceEvaluation
本文档针对 BodyBalanceEvaluation 的当前技术架构Electron + 前端、Python Flask 后端、Windows 打包)设计一套合理、可落地的软件使用授权控制方案。方案兼顾离线可用、安全可靠、易于运维与用户体验。
## 目标与原则
- 合法控制软件使用范围与授权期限,满足试用、商用等场景。
- 支持离线运行(无网络环境),可选在线激活与续期。
- 与当前项目架构低耦合,易于集成与维护。
- 安全合规:私钥不落地、授权文件不可伪造、关键流程可审计。
## 授权类型
- 试用授权Trial
- 有效期短(如 7/14/30 天),功能有限制(如录制时长、导出功能、带水印)。
- 标准授权Per-Device
- 绑定单机硬件指纹,在有效期内完整功能可用。
## 授权架构设计
- 离线优先 + 在线可选:
- 核心授权依赖本地授权文件License File
- 在线激活与续期通过授权服务器获取签名授权文件。
- 授权文件License格式JSON + 数字签名RSA/ECC
- 字段示例:
```json
{
"product": "BodyBalanceEvaluation",
"version": "1.0.0",
"license_id": "LIC-2025-0001",
"license_type": "per_device",
"machine_id": "W10-ABCDEF123456",
"issued_at": "2025-10-01T00:00:00Z",
"expires_at": "2026-10-01T00:00:00Z",
"features": { "recording": true, "export": true, "trial_limit_minutes": null },
"signature": "<RSA-SHA256-BASE64>"
}
```
- 私钥仅存放在授权服务器,后端内嵌公钥用于验证签名。
- 授权关联:
- `machine_id` 使用硬件指纹CPU/主板/磁盘序列/MAC 等)生成并哈希化。
- 授权文件通过签名绑定 `machine_id`,离线不可移植至不同机器。
## 集成点与流程
### 后端集成Python Flask
- 配置路径:统一通过设备侧 `ConfigManager` 读取授权文件路径与公钥路径。
- `backend/devices/utils/config_manager.py`
- `config.ini` 示例:
```ini
[LICENSE]
path = data/license.json
public_key = backend/license_pub.pem
grace_days = 3
```
- 初始化检查:在 `backend/main.py``AppServer.init_app()` 中执行:
- 生成或读取 `machine_id`(硬件指纹)。
- 加载授权文件,校验签名与有效期、匹配 `machine_id`
- 记录授权状态(有效、过期、试用、无授权)到日志与数据库(可选)。
- API 访问控制:
- 对关键路由施加授权检查(装饰器/中间件),如:
- `POST /api/detection/start`、`/stop`、数据导出、录制等。
- 授权失败返回明确的错误码与提示(含续期/激活建议)。
- 试用/降级策略:
- 提供最小可用功能(如实时预览)但限制录制时长或导出。
- 局部特性禁用或添加水印(在屏幕录制或图像导出路径中处理)。
- 容错与灰度:
- 支持 `grace_days` 宽限期(网络异常或时间漂移时可用)。
- 缓存最近一次有效授权状态,定时复核(避免频繁磁盘访问)。
### 前端集成Electron + 前端页面)
- 激活流程:
- 提供激活页:显示 `machine_id` 与授权状态。
- 在线激活:提交序列号/订单号至授权服务器,服务端返回签名授权文件;前端保存至 `[LICENSE].path`
- 离线激活:导出激活请求文件(含 `machine_id` 与产品信息),由管理员获取授权文件后导入。
- 交互与提示:
- 主界面顶部/设置页显示授权状态与到期时间。
- 到期前 7/15 天提醒,试用版显示限制说明。
- 授权失效时提供指引按钮(联系支持/打开激活页)。
## 安全策略与对抗
- 授权文件签名验证:后端使用公钥验证 `signature`,拒绝未签名或签名不匹配的授权。
- 硬件指纹防篡改:
- 组合多项硬件指标fallback 与去重策略避免单项变化导致不可用。
- 指纹哈希,不原样存储,保护隐私。
- 反调试与完整性检测(可选):
- 检测调试器或关键文件篡改(哈希校验),异常时降级或停止。
- 日志与审计:
- 授权校验、激活、失效事件写入日志与数据库,便于问题定位。
## 关键实现要点(建议代码位置)
- 授权模块:`backend/devices/utils/license_manager.py`(新增)
- 方法示例:
- `get_machine_id()`: 采集硬件信息并生成指纹。
- `load_license(path)`: 读取并解析授权文件。
- `verify_signature(license, public_key_path)`: 验证数字签名。
- `check_validity(license, machine_id, now, grace_days)`: 有效期与绑定校验。
- 后端入口:`backend/main.py`
-`AppServer.init_app()` 中:
- 加载 `ConfigManager` → 初始化授权模块 → 设置 `self.license_status`
- 根据 `self.license_status` 控制设备初始化与 API 开放范围。
- 装饰器示例:
```python
def require_license(feature=None):
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
status = current_app.server.license_status # 假设注入到 app 上下文
if not status.valid:
return jsonify({'success': False, 'error': status.message}), 403
if feature and not status.features.get(feature, True):
return jsonify({'success': False, 'error': f'未授权功能: {feature}'}), 403
return f(*args, **kwargs)
return wrapper
return decorator
```
## 运行与配置
- `config.ini`
```ini
[LICENSE]
path = D:/BodyCheck/License/license.json
public_key = D:/BodyCheck/License/license_pub.pem
grace_days = 7
```
- 授权文件放置:默认 `data/license.json`(开发环境),打包环境放置在 `exe` 同级 `data`
- 前端激活保存位置与读取与后端一致(通过 API 或直接写入文件)。
## 运维与发行
- 发行流程:
1. 客户安装并启动软件,生成 `machine_id`
2. 客服/授权服务器生成签名授权文件(绑定 `machine_id`)。
3. 客户端导入授权文件或在线激活自动拉取授权。
- 续期与升级:
- 续期生成新授权文件(同一 `license_id` 或新 ID替换旧文件。
- 新版本可通过 `version``features` 差异化控制功能包。
- 撤销与黑名单(可选,在线):
- 维护撤销列表并在在线校验时拒绝。
## 兼容与开发模式
- 开发/测试模式:
- 允许通过环境变量或配置启用 `dev_mode`,免授权检查,仅限开发构建。
- 生产打包时移除或加固该入口,避免被滥用。
## 风险与缓解
- 时间篡改:使用授权签发时间与过期时间 + 宽限期校验;可选在线时间校准。
- 硬件变更:提供有限容差与人工重新授权流程。
- 文件丢失:提示恢复授权或联系支持,保留试用/降级模式保障基本可用。
## 里程碑与落地计划(建议)
1. 新增 `license_manager.py` 与后端集成(校验、装饰器、状态注入)
2.`main.py` 中接入授权校验,限制关键 API
3. 前端新增激活页与状态展示(在线/离线两个流程)
4. 授权服务器与私钥管理上线(可选轻量版)
5. 运维流程与支持文档完善(续期、撤销、迁移)
---
如需,我可以直接在代码库中新增 `license_manager.py``main.py` 的集成改造示例,及前端激活页的基本骨架。