安全与透明
这一页说明 Cachet 能保证什么、不能保证什么,以及你可以怎样自己验证。我们宁可把局限说清楚,也不做夸大的承诺。
一句话说明
每条消息用一把独立的随机钥匙在你的设备上加密。钥匙存在我们的服务器上,到期后被覆盖抹除。在有效期内,拿到密文的人都能打开;过期之后,任何人都打不开,包括我们自己。
服务器存了什么
| 保存的内容 | 说明 |
|---|---|
| 钥匙编号 | 一个随机数,对应密文里写的编号 |
| 钥匙 | 32 字节随机数。到期,或阅后即焚消息被打开后,立即覆盖写零 |
| 过期时间、打开次数、最多可打开次数 | 用于倒计时、显示"被打开过几次"和阅后即焚 |
| 不保存、也拿不到的内容 | 原因 |
|---|---|
| 消息原文和密文 | 加密、解密都在你的设备或浏览器上完成,密文只在你的聊天里传播 |
| 访问密码 | 密码只在你的设备上参与计算,从不发送 |
| 账号、手机号、邮箱 | Cachet 不需要注册 |
| 访问日志 | 钥匙接口不记录访问日志;网站不使用统计代码、不加载第三方资源 |
"服务端加密接口"例外:为了方便开发者对接,我们也提供
/v1/seal 和 /v1/open 两个接口,它们由服务器替你加密或解密,因此服务器会在内存中短暂处理原文(不保存、不记录)。本网站和 Cachet 输入法不使用这两个接口。详见 开放接口。
Cachet 能防住什么
- 过期之后的任何读取。聊天记录被导出、备份、截图存档、被他人翻看手机,只要钥匙已经过期,密文就无法还原。
- 只拿到服务器数据的人。服务器上只有随机钥匙,没有密文,单独拿到数据库什么也解不开。
- 不知道密码的人。设了访问密码的消息,即使拿到密文和服务器上的钥匙,没有密码也解不开。
- 悄悄偷看。每次打开都会计数,接收方能看到"第几次被打开"。阅后即焚的消息只能打开一次,被别人抢先打开,你会立刻知道。
Cachet 防不住什么
- 有效期内拿到密文的人。这是"所有人都能解密"的代价:如果聊天平台或其他人在过期前拿到了密文,他们也能解开。对特别敏感的内容,请设置访问密码,并通过其他渠道(比如当面或电话)告诉对方。
- 对方在有效期内保存了原文。到期只能阻止之后的读取,阻止不了对方在打开时截图或抄写。
- 被入侵的设备。如果你或对方的手机、电脑已经被恶意软件控制,任何加密工具都无能为力。
- 我们服务器上的钥匙在有效期内被窃取并同时拿到密文。这需要同时攻破我们的服务器和你的聊天记录。
你可以自己验证
- 网站运行的代码:sdk/cachet.js 是完整的、未压缩的加密实现。打开浏览器开发者工具的"网络"面板,可以看到加密时只有一个请求发往服务器(索要钥匙),请求里没有你的内容。
- 公开协议:密文的每一个字节怎么构成,都写在协议文档里,并附有测试向量。安卓输入法、服务器、网页三种实现都用同一组向量做了逐字节核对。
- 使用的密码学:AES-256-GCM、HKDF-SHA256、PBKDF2-SHA256(10 万次迭代),都是标准算法。网页端使用经过独立安全审计的开源库 noble-ciphers / noble-hashes。
我们接下来会做的
- 全站 HTTPS,并启用 HSTS 和严格的内容安全策略(CSP)。
- 开源输入法和服务器的完整代码,让任何人都能检查和自行构建。
- 支持企业自行部署钥匙服务器,钥匙完全由你们自己保管。
- 邀请第三方安全机构审计,并公开审计报告。
联系我们
发现安全问题,请联系我们,我们会尽快修复并致谢。