依据文档:
docs/客户端exe技术方案.md(v1.3.0)
检查范围:client-tauri(前端 + Rust 命令)、backend-client(FastAPI 接口)
| 维度 | 符合情况 | 说明 |
|---|---|---|
| 后端接口覆盖 | ✅ 基本符合 | 认证、心跳、公告、密钥、用户、Steam、HMAC 等路由已实现 |
| 客户端命令 | ✅ 基本符合 | 安全登录/注册/解绑/充值、公告、密钥管理、心跳、机器码等已实现 |
| 安全通信 | ⚠️ 部分差异 | 心跳/用户信息请求未走 AES+RSA;公钥获取方式与文档不一致 |
| 接口日志 4.4 | ⚠️ 部分符合 | 有 ASGI 日志中间件与 api_logs;DB 存的是密文,文档 4.5 要求存明文 |
| 前端结构 | ✅ 基本符合 | 有 Login/Home/Settings/Steam 等视图与 auth/config/heartbeat store |
| 文档要求 | 后端实现 | 状态 |
|---|---|---|
| POST /api/auth/login (AES+RSA) | @secure_endpoint POST /v1/auth/login |
✅ |
| POST /api/auth/register (AES+RSA) | @secure_endpoint POST /v1/auth/register |
✅ |
| POST /api/auth/recharge (AES+RSA) | @secure_endpoint POST /v1/auth/recharge |
✅ |
| POST /api/auth/unbind (AES+RSA) | @secure_endpoint POST /v1/auth/unbind |
✅ |
| POST /api/heartbeat (AES+RSA,需登录) | POST /v1/heartbeat 接收明文 HeartbeatRequest,响应用 create_encrypted_response |
⚠️ 请求未加密 |
| POST /api/user/profile (AES+RSA,需登录) | POST /v1/user/profile 接收明文 dict,响应加密 |
⚠️ 请求未加密 |
| GET/POST /api/announcements | GET /v1/announcements 明文;POST /v1/announcements 为 @secure_endpoint |
✅ |
| POST /api/keys/public (AES) | POST /v1/keys/public 已实现(加密响应) |
✅ |
| GET /api/keys/public | GET /v1/keys/public 明文返回公钥 |
✅ |
| POST /api/keys/sync (已登录) | 未单独实现,可与 keys/public 或心跳配合 | ⚠️ 文档有描述,后端无独立 sync 路由 |
| POST /api/keys/hmac | POST /v1/keys/hmac 动态 HMAC 密钥 |
✅ |
| Steam 绑定/解绑/列表 | POST/GET/PUT/DELETE /v1/steam/accounts |
✅ |
路由挂载:app/include_router(api_router, prefix="/api"),v1 在 api_router 下 prefix="/v1",故实际路径为 /api/v1/...,与文档中「/api/」表述一致(文档未强制写 v1)。
secure_endpoint:已实现解密请求、验证签名/时间戳/nonce、会话与机器码校验(需登录时)、create_encrypted_response 生成响应签名并加密。create_encrypted_response 生成 response_signature;客户端在 commands.rs 中有 verify_response_signature。/api/v1/keys/hmac、hmac_key_service 已存在。request_data、response_data、endpoint、method、response_code、execution_time 等。api_logs、users、sessions、cards、system_config、密钥等模型;配置从 system_config 读取,与文档一致。| 文档/方案要求 | 实现 | 状态 |
|---|---|---|
| 安全登录 | secure_user_login,AES+RSA + 响应签名校验 |
✅ |
| 安全注册 | secure_user_register |
✅ |
| 安全解绑 | secure_user_unbind |
✅ |
| 安全充值 | secure_user_recharge |
✅ |
| 安全公告 | secure_get_announcements |
✅ |
| RSA 公钥分段存储 | store_rsa_key_segments / retrieve_rsa_key_segments、噪声处理 |
✅ |
| 密钥管理 | initialize_key_manager、refresh_key_if_needed、has_stored_rsa_key、get_key_manager_status 等 |
✅ |
| 动态 HMAC | sync_hmac_key、has_valid_hmac_key、get_hmac_key_status、sync_hmac_key_command |
✅ |
| 机器码 | get_machine_code(硬盘序列号+MAC,文档 3.1) |
✅ |
| 心跳 | execute_heartbeat、start_heartbeat_service、stop_heartbeat_service、get_heartbeat_config_command 等 |
✅ |
| 获取用户信息 | get_user_profile:明文 POST /api/user/profile |
⚠️ 与文档「AES+RSA」不一致 |
/api/keys/public,请求体为 AES 加密(含机器特征),响应为加密公钥。key_manager.initialize_key_manager 使用 GET /api/v1/keys/version 获取版本与公钥(明文)。api_client.get_public_key 使用 GET /api/v1/keys/public(明文)。/api/v1/keys/public 并走加密请求/响应。heartbeat.rs 中 execute_heartbeat 使用 明文 JSON {"session_id","machine_code"} POST 到 /api/v1/heartbeat,响应端解析 encrypted_data 并解密。tauri_plugin_single_instance 已在 main.rs 中使用,符合「已运行则激活窗口并退出当前」的描述。心跳接口
/v1/heartbeat 改为 @secure_endpoint(或同等解密与签名逻辑);客户端改为与 secure_user_login 类似的加密请求 + 响应签名校验。用户信息接口
session_id/machine_code,仅响应加密;客户端 get_user_profile 发明文。@secure_endpoint,客户端改为安全加密调用(与登录/公告一致)。RSA 公钥获取(启动流程)
/api/v1/keys/public,并实现请求加密与响应解密(后端 POST 已支持加密响应)。api_logs 表内容(4.5)
| 项目 | 后端 | 客户端 | 备注 |
|---|---|---|---|
| 登录/注册/解绑/充值 (AES+RSA) | ✅ | ✅ | 一致 |
| 公告 (AES+RSA) | ✅ | ✅ | POST 安全端点 + secure_get_announcements |
| 心跳 (AES+RSA) | ⚠️ 仅响应加密 | ⚠️ 请求明文 | 建议请求也加密 |
| 用户信息 (AES+RSA) | ⚠️ 仅响应加密 | ⚠️ 请求明文 | 建议改为安全端点 |
| RSA 公钥获取 (POST+AES) | ✅ POST 已实现 | ⚠️ 使用 GET 明文 | 启动流程可改为 POST |
| 动态 HMAC | ✅ | ✅ | 已实现 |
| RSA 分段存储 / 响应签名校验 | - | ✅ | 已实现 |
| 机器码 (硬盘+MAC) | - | ✅ | 已实现 |
| 单例进程 | - | ✅ | 已实现 |
| 接口日志 4.4(文件+控制台) | ✅ | - | 已实现 |
| api_logs 4.5(明文+脱敏) | ⚠️ 当前存密文 | - | 建议按文档存明文并脱敏 |
报告生成说明:本报告基于对 client-tauri/、backend-client/ 及 docs/客户端exe技术方案.md 的静态阅读与 grep 检索整理,未执行运行时测试。实施上述建议时请在测试环境验证后再上线。