协议 / 高级 / 15 分钟

Trust Spanning Protocol(TSP)

面向可验证凭证的元数据私密路由——跨组织边界证明声明而不暴露路由细节

问题所在:跨组织凭证交换中的元数据泄露

当可验证凭证跨组织边界交换时,元数据会泄露身份信息

示例:医疗凭证交换

Alice(患者)希望 A 医院将她的病历共享给 B 医院。

传统方案:

  1. Alice 请求:“A 医院,请把我的病历发送给 B 医院”
  2. A 医院的系统会知道:Alice 请求转诊到 B 医院(暴露了她选择的医疗机构)
  3. 网络观察者会看到:A 医院 → B 医院的流量(暴露了患者的就诊轨迹)
  4. B 医院会知道:请求来自 A 医院(暴露了此前的就诊机构)

泄露的元数据:

  • ❌ Alice 去过哪些医院
  • ❌ 转诊的时间点(暴露健康事件的发生时间)
  • ❌ 医疗机构网络(聚合数据揭示 Alice 的健康就诊轨迹)

即使凭证内容已加密,这一问题依然存在。

为什么这很重要

元数据本身也是数据:

  • 监控:跨患者聚合元数据能揭示健康趋势、人口统计特征、谁在治疗谁
  • 关联:将 Alice 的医院就诊记录与药房记录、雇主健康计划、保险理赔关联起来
  • 歧视:健康保险公司在网络元数据中看到”Alice 去过癌症中心”——拒绝承保
  • 竞争情报:医院能看到患者转诊去了哪些竞争对手那里——这是有价值的商业数据

根本问题在于: 凭证交换需要路由——而路由会暴露谁在何时与谁通信

Trust Spanning Protocol(TSP) 解决了这个问题:一个路由层,能在不向中间节点甚至参与者本身暴露路由元数据的情况下,跨组织边界传递凭证。


什么是 Trust Spanning Protocol?

TSP 是由 W3C Credentials Community Group 设计的面向可验证凭证的元数据私密路由协议,并由 Affinidi 率先在生产环境中实现。

核心特性:

  1. 元数据隐私:中间节点无法看到发送方、接收方或凭证类型
  2. 不可关联性:来自同一发送方的多次凭证交换无法被相互关联
  3. 跨组织路由:无需合并目录即可跨组织边界工作
  4. 信任注册表集成:在不暴露路由信息的前提下验证路由权限
  5. 生产就绪:无需可信初始设置,无需区块链,无需中央清算机构

TSP 不是:

  • ❌ 一种传输协议(它使用 DIDComm 作为传输层)
  • ❌ 一种凭证格式(可与任何 W3C VC 配合使用)
  • ❌ 一种信任模型(使用信任注册表进行验证)

TSP 是: 一个位于 DIDComm(传输层)与可验证凭证(内容层)之间的路由层,确保跨组织交换过程中的元数据隐私。


TSP 的工作原理:高层流程

场景:跨医院凭证转移

Alice 希望 A 医院将她的医疗凭证发送给 B 医院。

不使用 TSP(元数据泄露):

Alice → A 医院: "把我的凭证发给 B 医院"
  [A 医院看到: Alice → B 医院]
  
A 医院 → B 医院: [凭证]
  [网络观察到: A 医院 → B 医院]
  [B 医院看到: 来自 A 医院]

泄露的元数据: Alice 的选择、医院间的关系、时间点。

使用 TSP(元数据私密):

Alice → TSP 中继节点 1: [加密内容: "路由至 B 医院"]
  [中继节点 1 看到: 来自 Alice 的消息,下一跳 = 中继节点 2]
  [中继节点 1 看不到: 最终目的地或 A 医院的参与]
  
TSP 中继节点 1 → TSP 中继节点 2: [加密内容: "路由至 B 医院"]
  [中继节点 2 看到: 来自中继节点 1 的消息,下一跳 = B 医院]
  [中继节点 2 看不到: 原始发送方或 A 医院的参与]
  
TSP 中继节点 2 → B 医院: [加密凭证]
  [B 医院看到: 凭证已送达]
  [B 医院看不到: 来自 A 医院,或者是 Alice 发起的请求]

受到保护的元数据:

  • ✅ 中继节点只能看到:上一跳 → 下一跳(类似 Tor)
  • ✅ B 医院看到:凭证,但看不到发送方
  • ✅ A 医院看到:凭证已发送,但(可选地)看不到接收方
  • ✅ 网络观察者看到:中继节点之间的流量,无法关联 Alice 的多次交换

