盲签名凭证与匿名访问凭据

AeroNyx6 分钟阅读

AeroNyx VPN 凭证如何让节点在不得知付款账户的情况下核实付款、reject_invalid 推出模式仍允许什么、节点和后端仍能看到什么,以及为什么 Blind Vault 准入已实现却未部署。

AeroNyx 使用盲签名凭证,使 VPN 节点能够核实某个连接已付费,而无需得知是哪个账户付的费。该机制目前已在 VPN 上线,运行于一种仍接受无凭证连接的兼容模式。第二条凭据路径——Blind Vault 准入——存在于节点软件中,但尚未部署,官方应用也未使用。

两条凭据路径

凭据路径状态兑换模型
VPN 握手凭证已上线。运行于 reject_invalid 兼容模式节点检查签名。它不跟踪一次性花费
Blind Vault V2 准入已在节点中实现。尚未部署,官方应用也未使用一次性花费与租约创建以原子方式一并记录
Blind Vault V1 准入仅用于兼容,位于同一个已禁用的组件中一次性花费,但签发可与兑换关联起来

VPN 凭证如何签发

  1. 应用生成一个随机的 32 字节令牌,并使用 RSA 盲签名(RSABSSA-SHA384-PSS-Randomized,RFC 9474)在本地对其进行盲化。
  2. 应用只将盲化后的消息发送到 AeroNyx 后端的 /api/voucher/issue/。后端检查已登录账户是否具备权益,对盲化消息签名并返回签名。它从不会看到令牌。
  3. 应用在本地完成签名。最终的凭证(令牌、签名、消息随机化因子和密钥纪元)是一种不记名凭据,与签发请求没有关联。

按纪元分组的签发方公钥发布在:

text
GET https://api.aeronyx.network/api/voucher/issuer/keys/

节点如何检查凭证

应用会在 VPN ClientHello 之后附加一个凭证扩展:

text
ClientHello fixed frame
  + magic: AVCH
  + voucher_length: u16 little-endian
  + voucher JSON (maximum 2048 bytes)
json
{
  "token": "base64-32-byte-token",
  "signature": "base64-finalized-blind-signature",
  "msg_randomizer": "base64-32-byte-randomizer",
  "epoch": "issuer-key-epoch"
}

节点只解析这些字段。它从上述端点获取该纪元的签发方公钥,缓存一小时,并核验随机化的 SHA-384 RSA-PSS 签名。它不需要任何钱包或账户标识符。

推出模式:reject_invalid

  • 格式错误和密码学上无效的凭证会在握手被接受之前遭到拒绝。
  • 完全不带凭证的连接仍会被接受,以便旧版客户端继续工作。凭证的使用目前尚非强制。
  • 节点不会记录已花费的凭证。只要凭证所属的签发方密钥纪元仍处于发布状态,节点就会在每次出示时接受有效凭证。共享、重放和配额限制由后端执行,而非由节点执行。

节点只上报汇总结果:

text
mode = reject_invalid
valid | invalid | missing | malformed | total
valid_ratio | invalid_ratio | missing_ratio | malformed_ratio
last_observation | last_error

节点能了解到你的什么信息

“节点从不会得知你的钱包身份”这一保证仅适用于凭证连接。

  • 凭证连接(官方应用): 应用使用凭证和一个全新的临时握手密钥进行连接。节点可以核实付款,但无法将会话与你的钱包或 P2P 身份关联起来。
  • 旧版连接: 使用其身份密钥而非凭证进行认证的客户端会在握手中发送该密钥。

在这两种情况下,节点都会将会话的握手公钥连同会话时间和字节数一起,通过一个名为 client_wallet 的字段上报给 AeroNyx 后端。对于凭证连接,该值是临时密钥。对于旧版连接,该值是客户端的身份密钥。节点运营者可以在 Nodeboard 中看到每个会话的流量和这些密钥。

凭证也无法隐藏其他所有信息。与任何 VPN 一样,节点仍能看到你的 IP 地址,并且作为出口,还能看到你的访问目的地和 DNS。当应用预留每日连接时,后端还会记录该账户在该时间进行了连接,但不会记录其使用了哪个节点。请参阅 VPN 对比 和 信任中心。

Blind Vault 准入(未部署)

