# 之后的密钥:共享链接如何把服务器挡在门外
共享的对话存储在我们的服务器上,而我们无法打开它。它是如何做到的,密码在哪里起作用,以及链接无法保护什么。
分享通常意味着把你的文字交给存储链接的一方。Undergrove 的共享链接经过专门设计,让服务器保存的是一份它无法读取的副本。这个办法既古老又简单,但它有一些值得了解的边界。
# 之后的部分
当你分享一段对话时,你的浏览器会生成一把新的随机密钥,用 AES-GCM 加密一份副本,并只上传密文。密钥放在链接中 # 之后。浏览器加载页面时不会把地址的这一部分发送给服务器,因此密钥会到达你发送链接的那个人手里,而永远不会到达我们这里。
我们会将密文保留 1、7 或 30 天。我们能看到它的 ID、大小,以及它的创建时间和打开时间。打开它的页面会获取密文,从地址栏读取密钥,并在标签页中解密。
再加一个密码
链接还可以要求输入密码。这时,打开副本的密钥由两者共同得出:密码先用 PBKDF2-SHA256 经过 600,000 次迭代进行拉伸,再通过 HKDF 与链接中的密钥结合。单凭链接或单凭密码都无法打开它,而且密码是在标签页中对照已经下载的副本进行检查的,因此我们永远看不到它。
仅可打开一次,以及开放时间
链接可以设为仅可打开一次。服务器会在副本首次被读取时将其删除,只保留打开的时间,这样链接就能显示它已被使用过,而不是显得从未存在。在获取副本之前,页面会请你确认,以免聊天应用的链接预览把这一次机会用掉。
链接也可以设为到某个日期才能打开。在那之前,服务器会拒绝交出密文。这靠的是服务器信守承诺,而不是密码学:副本已经存储好了,它的密钥也已经在链接里。
链接无法保护什么
- 任何拿到完整链接的人都能读取这份副本。请像对待对话本身一样对待它。
- 聊天和电子邮件应用会存储你发送的消息,其中的链接连同 # 及其后的部分都包括在内。
- 解密副本的页面是由我们提供的代码。/verify 会将这些代码与构建公开的清单进行比对。
更多野外笔记
证明能说明什么,又不能说明什么
你的浏览器在发送任何一个字之前,都会先检查 Tinfoil 的安全飞地。这项检查能确立什么,到哪里为止,以及哪些还无法在浏览器中检查。
无法读取内容的中继,仍然能看到什么
我们的中继转发它无法打开的密文。但这并不等于什么都看不到。这里逐项列出它能看到的内容,以及原因。