TSP 架构:分层隐私保护

第 1 层:DIDComm 传输层(加密)

DIDComm 为消息提供端到端加密:

  • 发送方使用接收方的公钥加密消息
  • 只有接收方能够解密
  • 网络观察者只能看到加密的数据块

但是: DIDComm 的路由会暴露元数据——每个中继节点都能看到发送方 DID → 接收方 DID。

第 2 层:TSP 路由(元数据私密)

TSP 用洋葱路由包装 DIDComm:

  1. 洋葱加密:消息被分层加密(类似 Tor)

    • 最外层:为中继节点 1 加密(包含下一跳 = 中继节点 2)
    • 中间层:为中继节点 2 加密(包含下一跳 = B 医院)
    • 最内层:为 B 医院加密(包含凭证)
  2. 每个中继节点剥离一层

    • 中继节点 1 解密外层 → 看到”下一跳 = 中继节点 2” → 转发
    • 中继节点 2 解密中间层 → 看到”下一跳 = B 医院” → 转发
    • B 医院解密内层 → 收到凭证
  3. 没有任何一个中继节点能看到完整路径

    • 中继节点 1 只知道:消息来自 Alice,下一跳 = 中继节点 2(不知道 B 医院是最终目的地)
    • 中继节点 2 只知道:消息来自中继节点 1,下一跳 = B 医院(不知道是 Alice 发送的)
    • B 医院只知道:凭证已送达(除非凭证本身透露,否则不知道是 Alice 或 A 医院发起的)

第 3 层:信任注册表集成

问题: B 医院如何信任凭证的路由路径?

解决方案: TSP 与信任注册表(TRQP)集成:

  • 每个中继节点都在信任注册表中注册其被授权的路由能力
  • B 医院查询:“这份凭证的路由路径是否有效?” → 信任注册表确认中继节点已获授权
  • 元数据隐私得以保持:信任注册表的查询会显示凭证已送达,但不会透露路由细节

TSP 消息结构:洋葱分层

示例:Alice → B 医院(经过 2 个中继节点)

第 4 层(最内层):凭证载荷

{
  "type": "VerifiableCredential",
  "issuer": "did:webvh:hospital-a",
  "credentialSubject": {
    "id": "did:webvh:alice",
    "medicalRecord": "..."
  },
  "proof": { ... }
}

加密对象:B 医院的公钥

第 3 层:中继节点 2 的指令

{
  "nextHop": "did:webvh:hospital-b",
  "payload": [ 4 层加密数据块]
}

加密对象:中继节点 2 的公钥

第 2 层:中继节点 1 的指令

{
  "nextHop": "did:webvh:relay-2",
  "payload": [ 3 层加密数据块]
}

加密对象:中继节点 1 的公钥

第 1 层(最外层):Alice 发送

{
  "from": "did:webvh:alice",
  "to": "did:webvh:relay-1",
  "payload": [ 2 层加密数据块]
}

每一跳的处理过程:

  1. 中继节点 1 收到消息

    • 用自己的私钥解密第 2 层
    • 看到:nextHop = "did:webvh:relay-2"
    • 看不到:B 医院(加密在第 3 层)、凭证(加密在第 4 层)
    • 将第 3 层数据块转发给中继节点 2
  2. 中继节点 2 收到消息

    • 用自己的私钥解密第 3 层
    • 看到:nextHop = "did:webvh:hospital-b"
    • 看不到:Alice(第 3 层不含发送方信息)、凭证(加密在第 4 层)
    • 将第 4 层数据块转发给 B 医院
  3. B 医院收到消息

    • 用自己的私钥解密第 4 层
    • 看到:来自 A 医院的凭证(如果凭证包含签发者 DID)
    • 看不到:是 Alice 发起的(除非凭证将她列为主体)、中继路径

结果: 没有任何一方能看到完整路径。中继节点只能看到自己所处的那一段。


元数据隐私特性

1. 不可关联性

来自 Alice 的两次凭证交换,中继节点无法将其关联起来:

  • 第一轮:Alice → 中继节点 1 → 中继节点 2 → B 医院(凭证 A)
  • 第二轮:Alice → 中继节点 3 → 中继节点 1 → C 医院(凭证 B)

中继节点 1 无法判断:

  • 两次请求都来自 Alice(路径不同)
  • 两次交换之间是否存在任何关联(不可关联)

原理: 每次交换都使用不同的路径、不同的临时密钥、不同的时间点。

