第 6 章 隐私与 GMC 接口

本章描述 FayID 体系的两条硬约束:Human ID 不出站不入日志,以及 GMC Interface 的只读边界。这两条约束是 FayID 作为 Global Merit Chain 长期身份层的安全前提。


隐私硬约束

出站载荷规则

定义"出站载荷"为:FayID System 之外(包括第三方资源、传统鉴权来源、Global Merit Chain、可观测性后端)所能观察到的任意字节流。

实体是否允许在出站载荷中以明文出现
Human ID禁止,除非该次通信明确以 Human ID 自证为目的
Mnemonic禁止,无任何例外
Private Key禁止,无任何例外
iFay ID / coFay ID / Organization ID允许
Dynamic Code允许
Verification Code仅与 coFay ID 配对出现,不单独广播
Authorization Grant允许

日志与可观测性

log_allow  := { dynamicCode, ifayID, cofayID, organizationID, grantID, errorCode }
log_deny   := { humanID(明文), mnemonic, privateKey, verificationCode(明文) }

实现侧的日志器必须以白名单方式过滤:任何序列化路径在写入日志前必须经过 redact 步骤。

简言之:Human ID 明文与 Mnemonic 永远不出现在外部可观察的字节流中——无论是网络包、日志文件,还是审计输出。


Dynamic Code 不可关联性

设计意图

外部观察者拿到两个 Dynamic Code 字面量,无法判断它们是否出自同一 Human ID。这是动态码作为 Human ID 公开代理的核心隐私性质。

设计依据

Dynamic Code 的派生过程使用:

  • 每次新 nonce:使两次输出在统计意义上独立
  • Issuer 私有 ikm:使外部观察者无法本地复现派生函数
  • 类型前缀 + 时间窗:使 Dynamic Code 与其他实体在字面量上不混淆,但不引入额外的可关联标记

由此,外部观察者拿到两个 Dynamic Code 字面量,所能做的最强统计推断不超过随机猜测。

这是 design 文档中 Property P9 的密码学基础。


所有权列表查询的访问控制

规则

  • listIFayIDsOfHuman(proofOfHuman) 必须proofOfHuman 通过后才返回结果
  • 未通过时返回 HUMAN_ID_OWNERSHIP_NOT_PROVEN
  • Resolver 不提供"按 Human ID 反查 iFay ID 列表"的匿名接口

设计动机

避免外部观察者通过反查接口收集"某个 Human ID 名下有哪些 iFay 人格"的关联信息——这等同于变相暴露 Human ID 的活动画像。


GMC Interface 边界

角色定位

GMC Interface 是 FayID System 与 Global Merit Chain(全球信誉链)之间的唯一通道。它的设计原则是:

只读 + 不可逆 + 不暴露根身份

暴露给 GMC 的方法

// 只读
gmcLookupOwnership(ifayIDOrCofayID)
  -> { ownerKind: "HUMAN" | "ORGANIZATION",
       ownerOpaqueRef: string }

gmcResolvePublicEntity(idString)
  -> { kind: "IFAY" | "COFAY" | "ORGANIZATION",
       revoked: bool,
       displayMetadata: opaque }

显式禁止的方向

// 不存在 — 协议层禁止反向写入
// gmcWriteHumanID(humanID)
// gmcWriteMnemonic(mnemonic)
// gmcWritePrivateKey(...)

通过"该方法在 IDL 中不存在"的方式实现禁止,而非运行期校验。这使得反向写入在协议层就不可能发生。


opaqueRef(不可逆引用)

派生方式

opaqueRef := encode(prefix="gmcref_",
  payload = HKDF(
    ikm    = gmc_namespace_secret,         // FayID System 持有的命名空间密钥
    salt   = humanID,                       // 仅在 FayID 内部出现
    info   = "fayid/gmc/v1",
    length = 256 bit
  )
)

关键性质

性质说明
稳定性同一 Human ID 派生的 opaqueRef 稳定相等,使 GMC 上的信誉记录可长期累积
抗碰撞不同 Human ID 派生的 opaqueRef 几乎处处不同
不可反推仅持有 opaqueRef 不可在多项式时间内反推 Human ID
不可关联opaqueRef 不参与 Dynamic Code 派生,二者在外部观察者视角不可关联

设计意义

opaqueRef 解决了一个核心矛盾:

  • Global Merit Chain 需要长期、稳定的自然人引用,才能累积信誉
  • 自然人的 Human ID 又必须保持隐私,不能在链上暴露

opaqueRef 正是这两者的折中——它对 Human ID 是"单向函数"的输出:稳定可比,但不可反推。


信誉关联模式

iFay / coFay / Organization 信誉

  • iFay ID、coFay ID、Organization ID 以明文形式作为信誉记录主体
  • GMC 可直接以这些 ID 为索引累积信誉

Human 信誉

  • Human ID 不直接出现在链上
  • 当信誉记录需要关联到自然人时,使用该 Human ID 的 opaqueRef 作为引用
  • 同一 Human ID 派生的 opaqueRef 在长期跨度内保持稳定

边界查询

当 Global Merit Chain 通过 GMC Interface 查询某个 iFay ID 或 coFay ID 的归属时:

  • 返回归属主体的类型(HUMAN / ORGANIZATION)
  • 在 HUMAN 情形下,返回的是 opaqueRef 而不是 Human ID 明文
  • 在 ORGANIZATION 情形下,返回 Organization ID 明文(Organization 本身就是公开的)

隐私边界总结

边界内侧(FayID System 内部)外侧(出站 / GMC / 日志)
Human ID 明文仅在 Issuer / Resolver 内部出现禁止
Mnemonic仅在生成时一次性返回给持有者禁止
Private Key仅在密钥派生路径中存在禁止
Dynamic Code内部生成允许公开
opaqueRef内部派生仅向 GMC 暴露

隐私不是"加密一下就好"——FayID 通过协议层的硬约束(IDL 不存在写入方法、出站载荷白名单、日志白名单)从结构上消除了 Human ID 明文出现在外部的可能性。