Naisho · 技术内幕

工作原理,以及我们不承诺什么。

本页写给想要核实的人。每个组件,我们都写明它保护什么、不保护什么。

一句话讲清架构

每台设备上一个客户端,每个社区一个中枢(Outpost),只能作为 Tor v3 onion 服务访问,客户端之间使用 MLS 端到端加密。中枢负责排序、临时保存并转发它无法读取的消息。没有中央服务器,数据路径上没有任何 GiBSeS 组件。

传输

基于 Arti 的 Tor onion v3

Outpost 和客户端只通过 Tor 通信。Outpost 发布一个 v3 onion 服务:地址由服务的密钥生成,所以即使电脑更换网络或 IP,地址也保持不变,也不需要在路由器上开放端口。我们使用 Arti,即 Tor Project 用 Rust 编写的 Tor 实现,已集成在程序中:无需另外安装 Tor 进程。

局限
  • 延迟就是 Tor 的延迟。在我们的测试中,一条消息经中枢的往返时间在 168 到 627 毫秒之间(各场景的中位数)。大附件比直连需要更长时间。
  • 在 Tor 网络被封锁的地方,Naisho 无法连接。我们不内置网桥,也不提供任何绕过封锁的工具。

网页版

网页版是一个在浏览器中打开的界面,背后是一个使用 Tor 通信的本地小程序。没有远程网页服务器:浏览器只与你电脑上的这个程序通信,由它通过 Tor 把消息送到 Outpost。

加密

基于 OpenMLS 的 MLS(RFC 9420)

每个对话,包括双人对话,都是一个符合 RFC 9420 的 MLS 群组,由 OpenMLS 实现。密码套件:X25519 用于密钥交换,ChaCha20-Poly1305 用于加密,Ed25519 用于签名。文字、照片、语音、文件,以及附件的名称和类型,都在设备上加密。

局限
  • 暂不支持后量子 MLS 的混合套件仍处于草案阶段。在它们稳定之前,我们不做承诺。
  • 消息不可否认 每条消息都带有发送者的签名:收到的人可以向第三方证明是你写的。正是这个签名,让人可以向运营者举报一条消息,并证明它是真实的。

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 线路:预计会有明显延迟,更像对讲机,而不是传统电话。如果联系人无法接通,通话会显示为未接,你可以留一条语音。也支持轻量级的屏幕共享。

Outpost Video

两种模式

可选组件,默认关闭,作为 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 是单个可执行文件,无需安装,也无需管理员权限。

从这里继续

为你和你的群组

孩子的照片、奶奶的语音、俱乐部的聊天,都留在你们之间。这里介绍群组管理者需要做什么,以及 Chat Control 为什么与你有关。

为您的公司

保密协议下的项目、视频会议、同事间的聊天:数据都留在您办公室的一台电脑上。Naisho 与您现有的工具并用。

联系我们