安全设计

在手机上锁住,
在手机上打开。

帖子、照片和对话在离开手机之前就已封存,只有你选择的人才能打开。你和谁认识由各自的手机保存,服务器不会保存。

01 封存

只有你选择的人
才能打开

发帖时,手机先封存再发送。服务器只负责保管和传递封存的帖子,没有打开它的密钥。回复、照片、视频和链接预览也走同样的路。

一条帖子封存后的路径:写的人的手机、Krypton 服务器、收的人的手机
  1. 写的人的手机在安全核心里,为这条帖子单独生成一把新的内容密钥。

  2. 用这把密钥锁住文字、照片和视频。文字会先填充到固定大小再锁住,这样不会暴露确切的长度。

  3. 用每位收件人的加密密钥封存内容密钥,为每个人各做一个信封。写的人自己也有一个。

服务器收下密文和信封,再交给收的人。打开信封的密钥只在收的人的手机上,服务器打不开。

  1. 收的人的手机在安全核心里打开自己的信封,取出内容密钥。

  2. 用这把密钥解开帖子,显示在屏幕上。

服务器上只有密文
帖子、回复、照片、视频和链接预览在到达服务器之前就已经锁住。
每位读者一个信封
帖子的密钥为每位读者分别装进一个信封,那个信封只有那个人的手机能打开。
每条帖子一把新密钥
每条帖子和每条回复都生成新的密钥。一条帖子的密钥打不开另一条。
收件人由我的手机决定
我的手机按自己保存的 Fam 名单封存帖子。只有接受了申请,或通过二维码、Fam 链接结成 Fam 的人,才会进入这份名单。我发出的 Fam 链接在 24 小时内只能使用一次,最先打开它的人无需我确认就会成为 Fam——发出链接即表示同意。

帖子用 XChaCha20-Poly1305 锁住,信封用 X25519 封存后放进两人共享的秘密里。这个秘密同时用 X25519 和 ML-KEM-768 共享。

02 关系

你和谁认识
只留在手机上

我的 Fam 名单在手机上封存,服务器既不保存谁带了谁进来,也不保存谁发给了谁。封存的内容通过不与任何账号绑定的信箱往来。不过在请求到达的那一刻,服务器也会看到 IP 地址和时间,信箱可能因此与账号关联起来。由 Krypton 团队直接带进来的人,服务器会记下是团队带入的。

只有两部手机知道的秘密
两个人成为 Fam 后,两部手机会共享一个服务器看不到的秘密。两人之间往来的一切,都靠这个秘密找到路。
是信箱,不是账号
帖子、对话和名片会放进不与任何账号绑定的信箱,信箱编号每30天更换一次。
发送者在封存之内
谁发送的,连同签名一起封在里面,由收到的手机核对这个签名。
不留在记录里的邀请
成员收到的邀请凭证,是服务器在看不到内容的情况下签发的。有人加入时,服务器只核实凭证是否真实。服务器保存的记录里没有谁带了谁进来,但通过连接记录和当时的请求可以知道。

两人之间的秘密同时用 X25519 和 ML-KEM-768 封存,信箱密钥用 HKDF-SHA256 派生,发送者用 Ed25519 签名。

03 密钥

密钥
在我的手机里

私钥保存在我手机的安全核心里,这是 iPhone 和 Android 应用共用的核心。连绘制画面的应用代码也拿不到密钥。

密钥在我手机里的位置
我的手机
Krypton 应用
画面代码JavaScript
  • 号码牌(句柄)
  • 解开的帖子·照片

私钥不会越过这里

安全核心Rust
  • 四把私钥
  • 内容密钥
钥匙串 · 密钥库
  • 锁住的私钥
  • 仅限这部手机
Krypton 服务器
  • 公钥
  • 锁住的找回备份
  • 找回的一半 · 查找值哈希
仅限这部手机
保存在 iPhone 钥匙串或 Android 密钥库中,不会随备份转移到其他手机。新手机只能通过找回拿到密钥。
应用代码只拿到号码牌
核心给应用的是号码牌,不是密钥。离开应用,单凭号码牌什么也打不开。
不用手机号,也不用邮箱
注册和登录只用手机里的密钥。我们不收集手机号和邮箱地址。
广泛使用的标准加密
不使用自制的加密。采用广泛使用的标准,由 Rust 库 dalek 和 RustCrypto 实现。
  • X25519
  • ML-KEM-768
  • Ed25519
  • XChaCha20-Poly1305
  • HKDF-SHA256
  • BIP39

04 找回

手机丢了,
账号还在

设定 PIN,并把18个英文单词抄在纸上。单词可以在加入时领取,也可以以后在设置里创建。在新手机上单词和 PIN 都对上后,账号就会回来。