Blind Vault 是一个节点组件,用于在匿名租约下存储由客户端加密的对象。其说明见 MemChain 与 Blind Vault。其准入设计如下:

  • V2: 客户端对一条 RFC 9474 准入消息进行盲化。权益服务授权签发,由一个独立的签名进程(aeronyx-blind-issuer)只对盲化后的字节签名。该进程没有账户数据库、存储,也看不到兑换情况。节点根据固定的公钥纪元核验最终凭据,并在一个 SQLite 事务中记录花费标记,同时创建一个随机、自认证的租约。已花费的凭据无法创建第二个租约。重试完全相同的请求会返回同一个租约。
  • V1: 一种使用相同一次性花费表的不记名票据。节点会存储票据的身份标识,因此兑换可以与签发关联起来。它仅为兼容而保留。

只有当 Blind Vault 及其公共 API 都启用时,节点才会开放这些路由。两者默认均为关闭。

http
GET  /api/vault/v1/issuers
POST /api/vault/v1/lease
POST /api/vault/v1/put
POST /api/vault/v1/pull
POST /api/vault/v1/delete

当前状态:Blind Vault 未部署在生产节点上,官方应用不调用这些路由,AeroNyx 后端也没有 Blind Vault 权益端点。Blind Vault 不是备份、归档或存储产品,AeroNyx 也不提供任何此类产品。

可观测性

运营者界面只显示汇总的凭据健康状况:

  • VPN 的 valid、invalid、missing 和 malformed 总数及比率,以及推出模式
  • 签发方密钥的可用性和粗粒度的失败分桶

它们从不显示凭证令牌、签名、随机化因子、盲化消息或花费 ID。会话级流量和握手密钥属于另一个单独的运营者视图,如上文所述。

威胁模型与局限

盲签名切断了签发请求与凭证之间的关联。但它们无法消除以下风险:

  • 后端的签发或连接预留记录与节点的会话记录之间的时序关联,尤其是在同一方能同时看到两者时
  • 节点能看到你的 IP 地址、访问目的地和 DNS
  • 在密钥纪元处于发布状态期间凭证被盗、共享或转售,因为节点不强制执行一次性花费
  • 无凭证的连接,在 reject_invalid 模式下仍会被接受
  • 签发方密钥轮换错误或客户端被攻破

源代码索引

层级在节点仓库中的路径作用
VPN 验证器crates/aeronyx-server/src/voucher_verifier.rs解析 AVCH、获取纪元密钥、核验凭证并记录汇总结果
盲签名器crates/aeronyx-blind-issuer/src/signer.rs、api.rs为 Blind Vault V2 提供不涉及身份的 RSA 盲签名
线路协议约定crates/aeronyx-core/src/protocol/blind_vault.rsRFC 9474 准入消息、密钥纪元和花费 ID
Blind Vault 服务与 APIcrates/aeronyx-server/src/services/blind_vault.rs、api/blind_vault.rs准入、原子化的花费与租约、对象路由
Blind Vault 配置crates/aeronyx-server/src/config_blind_vault.rs默认关闭;签发方固定与轮换规则

节点软件以 AGPL-3.0 许可在 github.com/AeroNyxNetwork/AeroNyx 开源。应用不是开源的。

<!-- faq:start -->

常见问题

AeroNyx VPN 节点知道我用哪个钱包付的款吗?

对于官方应用所使用的凭证连接,不知道。节点核验的是盲签名凭证和临时握手密钥,两者都与你的钱包没有关联。使用其身份密钥连接的旧版客户端则会向节点暴露该密钥。

一张凭证可以多次使用吗?

可以。节点根据凭证所属纪元的已发布密钥核验签名,但不保留已花费凭证的列表。配额由后端执行。

连接时必须使用凭证吗?

目前还不是。节点会拒绝格式错误或无效的凭证,但仍接受不带任何凭证的连接,以便旧版客户端继续工作。

凭证签发方密钥发布在哪里?

它们按纪元分组发布在 https://api.aeronyx.network/api/voucher/issuer/keys/。节点会将这些密钥缓存一小时。

应用中可以使用 Blind Vault 吗?

不可以。Blind Vault 准入已在节点软件中实现,但默认禁用、尚未部署,官方应用也未使用。AeroNyx 不提供任何备份或存储产品。

<!-- faq:end -->