私密设计:我们如何构建 Firefox 同步

什么是 Firefox 同步,为什么要使用它

今天早上在笔记本电脑上开始的那个购物之旅?今晚在手机上继续。你中午发现的那个晚餐食谱?立即在厨房平板电脑上打开它。安全地连接你的个人设备。 – Firefox 同步

Firefox 同步允许你在不同的设备之间共享你的书签、浏览历史记录、密码和其他浏览器数据,以及 发送标签页 从一个设备到另一个设备。数百万用户利用此功能来简化生活和与网络的交互方式。

但在一个与提供商共享数据成为常态的互联网上,我们认为突出 Firefox 同步的隐私方面很重要。

Firefox 同步默认情况下会保护你所有同步的数据,以防止 Mozilla 读取。我们以这种方式构建同步,因为我们优先考虑用户隐私。在这篇文章中,我们将更深入地了解我们做出的一些技术设计选择以及背后的原因。

在构建浏览器和实施同步服务时,我们认为查看所谓的“总拥有成本”很重要。 不仅仅是用户从功能中获得什么,而是他们为了易用性放弃了什么。

我们相信,通过做出正确选择来保护你的隐私,我们也降低了尝试同步的门槛。当你注册并选择一个强密码短语时,你的数据就会受到攻击者和 Mozilla 的双重保护,因此你可以无忧无虑地尝试同步。试试看,就在菜单栏里!

Sign in to Sync Button in the Firefox Menu

为什么 Firefox 同步安全

加密允许一个人保护数据,使其在没有用于加密它的密钥的情况下完全不可读。加密背后的数学原理很强大,经过了几十年的测试,世界上每个政府都用它来保护其最宝贵的秘密。

加密的难点在于密钥。你用什么密钥加密,密钥从哪里来,存储在哪里,以及它如何在不同地方移动?许多云提供商声称他们会加密你的数据,他们确实会。但他们也有密钥!虽然加密并非毫无意义,但它只是一项小小的措施,并不能抵御最令人担忧的威胁。

加密密钥是必不可少的元素。服务提供商永远不能接收它 - 即使是暂时性 - 并且永远不能知道它。当你登录你的 Firefox 账户时,你输入用户名和密码短语,它们会被发送到服务器。如果那是你提供给我们的全部信息,我们怎么能声称永远不知道你的加密密钥? 区别在于我们如何处理你的密码短语。

互联网服务的典型登录流程是将你的用户名和密码短语发送到服务器,服务器在那里对其进行哈希处理,将其与存储的哈希值进行比较,如果正确,服务器就会将你的数据发送给你。(哈希处理是指将密码转换为不可读的字符字符串的过程,该字符串无法恢复。)

Typical Web Provider Login Flow

我们设计 Firefox 账户和 Firefox 同步(我们底层的同步服务)方式的不同之处在于,你永远不会向我们发送你的密码短语。我们在你的计算机上将你的密码短语转换为两个不同的、不相关的值。用一个值,你无法推导出另一个值0。我们向服务器发送一个从你的密码短语派生的身份验证令牌,作为密码等效物。而从你的密码短语派生的加密密钥永远不会离开你的计算机。

Firefox Sync Login Flow

有兴趣了解技术细节? 我们使用 1000 轮 PBKDF2 将你的密码短语派生为身份验证令牌1。在服务器端,我们还会使用 scrypt (参数 N=65536、r=8、p=1)对该令牌进行哈希处理2,以确保我们的身份验证令牌数据库更加难以破解。

我们使用相同的 1000 轮 PBKDF2 将你的密码短语派生为加密密钥。它通过使用带有不同信息值的 HKDF 与你的身份验证令牌进行域分离。我们使用此密钥来解开加密密钥(你在设置期间生成的,我们从未看到解开),并且加密密钥用于保护你的数据。 我们使用该密钥以 CBC 模式使用 AES-256 对你的数据进行加密,并使用 HMAC3 进行保护。

这种密码设计很可靠 - 但常量需要更新。一千轮的 PBKDF 可以改进,我们打算在将来进行改进 (Bug 1320222)。该令牌仅通过 HTTPS 连接(带有预加载的 HPKP 固定)发送,并且不会被存储,因此当我们最初开发它并需要支持低功耗、低资源设备时,就做出了权衡。AES-CBC + HMAC 是可以接受的 - 能够在将来某个时间升级到经过身份验证的模式会很好。

