默认情况下,Riot/Matrix启用交叉签名验证和E2E加密

2020-05-07 21:46:03

我们非常高兴能展示Riot有史以来最大的变化:从过去24小时起,我们将对所有新的非公开对话启用默认的端到端加密,同时完全重写Riot围绕E2E加密的用户体验,由Matrix中的一整套全新加密功能提供支持。我们已经在网络、桌面、iOS和RiotX Android!🎉🍾🎊🔐🛡上同时发布了这个版本。

这已经是很长一段时间了-交叉签名的第一次设计始于2018年11月,Nad的用户体验预览用于端到端加密,在2019年的大部分时间里,Uhoreg都在自己努力迭代规范并编写核心实现。然后,自2019年10月下旬以来,Riot团队的其他成员一直在加紧将其投入生产-从2020年2月FOSDEM 2020的初步实施开始,现在是今天的全面上线。那么,让我们来看看有什么大惊小怪的!

每个过去在Riot中使用过E2E加密的人都会熟悉这样一个事实,即每当任何用户在您的任何房间登录新设备时,它都会警告您-这会变得非常无聊,非常快。其基本原理是,如果您不知道您是否真的在与您认为自己是谁交谈,那么E2EE是非常无用的,就像没有证书的SSL/TLS是无用的一样。此外,有人试图破解Matrix中的加密的最有可能的方式之一是访问目标的帐户并添加一个“幽灵”设备,以便监视他们的对话。因此,当意外设备突然出现时,您应该向用户发出警告,以便他们可以进行验证。但在实践中,我们转向过度了,这最终只会让人恼火。

因此,为了解决这个问题,我们引入了用户在登录时验证自己的设备的功能-确认他们是合法的所有者,从而让所有验证过他们的人自动信任新的登录。这使我们能够自动警告用户有关其帐户的意外登录,并提供一种双因素身份验证形式以完成登录(假设用户需要以某种方式担保新登录)。我们称之为交叉签名,因为用户通过对其身份签名,将信任从一个设备转移到另一个设备。

在升级到今天的Riot版本时,您会注意到的第一件事是系统会提示您“设置加密”以使交叉签名生效:

这是因为我们需要设置恢复密码,以允许您在没有其他登录设备可用时验证您的新登录。当您在服务器上备份加密邮件密钥时,此密码短语可保护您在服务器上的交叉签名数据,并替换用于在新设备上检索历史记录的旧密码短语。因此,您现在只需使用一个密码就可以在登录和检索历史记录时验证您的设备(如果您已经使用下面屏幕截图中的切换设置了备份)。

Riot iOS还没有这个安装阶段--目前,要升级你的账户以支持交叉签名,你需要使用Riot Web、Riot Desktop或RiotX Android。(提醒一下,Riot Android很快就会被RiotX Android取代,我们还没有在旧应用程序上实现任何新的E2EE工作。)。

然后,在您的帐户上设置交叉签名后,系统将提示您检查当前会话并将其验证为您自己的会话-这意味着随后验证您的每个人都将自动信任它们。

现在是清理帐户上仍然存在的陈旧会话的好时机-这些会话存在安全隐患(您无法通过交叉签名来证明您拥有这些会话,因此您将始终看起来不受信任),而且它们会降低对其他所有人的加密速度。您可以在设置>;安全&;隐私部分中删除它们。

.这意味着您可以通过从现有会话验证新登录(应该会弹出一个“未经验证的登录”提示)来为新登录提供担保-或者您可以输入恢复密码或恢复密钥来证明您对设备的所有权。?注意:只有当您的其他骚乱已升级到最新版本以支持交叉签名时,此功能才有效。

这里的另一项新功能是,如果您正在将加密密钥备份到服务器,则验证自己的行为(通过验证现有设备或输入恢复密码/密钥)将神奇地使您的加密历史记录在新登录名上可用!✨。

登录后,只需进行一次验证即可永久信任其他用户及其所有当前和未来的设备(除非他们将其撤销)-查看由一次成功验证产生的所有绿色复选框。

请注意,交叉签名不仅仅适用于Riot:如果您交叉签名Riot的任何支持E2EE的Matrix客户端,那么验证将被记录下来,其他人也会信任它。因此,如果我在我的账户上登录Weechat(说E2EE,但还不做交叉签名),只要我从Riot验证它,所有其他说交叉签名的人都会自动信任Weechat。

