Clavenzo
中文
免费获取

Clavenzo 如何运作

总体介绍,语言平实,不省略任何要紧的地方。如果你只想要简短的答案:你的手机或电脑生成一把密钥,这把密钥就是你的地址,两部设备之间的一切都用只有这两者才拥有的密钥加密。

你的身份是一把密钥,不是一个账号

大多数消息应用一上来就要电话号码。这个号码由运营商签发,与法定姓名绑定,任何能说服营业厅店员的人都可以把它过户走,而拿到号码的人都能反查。作为私密谈话的地基,它太不牢靠。

Clavenzo 的起点不同。第一次打开时,应用会在设备上生成一对密码学密钥。公钥那一半成为你的地址。私钥那一半留在设备里。它从不备份到任何云端,也从不落到我们手上。只有你自己导出时它才会离开设备,并用一次性代码密封。

你的地址有两种呈现方式:一个可以念出来或粘贴的 16 位代码,以及一个可供扫描的二维码。此外还有一串更短的代码,只用来核对你是不是在和正确的人说话,短到无法用它添加任何人,长到足以当面念出来比对。

Clavenzo 的身份界面:一个二维码,下方是完整代码,再下方是用来核对对方身份的短代码。

你拨出一通电话时会发生什么

两部手机要先找到彼此,然后就密钥达成一致。Clavenzo 把第二步做得很牢靠,于是第一步对窃听者来说就变得没什么意思了。

  1. 找到彼此。 如果你呼叫的是同一 Wi-Fi 下、列在“附近的人”里的某个人,两部手机会直接连接,没有服务器参与。否则,一个很小的会合服务会投递一份密封的邀请,然后两部手机尝试在彼此之间建立直连通路。为此,每部手机都会把自己的网络地址告诉对方,所以对方的应用会得知你的 IP 地址。
  2. 商定密钥。 两部设备进行一次经过签名的临时 X25519 交换,并在接通后片刻再叠加一次后量子密钥交换 ML-KEM-768。“临时”是关键词:密钥只为这一通电话而生,通话结束即销毁。
  3. 通话。 语音每 20 毫秒编码为 33 字节,其中每一个数据包都单独加密并做完整性认证。对线路上的任何观察者而言,内容看起来就是随机噪声,不过数据包的时间规律仍可能透露出某人何时在说话。
  4. 核对。 两部手机从真正协商出的那把密钥推导出四个词。把它们念出来。如果两块屏幕上一致,中间就没有第三方。

最后这一步正是人们会跳过、却最要紧的一步。加密保证的是:持有另一把密钥的人才能读到你。但加密本身无法告诉你那个人是谁。四个词就是弄清这一点的方法。

通话中的 Clavenzo 通话界面:来电的人、通话时长、HD 与标准音质的切换,以及要大声读出的四个安全词。

为什么今天这通电话的录音依然无法解读

有一种常见而现实的攻击靠的是耐心:现在把加密流量录下来,日后再拿到密钥(通过法院命令、通过窃取、或者多年之后攻破某台设备)然后从容解密。

临时密钥让这种做法落空。真正加密你这通电话的密钥只在通话期间存在于两台设备上,结束时便已销毁。你的长期身份密钥只负责为这次交换签名,它一秒钟的音频也没有加密过。明天攻破它,可以让人在明天冒充你,却打不开昨天录下的内容。

这种性质叫作前向保密,它是一通加密电话所能拥有的最有价值的东西。

每通电话还会在接通后的一瞬间用 ML-KEM-768(一种后量子算法)重新生成密钥,前提是双方的应用都支持。它应对的是同一个有耐心、却拿着更好工具的攻击者:现在录下的流量,将来用量子计算机打开。消息和文件目前则不同。它们用 RSA 和 ML-KEM-768 两者同时封存,但如今 ML-KEM 密钥是从 RSA 密钥派生出来的,所以我们暂时不称它们具有后量子保护。此外,一条在服务器上等待关机手机的消息没有前向保密:录下它、之后又拿到收件人身份密钥的人,可以把它打开。

服务器做什么,又做不到什么