2. 发送方隐私

除非凭证本身透露信息,否则接收方(B 医院)不会得知是谁发起了这次凭证交换。

示例:

  • 凭证包含:"issuer": "did:webvh:hospital-a" → B 医院得知签发者
  • 凭证包含:"credentialSubject.id": "did:webvh:alice" → B 医院得知凭证主体
  • 但是: 凭证不会包含路由元数据(谁通过 TSP 发送的、经过了哪些中继节点)

应用场景: 举报人凭证——签发者确认真实性,但接收方不知道是谁递送的。

3. 接收方隐私

除非 TSP 被配置为透露信息,否则发送方(Alice)不会得知谁接收了该凭证。

示例:

  • Alice 通过 TSP 发送凭证
  • 中继节点 2 将其送达 B 医院
  • Alice 只知道:凭证通过中继节点 1 发送 → (路径的其余部分被隐藏)

应用场景: 雇主凭证验证——员工发送凭证,但不知道是哪家背景调查服务对其进行了验证。

4. 中继节点隐私

每个中继节点只知道上一跳 + 下一跳——不知道完整路径、发送方或接收方。

示例:

  • 中继节点 1 知道:消息来自 Alice → 转发给中继节点 2
  • 中继节点 1 知道:中继节点 2 会转发给 B 医院,也不知道凭证内容

结果: 攻破一个中继节点只会暴露一段路径,而非完整路径。


信任注册表集成:路由权限验证

问题: B 医院如何信任路由路径?

没有信任注册表时:

  • 中继节点未经身份验证——任何人都可以运行一个中继节点
  • 恶意中继节点可能注入虚假凭证、丢弃消息或监视流量

有信任注册表(TRQP)时:

  1. 中继节点注册:每个中继节点在信任注册表中注册:

    • 中继节点 DID:did:webvh:relay-1
    • 已授权的能力:["tsp-routing", "healthcare-credentials"]
    • 运营方:组织名称、司法辖区
  2. 路由验证:B 医院收到凭证后,查询信任注册表:

    • “这份凭证是否经由已获授权的中继节点路由?”
    • 信任注册表回应:“是的,中继节点 1 和 2 已获授权用于医疗 TSP 路由”
  3. 吊销:若某中继节点被攻破,信任注册表将其标记为无效:

    • 下一份经由该受损中继节点路由的凭证 → B 医院将其拒绝

元数据隐私得以维持:

  • 信任注册表查询会显示:“凭证经由 TSP 送达”
  • 信任注册表查询不会显示:使用了哪些具体的中继节点、发送方、时间点

TSP 与其他方案的对比

TSP 与直接凭证交换

TSP直接交换
元数据隐私✓ 中继节点隐藏路径✗ 接收方能看到发送方
不可关联性✓ 无法关联多次交换✗ 发送方 DID 会关联所有交换
抗监控能力✓ 网络观察者只能看到中继流量✗ 网络能直接看到 A → B
复杂度⚠ 存在洋葱路由开销✓ 简单
延迟⚠ 多跳(+100-200毫秒)✓ 直连(低延迟)

何时使用 TSP: 元数据隐私至关重要的跨组织凭证交换场景(医疗、举报、敏感验证)。

何时使用直接交换: 同一组织内、低延迟、不要求元数据隐私的场景。


TSP 与 Tor 的对比

TSPTor
应用场景凭证路由网页浏览匿名性
传输方式DIDComm(结构化消息)TCP 流(任意数据)
信任模型信任注册表 (TRQP)Tor 目录 (共识机制)
凭证验证✓ 原生支持 (信任注册表)✗ 不感知凭证
中继节点激励注册的组织 (合规驱动)志愿者 (利他驱动)
生产就绪度✓ Affinidi 已上线✓ 成熟 (20+ 年历史)

TSP 借鉴了 Tor 的思路: 洋葱路由、多跳转发、不可关联性。

TSP 与 Tor 的不同之处: 原生支持凭证、集成信任注册表、企业级部署模式。


TSP 与基于区块链的路由对比

TSP区块链路由
元数据隐私✓ 洋葱路由✗ 所有交易均公开
延迟⚠ 多跳 (200毫秒)✗ 区块确认 (数秒至数分钟)
成本✓ 免费 (中继运营方)✗ 每笔交易需付 Gas 费
可扩展性✓ 取决于中继吞吐量✗ 受限于区块链吞吐量
对监管友好✓ 符合 GDPR (链下)⚠ 不可变的公开账本

