本页写给想要核实的人。每个组件,我们都写明它保护什么、不保护什么。
每台设备上一个客户端,每个社区一个中枢(Outpost),只能作为 Tor v3 onion 服务访问,客户端之间使用 MLS 端到端加密。中枢负责排序、临时保存并转发它无法读取的消息。没有中央服务器,数据路径上没有任何 GiBSeS 组件。
Outpost 和客户端只通过 Tor 通信。Outpost 发布一个 v3 onion 服务:地址由服务的密钥生成,所以即使电脑更换网络或 IP,地址也保持不变,也不需要在路由器上开放端口。我们使用 Arti,即 Tor Project 用 Rust 编写的 Tor 实现,已集成在程序中:无需另外安装 Tor 进程。
网页版是一个在浏览器中打开的界面,背后是一个使用 Tor 通信的本地小程序。没有远程网页服务器:浏览器只与你电脑上的这个程序通信,由它通过 Tor 把消息送到 Outpost。
每个对话,包括双人对话,都是一个符合 RFC 9420 的 MLS 群组,由 OpenMLS 实现。密码套件:X25519 用于密钥交换,ChaCha20-Poly1305 用于加密,Ed25519 用于签名。文字、照片、语音、文件,以及附件的名称和类型,都在设备上加密。
MLS 提供前向保密和后妥协安全:今天被盗的密钥解不开昨天的流量,在密钥更新之后也解不开明天的流量。它保护传输中的消息,而不是手机上已保存的历史记录:后者由本地数据库加密和应用锁(PIN 或生物识别)保护。
我们用插入测试消息中的哨兵字符串做了验证:中枢的数据里出现次数为零。
新加入群组的人读不到历史记录。退出或被移除的人读不到之后写的内容。在一次 100 名成员的测试中,移除一名成员会生成一个 8.7 KB 的 commit,耗时 6.5 毫秒。
Outpost 的密钥在加入时就通过邀请固定下来。每个个人 ID(二维码或 32 个字符的代码)都包含密钥的指纹:如果有人(包括中枢)试图替换它,应用会阻止发送并显示全屏警告。两个人可以比对一个 60 位数字的安全码或二维码。每个社区都有独立的身份,使用不同的密钥。
这张表请完整阅读。它适用于 Outpost,因此也适用于管理它的人。
| 数据 | 中枢能看到吗? |
|---|---|
| 文字、照片、语音、文件、附件的名称和类型 | 不能 |
| 会议的音频和视频(两种模式) | 能 |
| 客户端的 IP | 不能(Tor),高画质模式会议的参与者除外 |
| 中枢的 IP(对客户端而言) | 不能(onion),高画质模式会议的参与者除外 |
| 成员列表,含密钥和标签,包括设为私密的成员 | 能 |
| 每个人选择的可见性 | 能 |
| 谁在哪个房间、房间名称 | 能 |
| 双人聊天中谁给谁发消息 | 能 |
| 谁在房间里上传内容 | 能 |
| 每个人何时连接、多久连接一次 | 能 |
| 消息大小 | 能 |
| 谁从房间里和谁发起私聊 | 能 |
GiBSeS 看不到以上任何内容:我们没有服务器、账户、遥测、崩溃报告,也没有在线激活。设为「仅持有我 ID 的人可见」的人,对其加入的房间里的成员仍然可见。
如果接收者离线,加密信封会在 Outpost 上保留最多 30 天(可调),然后过期。一旦送达即被删除:Outpost 只做中转,不保留消息存档。磁盘上保留的是成员和房间列表,以及未取走消息的队列,存放在一个用运营者密码静态加密(Argon2id)的文件夹中。在双人聊天中,你会看到「排队中」「已送达」或「已过期」。附件分块传输,中断后可续传,每项最大 100 MB。
没有任何通知经过 Android 和 iOS 的推送服务。两种模式:不做后台检查(默认),或每 15、30、60 或 240 分钟通过 Tor 定期检查一次,并显示一条不含内容的本地通知。在 Android 上,省电模式可能延迟检查;在 iOS 上,系统会限制后台活动,因此只有应用打开时才能完整接收。
通话(一对一,以及最多约 10 人的群组通话)通过 Tor 传输并经过中枢,中枢只在内存中转发,不写入磁盘。延迟来自两段 onion 线路:预计会有明显延迟,更像对讲机,而不是传统电话。如果联系人无法接通,通话会显示为未接,你可以留一条语音。也支持轻量级的屏幕共享。
可选组件,默认关闭,作为 SFU(Selective Forwarding Unit,选择性转发单元)运行在中枢上。媒体在传输中是加密的,但 SFU 会解密以便转发:在两种模式下,中枢都能看到会议的音频和视频。我们不使用 SFrame。对于视频,你需要信任中枢,也就是信任管理它的人。
媒体通过 Tor 传输,由 Outpost 作为中继转发,分辨率较低,以适应 onion 线路的带宽和延迟。不暴露任何 IP:参与者的和中枢的都不暴露。无需额外的网络配置。
客户端与 Outpost 之间直接建立 WebRTC 连接,不经过 Tor,使用 DTLS-SRTP 加密,内含 TURN。中枢需要一个公网 IP,并开放一到两个端口。自签名证书:其指纹和地址通过 Tor 发送给客户端,不依赖任何外部服务。参与者的 IP 只有社区的 Outpost 能看到,其他参与者看不到。参与者知道中枢的 IP。和任何直连一样,每个人的网络运营商都能看到有一条连到该地址的连接。
无论视频选择哪种模式,聊天始终走 Tor。
中枢几乎不做繁重的加密运算:它转发信封,并为 MLS commit 排序。真正的负载在磁盘(附件队列,最长 30 天)和 Tor 带宽。工作盘必须是 SSD:队列会持续写入。实测稳定运行时,节点占用 34-46 MB 内存。
| 社区 | 推荐配置 |
|---|---|
| 最多约 25 人 | 一台保持开机的台式机或笔记本,4 GB 内存,SSD 上 32 GB 可用空间 |
| 约 25 至 100 人 | 一台电脑或迷你主机,8 GB 内存,64-128 GB SSD |
| 100 人以上 | 多个 Outpost |
| 高画质视频,5 名参与者 | 中枢上行约 10 Mbit/s,公网 IP,1-2 个端口 |
| 高画质视频,10 名参与者 | 中枢上行约 45 Mbit/s;8 GB 内存的电脑 |
| 受保护视频 | 无额外网络要求;画质受 Tor 带宽限制 |
Outpost 支持 Windows 10/11 x64 和 Linux x86_64。开机自动启动,通电后 3 分钟内上线。聊天只需几 Mbit/s 的家庭上行带宽:实际瓶颈是 Tor 的延迟,而不是硬件。
客户端和 Outpost 均用 Rust 编写:Tor 用 Arti,加密用 OpenMLS。Outpost 是单个可执行文件,无需安装,也无需管理员权限。