有一件事,点对点应用确实无法独力完成:唤醒一部应用已经关闭的手机。会合服务正是为此而存在,并且在能完成这件事的前提下,被设计成尽可能少知道。

  • 它永远看不到内容。 邀请和离线消息在离开你的手机之前,就已经用收件人的密钥密封。服务存放的是它打不开的字节。
  • 它不知道你的名字。 它的目录保存每部设备的地址、公钥和平台,以及手机的推送令牌。它没有名字、没有手机号、没有邮箱地址,因为应用从来不问。任何拥有某个地址的人,都可以查询该地址是否已注册。
  • 它的通知不含发送者,也不含内容。 唤醒你手机的那条推送只说明是来电还是消息。在 iPhone 上,消息通知显示为“New message”和“Tap to read”。Apple 和 Google 能看到有东西被发送以及发送时间,但看不到内容,也看不到来自谁。
  • 它忘得很快。 通话邀请存活 60 秒。密封的离线消息最多 72 小时。设备注册若不续期,30 天后失效。
  • 在邀请或消息等待期间,它看得到谁在给谁打电话。 通话邀请或离线消息必须写明发往哪把密钥、来自哪把密钥,所以服务器会看到两者经过。邀请或消息一旦消失,它就不保留这对双方的任何记录:邀请 60 秒后即被遗忘,消息最多 72 小时。把发送方也隐藏起来(密封发件人)已列入我们的计划。我们的服务器位于 Cloudflare 之后,Cloudflare 能看到同样的信息,但永远看不到内容。

当通话无法直连时(通常是因为两端网络都不放行,这在部分移动运营商上时有发生),中继会转发加密数据包:先是我们自己经由 UDP 的中继,然后经由 TCP,再然后是 Cloudflare 的中继。中继只负责转发数据,它没有密钥,也无法取得密钥。它确实能看到两部设备的 IP 地址。目前没有能让每通电话都经由中继的设置,而且在每一通通话中,无论是否经由中继,每部设备都会得知对方的 IP 地址。

同一 Wi-Fi 下的通话

同一个 Wi-Fi 网络下、或连到同一个热点的两部设备,可以找到彼此并完成一整通加密通话,不需要互联网连接,也不需要服务器。目前,在 Android 上需要被呼叫的手机已点按已可接听,在 iPhone 上需要该手机上的 Clavenzo 处于打开状态,在电脑上只要 Clavenzo 在运行即可;iPhone 可能会请求使用本地网络的权限。只要两部设备上都打开了应用,消息和文件也同样以加密方式这样传递。

这不是一种安全性打折的后备模式。加密是同一套,安全词也是同一套,只是把“会合”这一步换成了本地发现。它在飞机上、在没有信号的建筑里、在自建网络的场所,以及任何互联网不可靠或不受欢迎的地方都用得上。

Clavenzo 在本地 Wi-Fi 上等待来电,建立通话的各个步骤按顺序列出。

当东西坏掉时

Clavenzo 是围绕一个难题设计的:一切都出问题时,还有什么能用?一场风暴毁掉一个数据中心。一个国家掐细了网络。一家服务商突然消失。基站失灵,只剩下局域网。下面对每一种情况都给出了答案。

  • 完全没有互联网。 同一 Wi-Fi 或热点下的手机可以直接互相呼叫,但受上文所述的限制。不需要服务器,房间之外什么都不需要。
  • 服务器很小,而且不止一台。 它们只负责介绍两部手机、保管封存的消息。除非需要中继,音视频从不经过它们,所以整个服务只靠几台分属不同服务商、位于不同地点的小机器运行。
  • 没有哪一台是不可或缺的。 你的手机在每一台服务器上登记,并从每一台收取消息。一台倒下,其余照常工作;一通电话会经由送达它的那台服务器接听。
  • 服务器清单经过签名。 手机从服务器本身获取清单,并用一把从不接触任何服务器的密钥校验。新服务器加入无需更新应用,旧清单也永远无法被重放,把手机引到不该去的地方。
  • 没有 DNS 也没关系。 清单里有带固定证书的直连网络地址,所以即使域名服务器宕机或撒谎、内容分发网络故障,手机仍能联系上服务器,而且不必信任任何证书机构。
  • 两套中继,一架梯子。 当两边网络拒绝直连时,由中继传送加密通话:先是我们自己经由 UDP 的中继,然后经由 TCP,再然后是 Cloudflare 的中继。其中一套故障只是少了一级台阶,而不是断了通话。
  • 细窄而不稳定的链路。 语音只需 13.2 kbit/s。抖动缓冲会测量网络并随之调整,丢失的数据包被掩盖而不是发出咔嗒声,大文件会自行暂停和续传。
  • 会干扰的网络。 内置 SOCKS5 和 HTTP CONNECT 代理,适用于强制使用代理的网络,或本地解析器被屏蔽、被篡改的网络。

