1. 核心设计理念
本方案旨在解决低成本硬件(手办)与高安全需求(文旅支付/身份/权益)之间的矛盾。核心思想是“能力分层,信任传递”:
- 手机 (Smart Wallet):信任锚点。拥有算力、存储、联网能力和生物识别,负责密钥管理、复杂验证、证书申请。
- 手办 (Dumb Token):展示终端。拥有低功耗蓝牙、NFC、屏幕/灯光,负责临时凭证存储、近场广播、物理交互。
- 云端/协议 (Trust Issuer):规则制定者。负责签发数字证书、维护吊销列表、定义活动逻辑。
信任链条:用户生物特征 ➔ 解锁手机私钥 ➔ 签名申请证书 ➔ 云端签发 ➔ 手机验证并同步 ➔ 手办持有临时凭证 ➔ 现场核销
2. 架构分层详解
📱 第一层:智能管家层 (手机 App)
角色:用户的数字钱包与安全代理。
核心职责:
- 密钥托管:生成并存储用户 Nostr 私钥 (
nsec) 于系统级安全区 (iOS Keychain / Android Keystore)。私钥永不离开手机,更不进入手办。 - 证书管理:
- 向活动方申请数字证书 (JSON + 签名)。
- 验证证书签名的合法性及有效期。
- 维护本地“吊销列表 (CRL)”。
- 同步桥接:
- 通过 BLE/NFC 将脱敏后的临时凭证写入手办。
- 定期校准手办系统时间(防止时间作弊)。
- 回收过期或已吊销的凭证。
- 兜底交互:当手办没电或未携带时,直接由手机屏幕展示动态二维码完成所有交互。
🧸 第二层:可信终端层 (旺财手办)
角色:低功耗、可信赖的物理载体。
硬件配置:ESP32-C3/S3 (低成本), 小容量 Flash, NFC 标签/读写器, RGB LED, 微型屏幕 (可选)。
核心职责:
- 凭证暂存:仅存储手机下发的lite Certificate (精简版证书,含活动ID哈希、过期时间、角色码)。不存私钥,不存完整身份信息。
- 时间守卫:内置 RTC (实时时钟),依据手机校准的时间,自动判断凭证是否过期。过期即焚(内存清除)。
- 近场广播:
- 周期性广播 BLE 广告包:
[活动ID哈希] + [角色码] + [随机Nonce]。 - 隐私保护:广播中不含用户公钥,防止被远程追踪。
- 周期性广播 BLE 广告包:
- 物理交互:
- 被 NFC 读取时,输出暂存的 lite Certificate。
- 根据凭证状态改变灯光/表情(如:有效亮绿灯,过期亮红灯)。
☁️ 第三层:共识发行层 (云端/中继)
角色:活动主办方、景区管委会、Nostr 中继。
核心职责:
- 证书签发:
- 接收手机发起的申请请求。
- 验证用户资格 (如:已购票、已报名)。
- 使用机构私钥对证书内容签名,生成
Signed Certificate。
- 状态公示:
- 在 Nostr 中继或 Matrix 房间发布吊销列表 (CRL) (如:发现作弊用户)。
- 发布活动元数据 (活动ID、规则、公钥)。
- 核销验证:
- 商户端 (手机/POS) 读取手办凭证后,利用机构公钥在线/离线验证签名真实性。
3. 核心数据结构设计
为了适应手办的有限资源,采用双版本证书结构。
A. 完整证书 (Full Certificate) – 存于手机
json
1{
2 "version": "1.0",
3 "event_id": "uuid_v4_string",
4 "user_pubkey": "npub1...",
5 "role": "vip_explorer",
6 "issued_at": 1709100000,
7 "expires_at": 1709186400,
8 "nonce": "random_string",
9 "signature": "ECDSA_Signature_By_Issuer" // 64-72 字节
10}
B. 精简凭证 (Lite Token) – 存于手办 (约 20-30 字节)
c
1struct LiteToken {
2 uint32_t event_hash; // 4字节:活动ID的前4字节哈希 (用于快速匹配)
3 uint32_t expires_ts; // 4字节:过期时间戳
4 uint8_t role_code; // 1字节:角色代码 (0=普通,1=VIP, 2=工作人员)
5 uint8_t flags; // 1字节:标志位 (bit0=已核销,bit1=黑名单)
6 uint16_t sig_trunc; // 2字节:签名的截断值 (用于防随机篡改,非强验证)
7};
注:手办只负责检查 expires_ts 和 flags。强签名验证由读取手办数据的商户终端完成。
4. 关键业务流程
流程一:证书申请与同步 (Issue & Sync)
- 申请:用户在 App 点击“领取勋章”。App 用本地私钥签名请求,发送至服务端。
- 签发:服务端验证通过后,返回
Signed Full Certificate。 - 验证:App 使用服务端公钥验证签名,确认无误后存入本地数据库。
- 同步:
- 用户打开 App,靠近手办 (BLE 连接)。
- App 提取
Lite Token数据。 - App 读取手办当前时间,若偏差>5分钟,先校准手办时间。
- App 将
Lite Token写入手办 Flash。 - 手办校验写入数据完整性,激活凭证,改变灯光效果。
流程二:现场互动与核销 (Interact & Verify)
- 感知:游客走近商户。手办广播
event_hash。 - 触发:商户信标/手机扫描到广播,发现是感兴趣的活动,提示“发现 VIP 游客”。
- 读取:
- 方式 A (被动):游客用手办碰触商户 NFC 区域。
- 方式 B (主动):商户手机通过 BLE 连接手办请求数据。
- 传输:手办发送
Lite Token。若商户需要更高安全性,可请求 App 弹出Full Certificate(通过手机屏幕二维码展示)。 - 验证:
- 商户终端检查
expires_ts(当前时间 < 过期时间)。 - 商户终端联网拉取最新 CRL,检查
event_hash是否在黑名单。 - (可选) 若是高价值交易,要求用户手机出示
Full Certificate进行完整签名验证。
- 商户终端检查
- 核销:验证通过,商户终端发送“核销指令” (带商户签名) 给手办/App。手办标记
flags中的“已核销”位,防止重复刷分。
流程三:过期与吊销 (Expire & Revoke)
- 自然过期:手办内部 RTC 检测到
current_time > expires_ts,自动擦除Lite Token,恢复默认状态。 - 主动吊销:
- 官方发现作弊,在 Nostr 中继发布 CRL。
- 用户手机联网拉取 CRL。
- 手机下次连接手办时,发现手中证书已在 CRL 中,强制下发“清除指令”,手办立即失效。
5. 安全与隐私防御矩阵
表格
| 风险点 | 攻击手段 | 防御策略 (分层架构) |
|---|---|---|
| 私钥泄露 | 破解手办固件读取私钥 | 私钥根本不在手办。手办丢了也只是丢个临时令牌,且会过期。 |
| 伪造证书 | 自行编写假数据写入手办 | 手办只存截断签名。商户终端会校验完整签名 (需手机配合) 或联网核对官方哈希。且伪造者无法获得官方私钥签名。 |
| 时间作弊 | 修改手办时间延长有效期 | 手办时间每次同步都由手机校准 (手机时间是网络时间)。且证书有效期短 (如24h),误差容忍度低。 |
| 重放攻击 | 录制广播信号反复播放 | 广播包中加入随机 Nonce (每秒变化)。商户端校验 Nonce 的新鲜度。 |
| 隐私追踪 | 扫描广播包追踪用户轨迹 | 广播包中无用户 ID,只有活动哈希。且 Nonce 随机变化,无法关联同一设备。 |
| 永久失效 | 证书过期后仍被使用 | 手办硬件级自动擦除。商户端二次校验时间戳。 |
6. 实施路线图
Phase 1: 基础原型 (MVP)
- 目标:跑通“手机发证 -> 手办显示 -> 简单核销”。
- 功能:
- 实现 App 与 ESP32 手办的 BLE 通信协议。
- 实现基于时间戳的自动过期逻辑。
- 商户端使用另一台手机作为验证器。
- 场景:单个咖啡馆的打卡活动。
Phase 2: 安全增强
- 目标:引入密码学验证与防作弊。
- 功能:
- 集成 Nostr 签名库到 App。
- 实现 CRL 吊销列表机制。
- 增加广播包随机 Nonce 机制。
- 场景:小型文创市集 (10+ 商户)。
Phase 3: 生态互联
- 目标:跨活动、跨景区互通。
- 功能:
- 部署公共 Nostr 中继作为证书分发与 CRL 同步节点。
- 开发商户通用验证 App (支持多活动配置)。
- 实现“勋章合成”与“跨店权益”逻辑。
- 场景:全城文旅联动。
7. 总结
本方案通过“手机管密钥,手办管展示,云端管规则”的分层设计,完美平衡了安全性、成本与体验:
- 极低成本:手办无需昂贵安全芯片,BOM 成本可控在 40 元内。
- 极高安全:私钥不出手机,证书动态过期,天然防克隆、防重放。
- 极佳体验:用户无感同步,手办即时反馈,过期自动清理,无需人工干预。
- 灵活运营:活动随时发,证书随时吊销,支持大规模并发与复杂逻辑。
这是一个可落地、可演进、可信赖的文旅物联网架构,为“旺财”从玩具进化为数字生活伴侣奠定了坚实基础。
进一步方案欢迎来电咨询。