跳转至

安全模型

LedgerFlow 的安全模型建立在密码学绑定、类型化约束和时间绑定权限之上。每个授权决策都是确定性的、无需网络调用即可验证的,并产生防篡改的审计轨迹。

核心安全属性

属性 机制
范围化 类型化约束将权限限制到特定商户、工具、金额
时间性 授权令过期;通过时间戳 + nonce 强制执行证明新鲜性
绑定 证明密码学绑定到精确的 x402 报价和 HTTP 请求
可委托 单调递减确保委托只能缩小权限
防重放 原子 nonce 存储配合 TTL 防止重放攻击

重放保护

重放保护结合新鲜性和幂等性。

新鲜性

  • created_at_ms 必须在 60 秒验证窗口内
  • 窗口外 → 拒绝为过期或预设日期

基于 Nonce 的重放检测

验证器使用原子插入存储 challenge_id + nonce

SET challenge_id:nonce 1 PX 300000 NX

如果键已存在 → 拒绝为重放。

幂等重试

如果相同的 x402 请求使用相同的支付标识符重试:

  • 返回缓存的先前结果(成功或失败)
  • 不重新验证或重新结算

如果相同的 nonce 出现在不同的 request_hashaccepted_hash 中:

  • 立即拒绝为重放

签名验证

授权令签名

授权令签名覆盖授权令信封的规范签名字节:

ED25519_VERIFY(
    issuer.public_key,
    SHA256(canonical_warrant_bytes),
    warrant.signature
)

证明签名

证明签名覆盖证明原像:

ED25519_VERIFY(
    subject_signer.public_key,
    SHA256(CBOR(proof_preimage)),
    proof.signature
)

两者都必须通过。任一失败都会拒绝授权。

威胁模型

防护的威胁

威胁 防御
提示注入 → 未授权支付 即使代理被劫持,类型化约束也限制范围
凭证窃取 授权令不是凭证;窃取授权令只授予有限权限
重放攻击 基于 nonce 的检测配合原子 TTL 存储
过期授权令使用 验证时强制执行时间有效性窗口
未授权委托 单调递减 + max_depth 强制执行
跨商户授权令重用 受众范围约束

超出范围

威胁 原因
发行者密钥被劫持 如果发行者密钥被劫持,所有签发的授权令都存疑。密钥轮换和撤销计划在 v2。
侧信道攻击 密码学实现在协议范围之外
网络级攻击 假设 TLS 和传输安全
LLM 幻觉 LedgerFlow 约束代理做什么,而非应该做什么

撤销

LedgerFlow v1 使用简单的撤销模型:

  • 短期授权令 — 默认过期时间以分钟计,减少撤销窗口
  • 授权令 ID 黑名单 — 发行者可以发布撤销的授权令 ID 列表
  • 商户端缓存 — 商户可以本地检查撤销的授权令 ID

未来:一致性令牌

v2 可能引入受 Zanzibar Zookies 或 SpiceDB ZedTokens 启发的新鲜性令牌:

  • 发行者发布带有一致性令牌的撤销快照
  • 验证器在授权决策中包含令牌
  • 保证跨分布式状态的新鲜性

这明确是 v2 扩展,不是 v1 要求。

密钥管理

签名密钥轮换

  • 定期轮换签名密钥
  • 旧授权令在过期前仍然有效(短期 TTL)
  • 自然过期不需要撤销

发行者密钥安全

  • 发行者密钥应存储在安全飞地或 HSM 中
  • 永远不要将发行者密钥嵌入代理代码
  • 不同委托级别使用不同密钥

实现陷阱

应该做

  • 使用确定性 CBOR 进行规范编码
  • 验证证明绑定到 accepted_hashrequest_hash
  • 使用原子 nonce 插入(永远不要检查后设置)
  • 保持验证仅 CPU(无网络调用)
  • 任何验证错误时关闭失败

不应该做

  • 仅按签名者缓存(使用 warrant_digest
  • 接受 expires_at 超过 90 天的授权令
  • 为"受信任"代理跳过重放保护
  • 委托期间允许约束扩展
  • 使用非规范序列化进行摘要计算

参见