野外笔记

# 之后的密钥:共享链接如何把服务器挡在门外

共享的对话存储在我们的服务器上,而我们无法打开它。它是如何做到的,密码在哪里起作用,以及链接无法保护什么。

分享通常意味着把你的文字交给存储链接的一方。Undergrove 的共享链接经过专门设计,让服务器保存的是一份它无法读取的副本。这个办法既古老又简单,但它有一些值得了解的边界。

# 之后的部分

当你分享一段对话时,你的浏览器会生成一把新的随机密钥,用 AES-GCM 加密一份副本,并只上传密文。密钥放在链接中 # 之后。浏览器加载页面时不会把地址的这一部分发送给服务器,因此密钥会到达你发送链接的那个人手里,而永远不会到达我们这里。

我们会将密文保留 1、7 或 30 天。我们能看到它的 ID、大小,以及它的创建时间和打开时间。打开它的页面会获取密文,从地址栏读取密钥,并在标签页中解密。

再加一个密码

链接还可以要求输入密码。这时,打开副本的密钥由两者共同得出:密码先用 PBKDF2-SHA256 经过 600,000 次迭代进行拉伸,再通过 HKDF 与链接中的密钥结合。单凭链接或单凭密码都无法打开它,而且密码是在标签页中对照已经下载的副本进行检查的,因此我们永远看不到它。

仅可打开一次,以及开放时间

链接可以设为仅可打开一次。服务器会在副本首次被读取时将其删除,只保留打开的时间,这样链接就能显示它已被使用过,而不是显得从未存在。在获取副本之前,页面会请你确认,以免聊天应用的链接预览把这一次机会用掉。

链接也可以设为到某个日期才能打开。在那之前,服务器会拒绝交出密文。这靠的是服务器信守承诺,而不是密码学:副本已经存储好了,它的密钥也已经在链接里。

链接无法保护什么

  • 任何拿到完整链接的人都能读取这份副本。请像对待对话本身一样对待它。
  • 聊天和电子邮件应用会存储你发送的消息,其中的链接连同 # 及其后的部分都包括在内。
  • 解密副本的页面是由我们提供的代码。/verify 会将这些代码与构建公开的清单进行比对。

隐私页面列出了每个链接存储了哪些内容,威胁模型则说明了谁可能看到什么。

更多野外笔记

  1. 证明能说明什么,又不能说明什么

    你的浏览器在发送任何一个字之前,都会先检查 Tinfoil 的安全飞地。这项检查能确立什么,到哪里为止,以及哪些还无法在浏览器中检查。

  2. 无法读取内容的中继,仍然能看到什么

    我们的中继转发它无法打开的密文。但这并不等于什么都看不到。这里逐项列出它能看到的内容,以及原因。