其他方法

这不是构建浏览器同步功能的唯一方法。至少还有三种其他选择

选项 1:与浏览器制造商共享你的数据

在这种方法中,浏览器制造商能够读取你的数据,并使用它为你提供服务。例如, 当你将浏览历史记录同步到 Chrome 时,它会自动进入你的 网络和应用活动,除非你更改了默认设置。正如 Google Chrome 帮助所解释的,“你的活动可用于个性化你在其他 Google 产品(如搜索或广告)上的体验。例如,你可能会在你的 feed 中看到根据你的 Chrome 历史记录推荐的新闻故事。”4

选项 2:使用单独的密码进行登录和加密

我们开发 Firefox 同步是为了尽可能易于使用,因此我们从一开始就设计了它,以派生身份验证令牌和加密密钥 - 我们永远不会看到密码短语加密密钥。如果密码短语被发送到服务器,则无法安全地从密码短语派生加密密钥。

但是,可以添加一个永远不会发送到服务器的第二个密码短语,并使用它来加密数据。Chrome 提供了此功能作为非默认选项5。你可以使用你的 Google 账户凭据登录以同步;但你选择一个单独的密码短语来加密你的数据。但你必须选择一个单独的密码短语。

总的来说,我们不喜欢需要第二个密码短语的设计。这种方法对用户来说很混乱。选择相同的(或类似的)密码短语非常容易,从而抵消了设计的安全性。很难确定哪种更混乱:要求第二个密码短语还是让它可选!让它可选意味着它很少被使用。 我们不认为用户应该选择隐私。

选项 3:手动密钥同步

审计密码设计的关键(双关语)是询问密钥:“它从哪里来?它去哪里?”在 Firefox 同步设计中,你输入你选择的密码短语,它被用来派生一个永远不会离开你的计算机的加密密钥。

同步的另一种选择是移除用户选择,为你提供一个密码短语(它永远不会离开你的计算机)。该密码短语应该是安全且不可猜测的 - 这是一种优势,但它几乎不可能记住 - 这是一种劣势。

当你想要添加一个新的设备进行同步时,你需要将你的现有设备放在附近,以便手动读取密码短语并将其输入到新设备中。(如果你的新设备有摄像头,你也可以扫描二维码)。

其他浏览器

总的来说,同步以这种方式工作,因为我们认为这是最好的设计选择。选项 1 和 2 默认情况下不会提供彻底的用户隐私保护。选项 3 会导致更低的用户采用率,从而减少我们能够帮助的人数(更多信息请参见下文)。

如上所述,Chrome 默认情况下实施了选项 1,这意味着除非你在启用同步之前更改设置,否则 Google 将会看到你所有的浏览历史记录和其他数据,并使用它为你推销服务。Chrome 还将选项 2 作为一项可选功能实施。

Opera 和 Vivaldi 遵循 Chrome 的做法,默认实现选项 1,并将选项 2 作为可选功能。更新:Vivaldi 实际上默认情况下会提示您输入单独的密码(选项 2),并允许您选择退出并使用登录密码(选项 1)。

Brave 也是一个注重隐私的浏览器,它已经实现了选项 3。事实上,Firefox 在其最初的同步协议中也实现了选项 3 的一种形式,但我们根据用户反馈6在 2014 年 4 月(Firefox 29)更改了我们的设计。例如,我们最初的设计(和 Brave 目前的设计)使得如果您丢失设备或设备被盗,则更难恢复对数据的访问权限。密码或口令可以显著简化普通用户的使用体验,并显著提高用户的同步采用率。

Brave 的同步协议有一些有趣的细节7。一个明显的缺点是,如果您的口令被恶意软件盗取,您无法更改它。另一个有趣的细节是 Brave 不会跟踪您拥有多少设备或设备类型。这是一种微妙的安全权衡:了解用户的信息越少越好…… 缺点是 Brave 无法让您检测到何时有新设备开始接收您的同步数据,也无法让您取消授权该设备。我们尊重 Brave 的决定。然而,在 Firefox 中,我们选择为用户提供此附加的安全功能(以了解更多关于他们设备的信息为代价)。

结论

