最近 X 上几家比较知名的中转站被曝出售 / 泄露用户的 key 和对话记录,正好把我憋了一阵子的一个想法说出来,请大家看看这个方案在密码学上有没有硬伤。
## 现状:中转站是个能拆信的邮递员
用第三方中转的都知道,你的请求体——prompt 、系统提示词、附件内容、模型回复——对中转站是完全的明文。它技术上可以做缓存、做审计日志、做「模型质量分析」,当然也可以直接拿走你的代码和商业数据。TLS 只保护你和它之间、它和厂商之间这两段传输,中转服务器内存里躺着的永远是明文。
等于你把信用快递寄信,快递公司全程可以拆阅。
## 一个思路:非对称的 E2E 信封
我在想能不能这样:
1. 厂商为每个账号发布一对密钥(或者干脆用现有账号体系派生),公钥下发到客户端;
2. 客户端用厂商公钥加密整个请求体,中转站只负责转发密文;
3. 厂商用私钥解密、推理,把响应再用客户端的公钥加密回来,客户端本地解密。
这样中转站从头到尾只见密文,退化成一个「盲管道」——但它的核心职能(流量转发、按 token 计费、限流)其实都不需要看内容:token 数可以由密文长度加协商的头部字段推算,计费照样成立。
## 卡点在哪
我想到三个:
a) **厂商不接受密文请求**。现在各家 API 都要求明文 JSON ,厂商需要定义协议、发放公钥、在服务端加解密——这是它们没有动力做的第一推动力;
b) **中转站的生态位冲突**。相当一部分中转的附加价值恰恰来自「能看内容」(响应缓存省钱、内容审查、日志分析),端到端加密等于砸了这部分饭碗,它们大概率不会接受这个标准,甚至可能软性抵制;
c) **客户端私钥管理**。对普通用户来说是新负担,丢私钥、换设备的密钥轮换都是麻烦。
## 现有的缓解方案
- 本地代理直连官方(走官方 TLS ),问题等于不存在,但前提是网络可达;
- 「零知识」中转,承诺不留日志——但那是靠商业信用,不是靠密码学;
- TEE 可信执行环境里跑转发,理论上中转拿不到明文,但成本高、信任链最终还是要信厂商的 TEE 实现。
## 结论和讨论点
我认为这个方案密码学上完全成立(本质就是把 Signal 那套非对称信封的思路搬到 API 层),标准是值得推动的,关键卡点就是 a——厂商意愿。眼下务实的做法还是:敏感请求直连官方,中转只跑不敏感的批量任务。
想讨论的:如果哪家厂商真愿意支持,这个协议应该怎么设计?私钥放账号体系里托管(厂商可解,失去 E2E 意义)还是纯客户端生成(丢钥即丢数据)?流式响应的逐 chunk 加密会不会把延迟推到不可接受?欢迎拍砖。
## 现状:中转站是个能拆信的邮递员
用第三方中转的都知道,你的请求体——prompt 、系统提示词、附件内容、模型回复——对中转站是完全的明文。它技术上可以做缓存、做审计日志、做「模型质量分析」,当然也可以直接拿走你的代码和商业数据。TLS 只保护你和它之间、它和厂商之间这两段传输,中转服务器内存里躺着的永远是明文。
等于你把信用快递寄信,快递公司全程可以拆阅。
## 一个思路:非对称的 E2E 信封
我在想能不能这样:
1. 厂商为每个账号发布一对密钥(或者干脆用现有账号体系派生),公钥下发到客户端;
2. 客户端用厂商公钥加密整个请求体,中转站只负责转发密文;
3. 厂商用私钥解密、推理,把响应再用客户端的公钥加密回来,客户端本地解密。
这样中转站从头到尾只见密文,退化成一个「盲管道」——但它的核心职能(流量转发、按 token 计费、限流)其实都不需要看内容:token 数可以由密文长度加协商的头部字段推算,计费照样成立。
## 卡点在哪
我想到三个:
a) **厂商不接受密文请求**。现在各家 API 都要求明文 JSON ,厂商需要定义协议、发放公钥、在服务端加解密——这是它们没有动力做的第一推动力;
b) **中转站的生态位冲突**。相当一部分中转的附加价值恰恰来自「能看内容」(响应缓存省钱、内容审查、日志分析),端到端加密等于砸了这部分饭碗,它们大概率不会接受这个标准,甚至可能软性抵制;
c) **客户端私钥管理**。对普通用户来说是新负担,丢私钥、换设备的密钥轮换都是麻烦。
## 现有的缓解方案
- 本地代理直连官方(走官方 TLS ),问题等于不存在,但前提是网络可达;
- 「零知识」中转,承诺不留日志——但那是靠商业信用,不是靠密码学;
- TEE 可信执行环境里跑转发,理论上中转拿不到明文,但成本高、信任链最终还是要信厂商的 TEE 实现。
## 结论和讨论点
我认为这个方案密码学上完全成立(本质就是把 Signal 那套非对称信封的思路搬到 API 层),标准是值得推动的,关键卡点就是 a——厂商意愿。眼下务实的做法还是:敏感请求直连官方,中转只跑不敏感的批量任务。
想讨论的:如果哪家厂商真愿意支持,这个协议应该怎么设计?私钥放账号体系里托管(厂商可解,失去 E2E 意义)还是纯客户端生成(丢钥即丢数据)?流式响应的逐 chunk 加密会不会把延迟推到不可接受?欢迎拍砖。

