- • 用 DB 行锁 (SELECT FOR UPDATE) 或 Redis 原子操作
- • 领取与删除必须同事务, 不能"先返回再删"
- • 出错时回滚, 防止 OPK 丢失或重复使用
- • 也可记录使用日志, 用于审计
- • X3DH 缩水为 3DH(不计算 DH₄)
- • 仍然完成会话, 但失去 OPK 提供的额外保障
- • 会话密钥来自 IK + SPK (中期) + EK (临时)
- • 产品上应给"高活跃用户"分配更大池子
- • 启动时: 查询服务端的池剩余数
- • 周期性: 每天或每周拉取告警
- • 阈值: 剩余低于 10 时立即补到 100
- • 网络恢复后: 优先重传未完成的补充请求
- • 池耗尽 DoS: 攻击者大量 fetch → 客户端补充慢
- • 重放: 服务端必须删除已用 OPK, 否则可被重放
- • 伪造: 上传必须 IK 签名, 防止他人冒充
- • 应对: 限频 fetch + 快速补充 + 监控告警
💡 一句话理解:
OPK 不是"加密用的钥匙", 而是"会话隔离的种子"——
服务端必须像发"一次性入场券"那样把它发出去, 发完就撕。
池耗尽时降级到 3DH 是为可用性付出的代价, 客户端定期补货是消费方的责任。
📚 基础知识速查 · Reference
不熟悉以下底层概念? 这里是 30 秒回顾。
数据库ACID Transaction
原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation)、持久性 (Durability)。OPK 领取必须在事务里完成。
BEGIN; ... COMMIT;
SQLSELECT FOR UPDATE
行级悲观锁。防止并发请求拿到同一行。也可用 Redis SETNX、ZK 等价机制实现。
SELECT * FROM opk WHERE bob
FOR UPDATE SKIP LOCKED LIMIT 1;
设计模式Single-Use Token
一次性令牌模式。常用于 CSRF token、邮箱验证、OAuth 授权码、OPK 等场景。共同特征: 验证后立即作废。
CSRF · email-verify · auth_code · OPK
安全Replay Attack
攻击者重放旧合法消息触发动作 (如重复扣款)。OPK single-use 是 Signal 抗 replay 的关键之一 — 旧 OPK 不能再次握手。
defense: nonce + single-use + timestamp