新闻 · Blackbear 的安全
分享如何保持密封
大多数产品都是在分享这一步悄悄放弃了加密。一旦两个人需要同一份文档,最省事的办法就是在服务器上解密,再把它称为一项功能。我们没有选择这条捊径。
Blackbear 分享文件、文件夹和实时编辑,却不把密钥交给我们。下面讲讲它底层是怎么运作的。
权限是一份签名文件
每个共享空间都由一份能力模式(capability schema)管理:这是一份很小的策略文件,列出每位成员以及他们能做什么。所有者的设备会为它签名。每个新版本都链接到上一版本的哈希,并把纪元计数器往前推进一格。
你的设备一旦见过某个空间的某个版本,就会拒绝任何更旧的版本:第八版永远不会被第七版取代。全新的设备没有历史可供比对,只能从最先收到的版本开始;从那一刻起,这个棘轮就只进不退。服务器负责分发策略,却无法编写策略,也无法对任何有历史的设备把策略倒回去。
一把密钥,逐人密封
共享空间有一把内容密钥。没有人会把它公开地到处传递。它会用每位成员的公钥分别密封,服务器保存这些密封好的副本。它可以保管其中每一份,却一份也打不开。
无法伪造的角色
读者、评论者、编辑者、管理员、所有者。每一次角色授予都带着授予者的签名。改数据库里的一行记录,提升不了任何人的权限。
撤销即轮换
移除某个人会翻开新的纪元:内容密钥轮换,并为留下的每个人重新密封。从那一刻起分享的一切,对离开的人来说都是一片漆黑。
诚实起见,也得说说另一半:对方已经同步到的内容,本来就已经在对方手里。没有哪个协议能伸进一台设备,把发出去的数据收回来。谁要是声称自己的撤销能做到这一点,那是在推销什么。
实时编辑只转发密文
实时协作把加密的 CRDT 更新经由服务器流式传输。服务器能看到成员指纹、密钥纪元和数据大小。它给数据流排序,再分发出去。出现在合作者光标下的文字,是在对方的设备上解开的,而不是在我们这里。
作者身份有签名
你的操作用你的个人资料密钥签名。Pax 用 Pax 自己的密钥签名。你写的和你的助手写的,在密码学上始终泾渭分明,你不需要做任何设置。
你的人不用付费
分享不要求对方付费。内容密封对每位成员都一样,不论免费还是付费。在付费主持人赞助的空间里,免费访客也能完整参与:发消息、一起编辑、加入通话,遵循和其他人一样的访问规则。背后的规则很简单:每一个经服务器转发的连接都必须至少包含一位主持人,服务器无法证明这一点时,就会拒绝。
这个系列就到这里。你的内容在传输之前就在你的设备上密封。我们的服务器只保存一份简短、公开的元数据清单。而分享只会扩展这层密封,不会打破它。
延伸阅读
- Public-key cryptography — 向某个人密封是怎么回事
- Conflict-free replicated data types — 实时协作编辑背后的数学
- Yjs — 我们的实时编辑所基于的 CRDT 引擎
- Hash chains — 为什么权限无法被悄悄倒回
- Digital signatures — 为什么角色无法伪造
Blackbear 的安全
- 1. 我们读不到的东西
- 2. 我们的服务器能看到什么
- 3. 分享如何保持密封 (当前文章)