付费 VPN 能否在没有账户的情况下授权会话?
不可关联的令牌可以把资格检查与会话本身分开。关键在于签发与兑换的设计,而不是登录界面上的标签。
为隧道付费并不意味着每次连接都要出示账单身份。一套设计可以只检查一次资格,把密码学令牌交给客户,让网关之后接受令牌而看不到其背后的账户。这样做究竟藏住了什么,取决于签发与兑换的具体选择,所以请把它当成一份分四节的规格练习,而不是一个打开就生效的功能。
把购买步骤与会话步骤分开
RFC 9576 中的 Privacy Pass 架构提供了词汇:客户端、证明者、签发者和源。客户端向签发者证明某种属性并获得令牌;之后它把其中一个令牌提交给源,由源决定是否提供服务。用到 VPN 上时,被证明的属性可以是一次访问的单位。
计费仍然会看到自身流程所需的信息,没有人主张相反。更窄的目标是:之后的兑换无法被追溯到产生该令牌的那次购买。这是一个具体、可检验的性质,也正是值得写下来的那一条。
一个看起来随机的 bearer 字符串并不提供这一点。如果签发者把该值存客户记录旁边,而网关又能查询这层映射,那么两次交互就是被数据库连起来,而不是被密码学连起来。构造必须让签发者无法回答这个问题,部署也必须阻止签发者与网关合并各自的视图。
确定一个令牌授权什么
「一个令牌购买访问权」在实际运行中几乎什么都没回答。单位是一次连接、一段时间额度,还是一个流量?丢了响应的客户端能否继续同一份授权?设备在网络切换时重连会发生什么?这些答案决定了设计是否可用,而每一个都带有隐私后果。
| Reuse rule | What it buys | What it leaks |
|---|---|---|
| Single use per connection | Strongest unlinkability between sessions | Frequent reissuance, more purchase-to-use timing pairs |
| Bounded time window | Fewer tokens, reconnects work | Activity inside the window is linkable |
| Long-lived grant | Operationally simple | Behaves like an account reference with extra steps |
有意识地选一个,并把失败时的行为写在旁边。超时后用新权益重试的客户端会再消耗一个单位,这既是账单上的意外,也是一个隐私信号。
写清复用与吊销策略
吊销正是匿名设计常常自毁承诺的地方。取消订阅与作废已签发的令牌是两种不同的操作,而一个悄悄查询账户来做决定的网关,在那一刻就不再匿名了。
选择彼此匹配的有效期、签发上限和吊销方案。然后检查网关自己的记录,看有没有字段把你已经去掉的关联又引了回来。
sudo grep -rIl --include='*.log' -e 'Bearer ' -e 'account_id' /var/log/vpn/
这条搜索会列出包含令牌或账户字段的日志文件,实践中这正是谨慎设计最先泄漏的地方。把令牌值与账户标识存在同一条会话记录里会毁掉整个构造,而它通常来自一次没人再回看的调试改动。
还要定义会话结束后网关保留什么。时长、字节数和端点对运维有用,而每一项都是观察者想拼上的拼图。把保留期和字段清单都保持很短,并在调试改动新增一列时把两者都复查一遍。一个新的日志字段往往要存在一年才会有人注意到。
先陈述主张,再陈述仍然存在的观察
用一句话写出隐私主张及其前提:哪一方必须无法关联哪些上下文,以及如果签发者和网关对账会发生什么。能经得起这句话的设计才可评审;只被描述为「零知识」的设计则不行。
然后列出无论如何都仍然可见的东西。源地址、连接时间、数据包大小,以及一次购买恰好发生在唯一一条新连接出现前不久这一简单事实,全都在密码学之外。单个客户买一个单位、连一次,仅凭时间就能被关联,任何令牌设计都改变不了这一点。
诚实的结果是账户与使用之间的关联变窄,而不是一个看不见的会话。只要文档这么说、运营记录与主张相符,它仍然值得建设。