我们设计了 Firefox Sync 以保护您的数据——默认情况下——因此 Mozilla 无法读取它。我们以这种方式构建它——尽管权衡会使开发和提供功能变得更加困难——因为我们把用户隐私放在首位。在 Mozilla,这种优先级是我们使命核心部分,即“确保互联网成为全球公共资源…… 个人可以在其中塑造自己的体验,并且能够独立、安全地进行操作。”


0 如果您选择弱密码,则可以使用其中一个密码来猜测另一个密码。

1 您可以在完整协议规范中找到更多详细信息,或者按照代码从这里开始。为了简化这篇博文,我们省略了一些细节,包括 kA 和 kB 密钥之间的区别,以及特定于应用程序的子密钥。

2 服务器哈希代码位于这里

3 加密代码可以在这里看到这里

4 https://support.google.com/chrome/answer/165139 “使用 Chrome 历史记录个性化 Google”部分

5 Chrome 71 表示“为了提高安全性,Google Chrome 将加密您的数据”,并将这两个选项描述为“使用您的 Google 用户名和密码加密同步的密码”和“使用您自己的同步口令加密同步数据”。 尽管有这种措辞,但只有同步口令选项可以保护您的数据免遭 Google 的访问。

6 Sync 的原始工程师之一撰写了两篇博文,介绍了向新同步协议的过渡,以及我们为什么要这样做。如果您对密码学的可用性方面感兴趣,我们强烈建议您阅读它们,以了解我们学到了什么。

7 您可以在Brave 的设计页面上详细了解 Brave 同步。

关于 Tom Ritter

Tom Ritter 的更多文章……