区块链并不适合用于元数据私密路由——所有交易都是公开的,速度慢,成本高。


Affinidi 的 TSP 实现:首个投入生产的实现

Affinidi 是首家在生产环境中部署 TSP 的公司(2025 年):

架构

  • Agent Gateway:构建 TSP 洋葱路由消息
  • Affinidi Messaging:DIDComm 传输层
  • 信任注册表:通过 TRQP 验证中继节点权限
  • 中继网络:由 Affinidi 及合作伙伴(医疗机构、合规组织)运营

应用场景

  1. 跨医院凭证转移(医疗)

    • 患者凭证在医院之间路由,不暴露患者的选择
    • 中继节点由区域健康信息交换机构(HIE)运营
  2. 可复用 KYC(金融)

    • A 银行签发 KYC 凭证 → B 银行验证
    • TSP 隐藏:Alice 选择了 B 银行(竞争情报)
  3. 雇佣关系验证(人力资源)

    • 员工凭证从 A 公司 → B 公司
    • TSP 隐藏:员工已离开 A 公司(减少挖角行为)

中继运营方

谁在运营 TSP 中继节点:

  • ✅ Affinidi(引导网络)
  • ✅ 医疗机构(符合 HIPAA 的 PHI 路由中继)
  • ✅ 金融机构(符合监管要求的 KYC/KYB 路由中继)
  • ✅ 政府数字身份项目(国家级中继网络)

激励机制:

  • 合规:受监管行业需要元数据私密路由(GDPR、HIPAA)
  • 竞争优势:早期采用者能吸引重视隐私的用户
  • 生态参与:中继运营方加入信任注册表,获得授权地位

局限性与权衡

1. 延迟开销

多跳路由会增加延迟:

  • 直接凭证交换:约 50 毫秒(本地网络)到约 200 毫秒(跨区域)
  • TSP(3 跳):额外增加 100-200 毫秒开销 → 总计 150-400 毫秒

缓解措施:

  • 仅在隐私至关重要的交换中使用 TSP
  • 优化中继节点布局(地理邻近性)
  • 缓存中继路径(减少路径发现的开销)

2. 中继信任假设

TSP 依赖于诚实的中继节点

  • 被攻破的中继节点可能丢弃消息、延迟送达或记录元数据(仅限一跳的信息)
  • 合谋:若多个中继节点合谋,可能会去匿名化路径

缓解措施:

  • 信任注册表对中继节点进行审查(监管合规、审计)
  • 多中继路径(攻破一个中继节点只会暴露一跳信息)
  • 中继轮换(每次交换使用不同路径)

3. 基于时序的关联分析

流量分析: 如果攻击者能观察全部网络流量,可以进行关联:

  • 消息在时间 T 进入中继节点 1
  • 消息在时间 T+100毫秒 从中继节点 2 送出 → 很可能是同一条消息

缓解措施:

  • 填充(在每个中继节点添加随机延迟)
  • 伪装流量(中继节点发送掩护流量以混淆真实消息)
  • 批处理(中继节点将多条消息一起转发)

权衡: 填充/批处理会增加延迟。

4. 并非端到端匿名

TSP 提供的是元数据隐私,而非匿名性

  • 凭证内容可能透露发送方(签发者 DID)或接收方(凭证包含目的地信息)
  • TSP 隐藏的是路由元数据,而非凭证内容

若需要匿名性: 可将 TSP 与零知识证明(BBS+ 选择性披露)结合,以隐藏凭证内容。


TSP 实践:代码示例

简化的 TSP 消息构建过程(概念示意):

// 步骤 1: 构建凭证载荷
const credential = {
  type: "VerifiableCredential",
  issuer: "did:webvh:hospital-a",
  credentialSubject: { id: "did:webvh:alice", record: "..." },
  proof: { ... }
}

// 步骤 2: 定义路径 (发送方选择中继节点)
const route = [
  { did: "did:webvh:relay-1", publicKey: relay1PubKey },
  { did: "did:webvh:relay-2", publicKey: relay2PubKey },
  { did: "did:webvh:hospital-b", publicKey: hospitalBPubKey }
]

// 步骤 3: 洋葱加密 (从最内层到最外层)
let payload = encrypt(credential, hospitalBPubKey) // 第 4 层

payload = encrypt({ nextHop: route[2].did, payload }, relay2PubKey) // 第 3 层
payload = encrypt({ nextHop: route[1].did, payload }, relay1PubKey) // 第 2 层

