7.5 KiB
7.5 KiB
软件使用授权控制方案(BodyBalanceEvaluation)
本文档针对 BodyBalanceEvaluation 的当前技术架构(Electron + 前端、Python Flask 后端、Windows 打包)设计一套合理、可落地的软件使用授权控制方案。方案兼顾离线可用、安全可靠、易于运维与用户体验。
目标与原则
- 合法控制软件使用范围与授权期限,满足试用、商用等场景。
- 支持离线运行(无网络环境),可选在线激活与续期。
- 与当前项目架构低耦合,易于集成与维护。
- 安全合规:私钥不落地、授权文件不可伪造、关键流程可审计。
授权类型
- 试用授权(Trial):
- 有效期短(如 7/14/30 天),功能有限制(如录制时长、导出功能、带水印)。
- 标准授权(Per-Device):
- 绑定单机硬件指纹,在有效期内完整功能可用。
授权架构设计
- 离线优先 + 在线可选:
- 核心授权依赖本地授权文件(License File)。
- 在线激活与续期通过授权服务器获取签名授权文件。
- 授权文件(License)格式:JSON + 数字签名(RSA/ECC):
- 字段示例:
{ "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.pyconfig.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 开放范围。
- 加载
- 装饰器示例:
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:[LICENSE] path = D:/BodyCheck/License/license.json public_key = D:/BodyCheck/License/license_pub.pem grace_days = 7- 授权文件放置:默认
data/license.json(开发环境),打包环境放置在exe同级data。 - 前端激活保存位置与读取与后端一致(通过 API 或直接写入文件)。
运维与发行
- 发行流程:
- 客户安装并启动软件,生成
machine_id。 - 客服/授权服务器生成签名授权文件(绑定
machine_id)。 - 客户端导入授权文件或在线激活自动拉取授权。
- 客户安装并启动软件,生成
- 续期与升级:
- 续期生成新授权文件(同一
license_id或新 ID),替换旧文件。 - 新版本可通过
version或features差异化控制功能包。
- 续期生成新授权文件(同一
- 撤销与黑名单(可选,在线):
- 维护撤销列表并在在线校验时拒绝。
兼容与开发模式
- 开发/测试模式:
- 允许通过环境变量或配置启用
dev_mode,免授权检查,仅限开发构建。 - 生产打包时移除或加固该入口,避免被滥用。
- 允许通过环境变量或配置启用
风险与缓解
- 时间篡改:使用授权签发时间与过期时间 + 宽限期校验;可选在线时间校准。
- 硬件变更:提供有限容差与人工重新授权流程。
- 文件丢失:提示恢复授权或联系支持,保留试用/降级模式保障基本可用。
里程碑与落地计划(建议)
- 新增
license_manager.py与后端集成(校验、装饰器、状态注入) - 在
main.py中接入授权校验,限制关键 API - 前端新增激活页与状态展示(在线/离线两个流程)
- 授权服务器与私钥管理上线(可选轻量版)
- 运维流程与支持文档完善(续期、撤销、迁移)
如需,我可以直接在代码库中新增 license_manager.py 与 main.py 的集成改造示例,及前端激活页的基本骨架。