消息、照片、文件与语音消息

消息功能建立在同一套加密之上。文字、照片、文件和语音消息都为收件人加密,对话则保存在你手机上应用的私有存储中。这部分存储受手机自身的加密和屏幕锁保护,并且被排除在 Google 和 iCloud 备份之外。在电脑上,对话保存在你的用户账户下应用自己的文件夹中。

发给关机对象的消息,会用对方的密钥密封后留在会合服务处,最多保存 72 小时,而它连一个字节也读不懂。

超过 1 MB 的文件是一个刻意保留的例外:它们只在手机之间传输,绝不经过服务器。如果暂时还没有直连通路,传输会先等待并自动续传,而不是悄悄把你的大文件塞进别人的机器里绕一圈。

此外还有按对话设置的阅后即焚消息,你这边从发出时开始计时,对方那边从看到时开始计时;可以一次性双向关闭的已读回执;以及消息请求状态,在你接受之前,不在联系人里的人无法得知他的消息是否送达或已读。

深色模式下的一段 Clavenzo 会话:双向消息和已读标记、一条通话记录、一张照片和一条语音消息。

你可以开启的功能

  • 应用锁。 回到 Clavenzo 时需要手机的屏幕锁(PIN、图案、指纹或面容),在 Windows 上则需要 Windows Hello。通话仍会响铃;通知不再显示消息正文。Linux 版暂不提供此功能。
  • 屏幕安全。 在 Android 上,阻止对应用截屏和录屏,并在最近任务列表中隐藏其内容。在 iPhone 上,没有任何应用能阻止截屏,因此它会在应用切换器中隐藏该应用。在 Windows 上,它让窗口不出现在截屏、录屏和屏幕共享中;在 Linux 上则无法强制实施。备份码和转移码则无论此设置如何,始终受保护。
  • 隐身键盘(仅限 Android)。 请求你的键盘不要从你输入的内容中学习。这只是一个请求,有些键盘会忽略它,所以应用如实这样说明。iPhone 没有为应用提供这样的请求。
  • 代理支持。 SOCKS5 或 HTTP CONNECT,适用于强制走代理的网络,或本地解析器被封锁、被污染的场合。
  • 将未保存联系人的来电静音。 它们不会响铃,但仍会作为未接来电出现,你可以回拨。
Clavenzo 的隐私设置:在此 Wi-Fi 上可见、通话路由指示灯、已读回执、静音未保存联系人的来电,以及屏幕安全。

换到新手机

两份彼此独立的导出,刻意分开,因为它们携带的东西不同。

加密备份把你的对话、照片、通话记录和联系人装进一个文件,你想放哪里都可以。它只能用导出时显示一次、且不会被保存在任何地方的代码打开。导入时只补上缺少的部分,绝不覆盖已有的内容。

身份导出搬走的是那把作为你地址的密钥。它由自己的一次性转移码密封,位于手机屏幕锁之后,而这也是那把密钥离开设备的唯一途径。导入之后,新手机就以那个身份应答。

这套架构的边界在哪里

任何设计都有边界,以下是我们的。

  • 谁在和谁说话。 通话邀请或离线消息会写明它在哪两个地址之间传递,所以在它被保管期间,服务器以及位于其前端的 Cloudflare 都能看到这一对地址。直连通话开头的握手也以明文携带双方的身份密钥,所以监视那个网络的人能看出是哪两个身份在通话。两者都不会泄露所说内容的一个字。它们都是元数据,也都在待修复清单上。
  • 时间与元数据。 服务器必然能看到你的设备何时上线报到。通话时数据包的节奏可能透露某人何时在说话,尽管说了什么始终没有离开加密。
  • 你的 IP 地址。 在每一通通话中,即使最终经由中继,对方的应用也会得知你的 IP 地址,因为两部设备会交换网络地址来寻找直连路径。这可以大致显示你所在的位置。中继也能看到双方的 IP 地址。
  • 你的设备才是最薄弱的一环。 谁拿着你已解锁的手机,谁就拿着你的消息。手机上的恶意软件在内容被加密之前就能读到你输入的字。这一点对有史以来所有的消息应用都成立。
  • 它没有经过独立审计。 它是用心构建并大量测试过的。这与审计不是一回事,我们也不会假装是一回事。

如果你的威胁模型包含能监控整张网络的对手,请理解这些边界,使用内置的代理支持,并且不要把输不起的东西押在任何单一工具上,包括这一个。

大家常问的问题