// 步骤 4: 发送给第一个中继节点
await didcomm.send({
  from: "did:webvh:alice",
  to: route[0].did,
  payload: payload
})

// 中继节点 1 收到消息,解密第 2 层,看到 nextHop = relay-2,转发
// 中继节点 2 收到消息,解密第 3 层,看到 nextHop = hospital-b,转发
// B 医院收到消息,解密第 4 层,获得凭证

Affinidi SDK 对此进行了封装——开发者只需调用:

await affinidi.sendCredentialViaTSP({
  credential: myCredential,
  recipient: "did:webvh:hospital-b",
  privacyLevel: "high" // 自动选择 3 跳路径
})

TSP 的未来

短期 (2026-2027 年)

  • 生产环境部署 (Affinidi 已上线)
  • 医疗行业采用 (区域 HIE 中继网络)
  • 金融服务试点 (KYC/KYB 路由)
  • W3C 标准化 (TSP 规范最终定稿)

中期 (2027-2029 年)

  • 政府中继网络 (国家数字身份项目)
  • 移动优先中继 (低功耗设备作为中继节点)
  • TSP + ZKP (结合元数据隐私 + 内容隐私)
  • 中继激励层 (代币化的中继运营方)

长期 (2029 年以后)

  • 全球 TSP 网络 (跨司法辖区的联合中继网络)
  • 后量子 TSP (抗量子的洋葱加密)
  • 面向物联网的 TSP (设备间的凭证路由)

快速上手 TSP

Affinidi 的 TSP 已在生产环境中上线:

  • 通过 TSP 发送凭证affinidi.sendCredentialViaTSP()
  • 运营一个中继节点:在信任注册表中注册,加入中继网络
  • 验证路由权限:通过 TRQP 查询信任注册表

开始构建 →

文档:


相关资源

技术深度解析

相关解决方案


总结

Trust Spanning Protocol(TSP) 为可验证凭证提供元数据私密路由:

核心特性:

  • 洋葱路由(类似 Tor)对中继节点隐藏完整路径
  • 不可关联性防止跨交换的关联分析
  • 信任注册表集成在不暴露路径的情况下验证中继权限
  • 生产就绪(Affinidi 于 2025 年率先实现)

权衡取舍:

  • ⚠ 延迟开销(多跳增加 100-200 毫秒)
  • ⚠ 中继信任假设(需要诚实的中继节点)
  • ⚠ 面对全局攻击者时易受流量分析影响(可通过填充/批处理缓解)

何时使用 TSP:

  • 元数据隐私至关重要的跨组织凭证交换
  • 医疗(HIPAA)、金融(KYC)、雇佣关系(竞争情报)
  • 举报、敏感验证、抗监控场景

Affinidi 使用 TSP 的场景:

  • Affinidi Messaging(带 TSP 路由的 DIDComm 传输)
  • Agent Gateway(构建洋葱路由消息)
  • 信任注册表(通过 TRQP 验证中继权限)

结果: 可验证凭证跨组织边界交换时具备元数据隐私——没有任何一方能看到完整路径,中继节点无法关联多次交换,网络观察者无法进行监控。

Cookie Preferences

We use cookies to enhance your experience. You can manage your preferences below. For more information, read our Cookie Policy.

Strictly Necessary Always Active

These cookies are essential for core website functions such as security, session integrity, and cookie preference storage. They cannot be disabled.

  • _cf_bm: Distinguishes humans from bots (Cloudflare) · 30m
  • _cfuvid: Ensures secure browsing (Cloudflare) · Session
  • __hs_initial_opt_in: Prevents HubSpot's banner · 7 days
  • _gtm_debug: GTM debug mode (testing only) · Session
Analytics

These cookies help us understand how visitors interact with the site so we can improve content and performance. All data is aggregated and anonymous.

  • _ga, _gid, _gat: Google Analytics · Session – 2 years
  • __hstc, hubspotutk, __hssrc: HubSpot visitor tracking · 13 months
  • __hs_opt_out: HubSpot opt-out preference · 6 months
Marketing & Targeting

These cookies allow us and our partners to serve personalised ads and measure campaign performance.

  • _gcl_au, _gcl_dc: Google Ads conversion tracking · 90 days
  • IDE: Google Display Network personalisation · 1 year
  • _fbp: Meta / Facebook remarketing · 90 days
  • li_gc, _li_fat_id, bcookie: LinkedIn tracking · 1–24 months
  • guest_id, personalization_id: Twitter/X analytics · 2 years