你刚在两台电脑间复制了一条临时命令,三秒后它出现在另一台设备的剪贴板里——这个过程中,中转服务器有没有"偷看"的资格?

开发者给了一个极端答案:服务器只配当快递员,连包裹里是什么都没资格知道。

打开网易新闻 查看精彩图片

剪贴板里的隐形资产

这是一款跨设备剪贴板同步工具。复制、粘贴、跨屏——听起来简单,但其设计前提很苛刻:服务器只能搬运密文,绝不能成为信任链条的一环。

这个设计源于对剪贴板内容的观察。临时 SSH 凭证、带 Token 的管理后台链接、一次性验证码、从内部工具拷贝的客户数据——这些东西的共同点是:生命周期极短,却极敏感。用户往往随手复制,工具默默继承。

「最刺痛我的不是安全审计,而是有一次在两台机器间传命令,发现最快的路径居然是聊天窗口。」开发者写道。这不是戏剧性的数据泄露,而是一种日常性的权限越界:方便的工具看到了不该看的东西。

传统方案的妥协在于"传输加密"或"静态加密"——数据在管道里加密,或在硬盘上加密,但服务器本身持有解密密钥或明文处理能力。该工具要消除的正是这个中间态的可读性。

盲中继:只验身份,不碰内容

其架构叫"盲中继"(blind relay)。类比很直白:快递员可以查身份证、按门铃、叫醒收件人,但不能拆包裹。在系统里,包裹是密文,钥匙只在客户端。

技术栈分层明确:Tauri 负责原生端界面,Rust/Axum 后端处理认证、投递、限流、唤醒休眠客户端——唯独不碰解密。服务器能做的事被严格圈定:验证用户身份、执行速率限制、存储密文、定向发送、推送通知。解密路径不存在。

加密发生在客户端,用 XChaCha20-Poly1305。密文和 nonce 通过 WebSocket 中继,接收端独立解密。关键设计包括:类型化的 WebSocket 协议、单所有者 WebSocket 通道、有界队列、客户端全权加密。

「一旦决定让服务器失明,架构反而变简单了。」开发者解释。客户端握有密钥,加密发生在网络层之前;后端专注投递顺序和背压控制。Rust 被选中的原因是:所有权模型、协议设计、并发控制、以及提前消灭非法状态——这些才是难点所在。

为什么用 Rust 和 Tauri

该工具有两半,中间隔着一道硬边界。

后端是 Rust/Axum,核心职责是维持 WebSocket 连接、管理设备注册、投递消息。它不存储密钥,不解析 payload,只认设备 ID 和用户身份。所有状态都是临时的:连接存活时存在,断开即清理。

前端用 Tauri——一个用 Web 技术写桌面应用的框架。Tauri 的吸引力在于:它把 Rust 作为系统层胶水,同时允许用熟悉的前端栈写界面。对于需要深度系统集成(监听剪贴板、全局快捷键、系统托盘)又不愿陷入原生开发泥潭的工具,这是折中点。

但 Tauri 也是约束。它决定了哪些系统 API 能碰,哪些要绕路。剪贴板监听、加密逻辑、密钥管理都落在 Rust 侧,Tauri 只负责桥接和 UI。这种分层让"盲"的承诺可审计:敏感操作在 Rust 代码里,可以被静态分析和审查。

协议层的防御性设计

WebSocket 协议被设计为类型化的。每条消息有明确标签:这是注册、这是心跳、这是密文 payload。服务器解析类型,但不解析内容。

单所有者通道是关键:一个设备的 WebSocket 连接只归该设备,不存在共享或复用。这防止了跨会话污染。有界队列则限制内存爆炸——如果接收端离线,消息不会无限堆积,而是按策略丢弃或暂存。

这些选择指向同一个目标:减少服务器的"好奇心"空间。能解析的越少,被攻破后的损害面越小。

开发者工具的隐私悖论

该工具的语境是开发者日常。临时凭证、调试命令、内部 URL——这些东西不会进密码管理器,却频繁出现在剪贴板。现有解决方案要么牺牲便利(手动传输),要么牺牲隐私(云服务明文存储)。

盲中继试图同时满足两者:自动同步,但服务器对内容零知识。这要求用户接受一个代价:密钥管理完全自主。没有"忘记密码"的找回流程,因为服务器从未持有密钥。

这是设计意图,也是用户契约。它不解决密钥丢失问题,它只保证密钥丢失时,服务器同样无能为力——因为从一开始,服务器就被设计成什么都看不见。