36 条评论

  1. Ted

    感谢 Tom 的详细分析。
    是否可以将 Firefox Sync 作为书签同步的中心位置,即使从其他浏览器中也一样?我喜欢 Mozilla 成为我数据的公正、注重隐私的守护者的理念,但由于 Firefox 与我工作的主要系统之间存在长期冲突,我不得不使用不同的浏览器来工作。保持所有内容同步,尤其是私密且免费同步,是一团糟。

    2018 年 11 月 13 日 下午 11:06

    1. Tom Ritter

      既是又是。没有其他主要浏览器原生支持我们的同步协议。但我们的协议是开放的,因此可以为其他浏览器编写扩展程序,这些扩展程序连接到我们的同步服务器(您甚至可以实际运行自己的同步服务器)。我不确定此类扩展程序是否已经存在(并且不想暗示性地认可任何扩展程序),但可以构建!

      2018 年 11 月 13 日 下午 11:55

  2. Raphael

    我不同意选项 1 和选项 3 之间的选择。

    在旧的同步协议中,在不知道实现细节的情况下,我可以作为非技术用户合理地确定同步服务器无法访问我的(未加密)数据,因为否则为什么要使用两个不同的密码呢?

    使用新的同步协议,我必须具备技术技能才能理解为什么即使我只有一个帐户密码,您的服务器仍然无法访问我的数据。

    2018 年 11 月 13 日 下午 1:17

    1. Tom Ritter

      我认为理解使用两个不同的密码意味着同步服务器无法访问我的(未加密)数据,这正是使您成为技术用户的因素。非技术用户可能以前从未听说过加密,更不用说理解密码如何控制它。

      2018 年 11 月 14 日 上午 10:49

      1. johny

        Tom,对于“非技术用户”,有 Chrome、Safari 和 Edge。

        而且人们开始接受更多教育,千禧一代正在崛起,所以不要再说什么“让它对每个人都更容易使用”并削弱安全性。

        2018 年 11 月 27 日 上午 0:57

  3. TG

    嗨!
    我喜欢同步,但它推送链接的速度太慢。
    我必须转到 Android 手机上的历史记录选项卡并刷新它。
    关于此事有什么消息吗?

    2018 年 11 月 13 日 下午 8:38

  4. Qio Xuan

    Tom Ritter,我们感谢您在隐私方面的工作以及与 Tor 项目的合作!继续努力,我们为之感到自豪。

    2018 年 11 月 13 日 下午 8:42

  5. Luis Ashurei

    好文章!我一直从“选项 3”的原始同步协议使用 FF 到现在。

    用户如何在切换到新设备时在新同步协议中获取加密密钥?从密码重新生成?

    2018 年 11 月 13 日 下午 10:29

    1. Tom Ritter

      您在每个登录同步的设备上都会从您的 Firefix 帐户密码派生相同的身份验证令牌和加密密钥。

      2018 年 11 月 14 日 上午 10:47

  6. Bruno

    我丢失了所有书签。不再使用 Firefox!

    2018 年 11 月 14 日 上午 0:42

  7. Krishna Mohan

    您是否愿意分享选择 PBKDF2 的理由?我最近读到它[速度很慢](https://security.stackexchange.com/questions/16354/whats-the-advantage-of-using-pbkdf2-vs-sha256-to-generate-an-aes-encryption-key)。这是有意为之的。

    2018 年 11 月 14 日 上午 0:53

    1. Tom Ritter

      它应该是慢的。选择慢速哈希函数是有意的;因为它可以使攻击者更难在他们以某种方式获得您的身份验证令牌的情况下猜测您的密码。将来,我们希望使其速度更慢以提供更高的安全性!

      2018 年 11 月 14 日 上午 10:46

  8. Yuri Namekovski

    这都很好,但 Firefox 不会同步

    * 搜索引擎
    * Cookie 设置

    在每个设备上配置这些仍然是一件很痛苦的事。

    2018 年 11 月 14 日 上午 1:16

  9. allo

    使用独立加密密钥的同步 1.1 设计很棒。
    新方案的弱点可以在没有太多技术细节的情况下展示出来

    * 在新计算机上安装 Firefox
    * 使用电子邮件地址和密码登录同步
    * 您获得了数据

    登录页面由 Mozilla 托管,因此他们可以(例如,如果他们遭到黑客攻击)记录您的用户名和密码。这正是您进行新登录所需的所有信息。不再有本地秘密(只能通过登录数据恢复)。

    而且自托管变得复杂得多 :(

    2018 年 11 月 14 日 上午 4:23

    1. Tom Ritter

      来自同步开发者

      您正确地理解该登录流程最终由网页驱动,这是我们在系统可达性和可用性方面做出的有意权衡。

      这当然是一种并非每个人都能接受的权衡,但我们确信这对我们大多数用户来说是正确的选择。您可以在这两个错误中阅读一些有关此主题的先前讨论(以及其中额外的建议/反馈,非常欢迎)。

      2018 年 11 月 14 日 上午 11:04

      1. allo

        我知道这种权衡,在某种程度上我理解您的决定,但我不喜欢它对我的安全意味着什么。

        我不确定已经耦合的 Firefox 是否更安全。当我登录时,登录页面是否更安全?
        我想只有登录令牌在同步期间发送,而密码只有在登录时发送?

        在同步 1.1 中,我喜欢简单的同步服务器。我使用了 Django 版本,它无需太多努力就能像官方版本一样工作。
        我试图让同步 1.5 与其他人一样工作,但在全栈同步方面我们没有成功(同步服务器似乎很容易使用,但它接受 Mozilla 登录令牌)。

        当时的文档不是很好,我们在关于它的博文文章的评论中讨论了它(我认为当作者自己也放弃时,它就被删除了)。
        可能现有的 Docker 镜像会让它更简单,但需要以 Docker 的全部开销作为权衡。

        目前我不急需同步,所以我目前根本没有同步。
        希望您不要将此视为对 Mozilla 的过分不信任,但我个人喜欢避免将如此私人的数据交托给第三方。

        2018 年 11 月 14 日 下午 2:24

  10. Daniel

    Firefox Sync 是我信任个人数据的为数不多的“云服务”之一。我很高兴有 Mozilla。你们对许多人的生活产生了真正的影响。加油!

    2018 年 11 月 14 日 上午 6:17

  11. void@klankschap.nl

    不幸的是,在现实世界中,(预期)设计、它的实现和它的(意外)使用之间存在(可能)差异。

    2018 年 11 月 14 日 下午 07:15

  12. Brian Doyle

    很棒的文章。我想知道您如何处理多个设备使用同步功能访问同一个帐户?加密密钥会以某种方式发送到其他设备,还是每个设备都有一个唯一的密钥,因此 Mozilla 服务器上有多个身份验证令牌?谢谢!

    2018 年 11 月 14 日 下午 07:32

    1. Tom Ritter

      因为您的密码相同,所以您的身份验证令牌和加密密钥在所有设备上都会推导出相同的值。

      2018 年 11 月 14 日 下午 10:45

      1. Brian Doyle

        这解释了令牌和密钥基于密码的原理。所以如果您更改密码,则令牌和密钥也会更改?如果是这样,数据需要用新令牌加密吗?对不起,如果这些问题很蠢,我正在努力学习它是如何工作的。再次感谢!

        2018 年 11 月 14 日 下午 12:29

        1. Tom Ritter

          当您更改密码时,您的身份验证令牌确实会更改,我们会将数据库中的(哈希)条目替换为新的(哈希)值。您的加密密钥也会更改。

          为了简化,该图省略了它,但从您的密码推导出的加密密钥不会直接加密您的同步数据。它实际上加密了通常称为“数据加密密钥”(或 DEK)的东西。DEK 用于加密您的同步数据。DEK 在您设置期间由您生成,并且只有在由您推导出的加密密钥加密后才发送到服务器(此过程称为“包装”DEK)。

          因此,当您更改密码时,您会推导出一个新的加密密钥,我们会向您发送包装的 DEK,您使用旧的加密密钥解密 DEK,使用新的加密密钥重新加密它,然后将重新包装的 DEK 发送给我们。这使您能够安全地更改加密密钥,而无需重新加密所有数据。

          2018 年 11 月 14 日 下午 12:39

  13. Mark T

    感谢您与其他浏览器的比较。您是否有与 Safari 进行比较的信息?我一直认为 Apple 非常注重隐私。但我也有兴趣知道他们是否在 Safari/iCloud 同步隐私设计和实施中也有自己的“皱纹”。

    2018 年 11 月 14 日 上午 09:36

    1. Tom Ritter

      我恐怕我没有研究 Safari/iCloud。他们声明“除了 Apple 之外,任何人都无法访问端到端加密的信息”(此处),书签就是一个例子——但很难对其进行明确分析,因为它不是开源的。我认为有一些关于该主题的黑帽演讲。

      2018 年 11 月 14 日 下午 10:42

  14. kz

    感谢您使用自托管同步的链接进行评论。我们希望在某个时候发布关于自托管同步和帐户状态的博文。

    当我们的参与者创建像同步这样的在线资源时,对于我们来说,它相当于“影子 IT”,不是因为他们在没有我们仁慈批准的情况下创建它,而是因为他们在发生变化时向我们寻求帮助。员工变动。政策变动。情况变动。期望变动。

    最终用户埋藏在与工作相关的同步中的信息(因为 Firefox 将其置于首要位置)属于企业,IT 需要能够证明其可用性、来源和生命周期。自托管是一个开始。

    2018 年 11 月 14 日 下午 13:57

  15. enthusiast

    感谢,Firefox 同步通过体验得到了很大改进。关于如何让 Firefox 同步变得更好的几点略微偏离主题的想法

    – Firefox 同步(尚未)同步搜索设置/引擎:https://bugzilla.mozilla.org/show_bug.cgi?id=444284
    – Firefox 同步(尚未)同步容器:https://github.com/mozilla/multi-account-containers/issues/339

    最近我的书签有些无法使用。这是 Firefox 63.0.1 在 macOS 10.14.1 上的新行为,我还没有时间分析它,但这非常令人沮丧。

    Tom,感谢您发布这篇博文,我很喜欢阅读它。

    2018 年 11 月 14 日 下午 15:06

  16. Amd

    您好

    这些都很好,但 ISP 仍然拥有您的位置和互联网地址。为什么不提供像 Opera 一样的 VPN 功能?如果有一种方法可以完全保持位置上的隐私,那么更多国际用户可能会使用 Firefox。位置隐私可能同样重要。

    此外,Firefox 在隐私方面与 Safari 相比如何?

    2018 年 11 月 14 日 下午 19:52

  17. Mike

    很好的总结,谢谢。

    如何在 QNAP NAS 上保留我自己的同步服务器,该服务器在升级到 Firefox 60 版本之前工作正常?
    我无法在当前版本中设置。如果有一个扩展/插件,那就太好了!

    谢谢

    2018 年 11 月 15 日 下午 12:29

  18. Chris

    嗨!

    帐户数据是在按下“删除帐户”按钮后立即删除,还是有一段时间后删除这些数据的触发器?

    2018 年 11 月 15 日 下午 12:38

  19. Shuj

    改进 Firefox 同步的一个简单方法是在新用户跳过所有密码和电子邮件地址障碍之前告诉他们,他们需要一部智能手机才能完成注册。我现在有一个注册过程只完成了一半 :-(

    2018 年 11 月 15 日 下午 18:52

  20. Clemens

    这是一个非常有趣的问题,我们针对此特定问题进行了研究(“AuthStore:基于密码的身份验证和不可信环境中的加密数据存储” https://arxiv.org/abs/1805.05033)。

    我认为同步身份验证可以在两点上改进

    1) 最终,KDF 参数需要随着时间的推移进行调整,例如,需要增加迭代次数以减轻更快 CPU 的影响……此外,KDF 参数应可由用户配置。
    2) 如果用户输入了错误的密码,例如在其他服务中使用的密码,服务器可能会对身份验证令牌发起暴力破解攻击。对于 Mozilla 来说,这个问题应该不太严重;)

    在我们提出的解决方案中,我们解决了这些问题。用户可以随意选择和调整 KDF 参数。为了使它起作用,我们在服务器上存储 KDF 参数。然而,这会导致其他问题,即服务器可能会执行“参数攻击”。简而言之:在参数攻击中,服务器将最弱的可能的 KDF 参数发送回用户,以便获得更容易进行暴力破解的身份验证令牌。为了防止这种攻击,我们使用经过调整的,可证明安全的 EKE2 协议版本。该协议不会泄露有关输入密码的任何信息。例如,如果您在密码字段中输入了“123”(不是您的真实密码),服务器就无法知道您输入的是什么。服务器只能判断输入的密码是否正确。此属性可以防止参数攻击,因为服务器不会了解有关弱化身份验证令牌的任何信息。有关更多详细信息,请查看我们的论文。

    我将我们的解决方案实现为浏览器扩展(FejoaAuth:https://fejoa.org/fejoapage/auth.html)。但是,将类似于 FejoaAuth 的东西集成到浏览器中会方便得多。我们的方法可用于使用相同的密码安全地对多个服务进行身份验证,并且同一个密码甚至可以重复用于数据加密。

    如果您有任何问题,请告诉我!

    2018 年 11 月 16 日 下午 16:52

  21. wolfiedk

    我一直在寻找 X-Marks 的替代品,我尝试使用 FFSync,但不幸的是,它需要访问我的手机,这是我绝对不会同意的。

    该怎么办?

    2018 年 11 月 17 日 下午 12:33

  22. Igor Bukanov

    Firefox 同步仍然假设用户必须记住两个密码,一个用于电子邮件,一个用于同步,因为在新的 Firefox 安装中,访问同步需要通过电子邮件进行确认。因此,与 Chrome 的实际区别在于,在 Firefox 中,选项 2 是唯一的选择,对于电子邮件,可以使用任何电子邮件提供商,而不仅仅是 Google。

    2018 年 11 月 19 日 上午 06:56

  23. tc

    感谢您分享设计理念,这很少能让最终用户访问。从不将密码短语从用户的硬件上移开是一个很棒的理念。
    我还很喜欢您对服务评估中“总拥有成本”的看法。

    2018 年 11 月 29 日 上午 06:38

  24. fred

    嗨!

    我希望能够使用自己的工具(即 openssl)而不是此实现中包含的软件来生成加密密钥。我知道这会增加入门难度,因此将其作为高级用户的选项将是一个好主意。这样,两个独立且完全无关的工具链就会被用于构建系统,在我看来这是必不可少的。我不是不信任 Mozilla(我信任),但我认为这样的系统不应该依赖于信任。

    – Fred

    2018 年 12 月 2 日 上午 03:02

  25. Stephan Porz

    您的文章说服我终于开始使用 Firefox 同步!非常感谢您的文章以及这个精美的设计。

    从历史上看,我一直将大多数同步托管在我控制的计算机上,仅仅因为第三方供应商实际上能够读取我的数据,或者不会详细解释他们如何保护我的数据隐私。

    2018 年 12 月 4 日 上午 01:43

本文的评论已关闭。