安全模型¶
LedgerFlow 的安全模型建立在密码学绑定、类型化约束和时间绑定权限之上。每个授权决策都是确定性的、无需网络调用即可验证的,并产生防篡改的审计轨迹。
核心安全属性¶
| 属性 | 机制 |
|---|---|
| 范围化 | 类型化约束将权限限制到特定商户、工具、金额 |
| 时间性 | 授权令过期;通过时间戳 + nonce 强制执行证明新鲜性 |
| 绑定 | 证明密码学绑定到精确的 x402 报价和 HTTP 请求 |
| 可委托 | 单调递减确保委托只能缩小权限 |
| 防重放 | 原子 nonce 存储配合 TTL 防止重放攻击 |
重放保护¶
重放保护结合新鲜性和幂等性。
新鲜性¶
created_at_ms必须在 60 秒验证窗口内- 窗口外 → 拒绝为过期或预设日期
基于 Nonce 的重放检测¶
验证器使用原子插入存储 challenge_id + nonce:
如果键已存在 → 拒绝为重放。
幂等重试¶
如果相同的 x402 请求使用相同的支付标识符重试:
- 返回缓存的先前结果(成功或失败)
- 不重新验证或重新结算
如果相同的 nonce 出现在不同的 request_hash 或 accepted_hash 中:
- 立即拒绝为重放
签名验证¶
授权令签名¶
授权令签名覆盖授权令信封的规范签名字节:
证明签名¶
证明签名覆盖证明原像:
两者都必须通过。任一失败都会拒绝授权。
威胁模型¶
防护的威胁¶
| 威胁 | 防御 |
|---|---|
| 提示注入 → 未授权支付 | 即使代理被劫持,类型化约束也限制范围 |
| 凭证窃取 | 授权令不是凭证;窃取授权令只授予有限权限 |
| 重放攻击 | 基于 nonce 的检测配合原子 TTL 存储 |
| 过期授权令使用 | 验证时强制执行时间有效性窗口 |
| 未授权委托 | 单调递减 + max_depth 强制执行 |
| 跨商户授权令重用 | 受众范围约束 |
超出范围¶
| 威胁 | 原因 |
|---|---|
| 发行者密钥被劫持 | 如果发行者密钥被劫持,所有签发的授权令都存疑。密钥轮换和撤销计划在 v2。 |
| 侧信道攻击 | 密码学实现在协议范围之外 |
| 网络级攻击 | 假设 TLS 和传输安全 |
| LLM 幻觉 | LedgerFlow 约束代理能做什么,而非应该做什么 |
撤销¶
LedgerFlow v1 使用简单的撤销模型:
- 短期授权令 — 默认过期时间以分钟计,减少撤销窗口
- 授权令 ID 黑名单 — 发行者可以发布撤销的授权令 ID 列表
- 商户端缓存 — 商户可以本地检查撤销的授权令 ID
未来:一致性令牌¶
v2 可能引入受 Zanzibar Zookies 或 SpiceDB ZedTokens 启发的新鲜性令牌:
- 发行者发布带有一致性令牌的撤销快照
- 验证器在授权决策中包含令牌
- 保证跨分布式状态的新鲜性
这明确是 v2 扩展,不是 v1 要求。
密钥管理¶
签名密钥轮换¶
- 定期轮换签名密钥
- 旧授权令在过期前仍然有效(短期 TTL)
- 自然过期不需要撤销
发行者密钥安全¶
- 发行者密钥应存储在安全飞地或 HSM 中
- 永远不要将发行者密钥嵌入代理代码
- 不同委托级别使用不同密钥
实现陷阱¶
应该做¶
- 使用确定性 CBOR 进行规范编码
- 验证证明绑定到
accepted_hash和request_hash - 使用原子 nonce 插入(永远不要检查后设置)
- 保持验证仅 CPU(无网络调用)
- 任何验证错误时关闭失败
不应该做¶
- 仅按签名者缓存(使用
warrant_digest) - 接受
expires_at超过 90 天的授权令 - 为"受信任"代理跳过重放保护
- 委托期间允许约束扩展
- 使用非规范序列化进行摘要计算