安全设计
在手机上锁住,
在手机上打开。
帖子、照片和对话在离开手机之前就已封存,只有你选择的人才能打开。你和谁认识由各自的手机保存,服务器不会保存。
01 封存
只有你选择的人
才能打开
发帖时,手机先封存再发送。服务器只负责保管和传递封存的帖子,没有打开它的密钥。回复、照片、视频和链接预览也走同样的路。
写的人的手机在安全核心里,为这条帖子单独生成一把新的内容密钥。
用这把密钥锁住文字、照片和视频。文字会先填充到固定大小再锁住,这样不会暴露确切的长度。
用每位收件人的加密密钥封存内容密钥,为每个人各做一个信封。写的人自己也有一个。
服务器收下密文和信封,再交给收的人。打开信封的密钥只在收的人的手机上,服务器打不开。
收的人的手机在安全核心里打开自己的信封,取出内容密钥。
用这把密钥解开帖子,显示在屏幕上。
- 服务器上只有密文
- 帖子、回复、照片、视频和链接预览在到达服务器之前就已经锁住。
- 每位读者一个信封
- 帖子的密钥为每位读者分别装进一个信封,那个信封只有那个人的手机能打开。
- 每条帖子一把新密钥
- 每条帖子和每条回复都生成新的密钥。一条帖子的密钥打不开另一条。
- 收件人由我的手机决定
- 我的手机按自己保存的 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 应用共用的核心。连绘制画面的应用代码也拿不到密钥。
- 号码牌(句柄)
- 解开的帖子·照片
私钥不会越过这里
- 四把私钥
- 内容密钥
- 锁住的私钥
- 仅限这部手机
- 公钥
- 锁住的找回备份
- 找回的一半 · 查找值哈希
- 仅限这部手机
- 保存在 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 上公开。