只在纸上的单词
18个单词只在创建时显示一次,并抽问几个抄下的单词来确认。可以在注册时创建,也可以以后在设置里创建。单词不会留在服务器、云端或手机上,也不会再次显示。
单词和 PIN 缺一不可
只有单词或只有 PIN 都打不开。PIN 输错几次就会锁定,服务器不用单词本身,而是用由单词单向生成的值的哈希来查找账号。
可以叫停的时间
找回要等待48小时才完成。在此期间,旧手机能看到请求并取消。
仅凭服务器持有的东西打不开
打开备份的秘密分为两半:一半在服务器上,另一半在抄在纸上的单词里。即使整个服务器被拿走,没有单词也打不开。

单词是18个 BIP39 标准单词,共192位。即使用量子计算机穷举,也需要2⁹⁶次。两半通过 HKDF 合并后打开备份。

05 通话

只留在两人之间的
通话

与 Fam 用声音交谈。声音在两部手机之间加密传送,通话记录只留在各自的手机上。

只有 Fam 之间能通话
来电经过封存,通过只有两人使用的信箱响起。服务器不记录谁打给了谁。
拨打者只有接听的手机知道
谁打来的,由接听的手机自己解开并显示在来电画面上。服务器不知道拨打者的名字。
通过中继隐藏 IP 地址
通话通常经由中继服务器接通。中继服务器能看到两部手机的 IP 地址,但打不开加密的声音,对方也看不到我的 IP 地址。如果手机收不到中继信息,两部手机会直接连接,这时双方可能看到彼此的 IP 地址。
两部手机签名的连接
两部手机各自用自己的密钥为连接信息签名。中途有任何东西被调包,通话就接不通。

连接信息用各自的 Ed25519 账号密钥签名。

06 由我决定

显示什么
由我决定

锁住应用,选择谁能看名片,屏幕上显示的内容只留在屏幕上。

应用锁
用手机的面容·指纹识别或手机密码锁住 Krypton。可以立即锁定,也可以在离开应用1分钟、15分钟或1小时后锁定。开启后,应用切换画面也不会显示内容。设置只保存在这部手机上,服务器不知道你是否使用应用锁。
谁能看名片
名片是封存的。可以在“仅 Fam”和“所有成员”之间选择,无论哪种,原图都只发给 Fam。缩小范围时,手机会用新密钥重新封存名片。
禁止截屏
在 Krypton 中看到的画面无法截屏,也无法录屏。
限时帖子
设为限时帖子后,帖子出现24小时后,帖子、对话和照片会一起消失。

07 抗量子

连量子计算机
也难以破解

有一种攻击是现在先收集密文,日后再用量子计算机打开。Krypton 在把密钥交给你选择的人的外层,同时使用如今经过验证的加密(X25519)和抗量子加密(ML-KEM-768)。

两种都破解才能打开
把两种加密得到的秘密合二为一后再封存。即使一方暴露出弱点,另一方仍能守住。这与 Signal 和 iMessage 选择的混合方式相同。
外层全部用两种加密
Fam 申请和每一对之间共享秘密的便条、封存的备份、找回、邀请包、举报等,凡是交付密钥的外层,全部用两种加密封存。一对信箱里的帖子和对话,用这样共享的 256 位秘密包裹。
无法调包的公钥
抗量子公钥也与账号签名绑定。服务器或中途任何人换成别的密钥,签名就对不上,手机不会接受。
正文的锁依然牢固
锁住帖子和照片的256位 XChaCha20-Poly1305 和 SHA-256,面对量子计算机仍有足够的强度,无需更换。

外层同时用 X25519 和 ML-KEM-768(美国 NIST 标准 FIPS 203)封存,两个秘密用 SHA3-256 合并为一。

还在迁移中的部分

  • 签名(Ed25519)还不是抗量子的。签名即使被伪造,也打不开过去的内容。每个账号在注册时就已生成 ML-DSA(FIPS 204)签名密钥并与身份绑定,我们计划在实用的量子计算机看似即将出现之前,启用与 Ed25519 同时使用的签名。
  • 匿名邀请即使面对量子计算机,也会一直隐藏是谁发出的邀请。防止邀请被伪造的部分,会与签名一起迁移。
  • 通话语音在两部手机之间用 WebRTC 标准加密锁住,这部分还不是抗量子的。

任何应用都无法保护的

  • 收到的人存进自己相册的照片,用另一台相机拍下的屏幕
  • 在解锁状态下接过我手机的人
  • 用改过的应用取出自己收到内容的人
  • 通话对方另行进行的录音
  • 已经被恶意软件控制的手机
  • 监视网络的人通过 IP 地址和时间,把信箱、通话或注册关联到账号——Krypton 不会把请求经由隐藏 IP 地址的中继发送
  • 修改过的应用无视在手机上执行的规则——屏蔽、转交次数上限这类规则由接收方的应用执行,服务器不会阻止
  • 我和某位 Fam 之间的秘密泄露——这个秘密不会随时间改变,服务器上仍留存的这一对的封存便条(最多 90 天)可能被打开

详细的技术说明将在 GitHub 上公开。