交叉签名第一次合并到Riot的开发分支是在2月份的FOSDEM 2020上(我们从那以后一直在迭代它,以解决一些想法和错误),我们的Talk Making and Breaking Encryption in Matrix为感兴趣的人提供了更多的技术细节。

超级偏执狂用户需要注意的一点是:目前,用来给自己的设备签名的私钥和用来给其他用户签名的私钥都是由您的恢复密码/密钥加密的,并存储在服务器上,以便在您丢失所有设备的情况下进行恢复。我们还允许在设备之间共享(八卦)签名密钥,但目前该实现也将它们加密存储在服务器上。“此限制将在将来修复,但目前如果您不信任您的服务器具有加密密钥,您可能希望暂缓使用交叉签名。

最后,在技术细节方面:在内部,您的恢复密码/密钥称为SSSS(Secure Secret Storage and Sharing,又名Quad-S)密钥-它加密任意秘密数据(例如签名密钥和备份密钥),然后将这些数据存储在服务器上的个人帐户数据中。如果您在帐户数据中查找m.ret_storage.default_key,则可以通过/DevTools斜杠命令在Riot Web/Desktop中查看它的运行情况,然后它加密的各种秘密位于m.Cross_signing.master、m.Cross_signing.self_sign、m.Cross_signing.user_sign和m.megolm_backup.v1。(它们分别处理如何整体保护您的交叉签名数据;如何对您自己的设备进行交叉签名;如何对其他用户进行交叉签名;以及如何加密您的邮件备份(如果您使用它们)。SSSS既支持将数据存储在帐户数据中(以便您可以在丢失所有设备的情况下恢复数据),也支持定义如何在设备之间安全地共享/八卦数据(如果您不想将其存储在服务器上的account_data中)。

交叉签名的另一个方面是,我们已经极大地改进了验证的工作方式,使您更容易信任您正在与之交谈的人。

第一个大变化是:我们现在支持扫描二维码进行验证!*如果你登录RiotX Android或Riot iOS,你现在可以通过扫描Riot Web(或任何其他Riot)上的二维码进行验证,你进入了💥:D我们甚至做了一些魔术,这样你刚刚扫描的设备也会回报并自动信任你。别担心,如果你不想扫描二维码,你仍然可以选择比较表情符号(如果你感到怀旧或受虐,甚至可以比较公共指纹)。

第二个重大变化是:验证现在使用DM!,而不是验证是短暂的东西,如果您错过它们,它们就会永远消失,我们现在会在它们出现时显示弹出窗口,并在Direct Message历史记录中与验证您的人一起跟踪它们。

第三个大变化是:验证现在发生在侧面板中!以前的验证是丑陋的模式弹出窗口,它会阻止您正在做的事情,直到您处理它们(特别恼人的是,因为您无法恢复它们)。现在您可以根据需要进出它们,同时执行多个操作,再也不会受制于邪恶的模式弹出窗口。

关于Riot Web、RiotX Android和Riot iOS上交叉签名和验证的完整过程,有一段来自Valère的精彩视频,它完整地展示了上周的Open Tech Will Save Us Meetup:

最后,既然验证用户通常是一次性的活动,我们强烈建议使用交叉签名方!

曾几何时,当面做这件事可能是一件非常愚蠢和有趣的事情(想象一下,一屋子人互相喊表情符号,疯狂地跑来跑去扫描彼此的二维码)-但在我们勇敢的新反乌托邦未来,我们能做的最好的事情就是在吉西身上做这件事。(显然,1:1验证效率更高,但集体验证更有趣--事实证明,你可以通过Jitsi成功验证至少3个重叠的表情符号!)戴夫(Riot Web的原著作者、交叉签名开发冠军)为后人录制了上周新矢量交叉签名派对编辑后的亮点……。:D。

希望从前面的章节中可以清楚地看出,Nad-Riot的首席设计师已经在改进UI和UX方面付出了巨大的努力。任何对我们一直在工作的全部设计资产感兴趣的人都可以在Figma上查看它们。

我们应该强调的主要改进之一是,我们现在终于有了一种一致的方式来表示加密房间和使用屏蔽的UI中的信任级别:

有了新的防护罩,我们不再在用户的对话中添加新设备时骚扰他们-相反,我们希望他们看到,如果添加了不可信的设备,房间的防护罩会到处闪烁红色。

挂锁现在被用来显示私密的房间(类似于其他消息应用程序),而不是加密的-尽管在我们这个新的E2EE默认世界中,实际上几乎所有的私密房间都应该加密。我们现在还将您的活动应用程序登录称为“会话”,而不是我们以前使用的相当隐晦的“设备”。

最后,即使对话中出现未经验证的会话,我们也不再喋喋不休并阻止消息-用户的盾牌变红是警告您可能正在发生坏事的提示。

阻止我们进行默认加密的所有私人对话的另一个主要原因是,不想突然破坏Matrix社区多年来想出的所有客户端、机器人和网桥。安全地实现E2EE是很困难的,而且认为每个随机的Matrix项目都必须自己弄清楚这一点是疯狂的。

因此,我们创建了Pantalaimon-这是一个为您完成所有E2EE繁重任务的小应用程序;让任何现有的Matrix客户端/机器人/网桥都可以参与加密的私人房间,而不必实际使用E2EE。潘(他是这么称呼他的朋友的)工作得非常好--例如,我们在生产中使用它在加密房间里使用Mjolnir。最初是由poljar使用他的Matrix-nio库用Python编写的,目前正在使用我们新的Matrix-rust-sdk库向Rust进行移植-提供了一个真正轻量级的守护进程来处理Matrix中最复杂的部分。我们的FOSDEM演讲为感兴趣的人提供了演示和更多信息。

值得一提的是,虽然Pantalaimon非常有用,但越来越多的客户端现在确实拥有原生E2EE支持--这是由越来越多的独立E2EE实现提供支持的。*目前的名单包括:

另一项艰巨的任务是支持在E2EE房间中进行搜索。从Riot Desktop 1.6开始,我们默认完全支持在E2EE房间中进行搜索-现在您甚至可以在右侧面板中列出E2EE房间中的所有文件。

这要归功于Seshat-Poljar的另一个项目,它提供E2EE房间的客户端全文搜索索引,安全地加密和存储索引,以便Riot Desktop可以实现搜索。Seshat是用Rust编写的,在未来,我们希望看到它也集成到Riot Mobile(和Pantalaimon)中-在桌面和移动之间八卦加密的搜索索引,这样无论你在什么平台上,你都可以快速搜索你的房间。

值得注意的是,这也是Riot Desktop第一次偏离Riot Web的功能-我们现在拥有了完整的构建基础设施,可以在Riot Desktop中为Linux、MacOS和Windows提供更丰富的本机功能(如Seshat)。关注这个空间,了解更多原生功能--例如,我们最终将能够实现即按即说!

默认情况下阻止E2EE的最后一件事是,我们需要追踪客户端最终没有解密收到的消息所需的密钥的剩余场景。这被证明是一个真正的痛苦,因为在某些情况下,您可能合法地无法解密(例如,发送者不知道您的存在,因为当他们发送消息时,他们的服务器还没有看到您在房间里-或者可能发送者已经将您列入黑名单-或者发送消息时您不在房间?)。相反,在客户端之间传输密钥时的任何错误都可能导致相同的症状(例如,如果客户端或服务器未能正确跟踪房间中的哪些设备,或者如果用户从备份中克隆了他们的设备,并且加密无法处理由此产生的分裂大脑)。在症状完全相同的情况下区分细菌和合法行为有点像噩梦。

最后,我们解决了这个问题,既找到了剩余的漏洞,又改善了用户体验,以便Riot告诉您“为什么”它无法解密给定的消息(例如,“您被列入黑名单”或“发送者不知道您在房间里”等)。这是一个巨大的改进,除非发生了一些奇怪的事情,否则很少会出现这样的错误。我们也得到了一些安慰,因为WhatsApp也有同样的问题,而且它们甚至没有去中心化!

虽然我们已经可以放心地在默认情况下打开加密,但我们还可以做大量的工作来进一步改进加密。快速浏览剩余的主要项目:

根据用户反馈,不可避免地需要对UI/UX进行更多的润色。感谢使用我们在过去两周发布的候选版本的每个人进行的令人惊叹的测试,我们相信我们抓住了剩下的精彩,但总会有更多的微调。有关更多详细信息,请参阅本文末尾仪表板中的“阶段4”。

目前,交叉签名要求您将加密的交叉签名密钥存储在服务器上,这意味着服务器上猜测您的恢复密码/密钥的攻击者可能会对恶意设备进行交叉签名,以监视您的帐户。一般来说,这很好,因为如果您丢失了所有设备,这是恢复帐户交叉签名状态的唯一方法。然而,如果您是超级偏执狂,您可能希望在设备之间共享(八卦)密钥,而不是将它们加密存储在服务器上。协议支持这一点--我们只是还没有把它连接起来。

现在有两个密码很麻烦-一个用于您的帐户,另一个用于您的加密状态。我们可以扩展您的加密密码,也可以解锁您的帐户--但这将意味着完全重写Riot的登录过程和密码重置逻辑(并迁移每个人的密码)。我们本可以在这个版本中做到这一点,但我们已经迟到了,所以我们决定推迟到未来。

目前,我们没有办法在不显式验证用户密钥的情况下将其标记为受信任。我们计划在“第一次使用时就信任”(豆腐)的地方隐含地信任用户,但这让用户界面变得更加复杂--虽然我们已经设计了它,但它被推到了未来的版本中。

你不能在Riot iOS上设置交叉签名;相反,你会被路由到Riot Web上进行排序。如果你唯一的设备是在iOS上,那就太可惜了--我们只需要把它移植过来就行了。

目前只有Riot Desktop支持通过Seshat进行加密搜索。我们需要在RiotX Android和Riot iOS中实现它,可能还需要在Riot Web上实现,然后在这些设备之间共享加密的搜索索引。

我们没有办法有选择地导出/导入房间的密钥,以便有意识地修复丢失历史的用户的历史。显然,这避开了E2EE,但有时拥有它确实是一件非常有用的事情。有第三方工具可以提供这一点,但是Riot有本机支持就太好了。

在协议层,没有什么可以阻止您通过签署受信任的用户来委派信任。例如,系统管理员可以为加入团队的每个新用户签名,然后他们会自动信任团队中的其他每个人。不过,我们还没有在“暴动”里接上这个。

最后但并非最不重要的一点是:自从Olm和Megolm从NCC集团获得最初的公开审计以来,已经有几年了。虽然核心加密棘轮从那时起没有显著变化,但所有这些密钥管理工作当然都是新的-一旦我们确信我们有一个值得验证的长期稳定版本,我们将对整个堆栈进行另一次审核。

虽然在过去的6个月里,默认的E2EE一直是我们的主要项目,当然也有很多其他的事情在发生--但是我们太专注于E2EE了,以至于我们忘记了正确地告诉任何人这件事。所以,迟到总比不到好,这里有一些亮点!

早在2015年,当我们第一次将视频会议添加到Matrix中时,我们的目的总是让人们连接到本地会议服务器,而不是我们在matrix.org上运行的默认会议服务器-但由此产生的额外复杂性意味着它的待办事项列表…不断减少。直到现在!

Riot Web现在支持直接实例化Jitsi视频/语音会议,通过Riot Web直接集成Jitsi,而不必使用自定义集成管理器。这意味着要将Riot部署配置为默认指向自定义JITSI,现在只有一个配置行:https://github.com/vector-im/riot-web/blob/develop/docs/jitsi.md有详细信息。您还可以在Matrix博客上看到设置此功能的完整教程。值得注意的是,到目前为止,只有Riot Web和Desktop有能力使用这一功能,但Riot iOS和RiotX Android应该很快就会跟进。(事实上,今天的iOS版本支持加入自托管的Jitsis,并将很快支持创建它们)。

我们从Mozilla那里反复听到的反馈之一是,Riot需要更好的键盘快捷键-既记录了我们已经拥有的快捷键,也引入了新的快捷键,比如“跳到上一个/下一个房间”和“跳到上一个/下一个未读的房间”。嗯,我们很高兴地说,由于t3chGuy的努力,终于有了这些快捷键!你可以通过点击Cmd/Ctrl+/或点击用户设置的帮助选项卡中的‘键盘快捷键’按钮来查看所有新的快捷键。看起来是这样的!

Riot Web多年来UI/UX中最糟糕的部分之一是房间目录-特别是如何查看其他服务器上的目录。再一次,我们很高兴地宣布,这个问题现在已经通过大幅改进的UI得到了修复-现在可以轻松地将新服务器添加到您的房间目录中,并查看由服务器上的网桥公开的房间目录。看起来是这样的!

希望每个人都注意到了新的邀请对话框--根据你最近与谁交谈提供建议,并简化了旧的设计,从而极大地改善了邀请人们参加对话的过程。我们在这里仍在解决一些美观和可访问性问题,但它是明确的。

..