会议协议:技术实施细节

2021-01-09 14:26:14

注意:此博客是高度专业的文章,其中包含有关新会话协议的详细信息。有关发生什么情况以及原因的技术概述,请查看我们的会话协议概述。

自从Session的第一个版本发布以来,我们一直使用Signal协议为所有一对一的聊天提供端到端加密(E2EE),并使用发件人密钥系统在封闭的组中进行加密。总而言之,Signal协议和Sender Keys系统为每个对话提供了某些加密属性,特别是完全前向保密性(PFS),可否认性和(在使用Signal协议的情况下)自我修复。在某些理论情况下,这些属性确实可以保护用户。但是,在实际情况下,这些保护的实用性在范围上往往比预期的要受限制。我们还必须考虑提供这些保护措施的代价是增加了复杂性,降低了帐户的可移植性以及多设备限制。这些协议根本不是设计为在分散的网络上运行。

为了授权未来的开发工作,从而确保Session在2021年期间能够吸引尽可能多的用户,我们有必要使用更加简化的,专门构建的协议。这将使我们能够专注于提高可靠性,实现诸如多设备的可伸缩版本,从备份中更好地还原以及大规模简化代码库等功能。新的会话协议在保持E2EE的同时完成了所有这些工作,并且与信号协议相比,几乎没有任何实际好处。

我们将首先研究Signal协议提供的属性,以及这些属性如何在理论上和现实世界中发挥作用来保护用户。

PFS是信号协议提供的一项功能,可在暴露长期密钥信息时保护以前的对话或消息不被读取。这是通过密钥棘轮实现的-定期派生用于消息加密的新的共享临时密钥。每次派生新密钥时,都会定期从设备中删除这些密钥,这意味着即使您的长期私钥遭到破坏,这些消息也将无法解密。

当设备的长期密钥遭到破坏时,PFS专门提供保护。假设应用程序正确地管理密钥对,则应该通过完全设备访问来实现。正是这一细节限制了适用PFS的情况。如果攻击者具有完全的设备访问权限,则可以直接从Signal / Session数据库中提取解密的消息。

如果用户使用消失的消息,或者在攻击者在网络级别拦截其消息时手动删除消息,则PFS会很有效。在这种情况下,攻击者无法通过破坏设备的长期密钥来解密在网络级别收集的消息。但是,消失消息的使用率很低,并且具有完全网络和设备访问权限的老练攻击者可能会执行更容易且更具破坏性的攻击,例如访问当前的联系信息,阅读将来的消息并破坏设备信息,而这两种信号协议都不会话协议目前也无法防范。

可否认性(也称为可拒绝身份验证)允许对话双方在对话期间对他们收到的消息的来源进行身份验证,但阻止任何一方向对话后的第三方证明消息的来源。在信号协议中,通过逐个会话共享加密密钥的派生提供了此属性,该密钥用于加密和身份验证。消息未使用长期可识别密钥签名。

信号协议中的可否认性是一种加密属性,可以防止提供加密证明,即某人使用特定密钥对消息进行了签名。实际上,在涉及法院案件或媒体报道时,通常不考虑密码可否认性。例如,在涉及切尔西·曼宁(Chelsea Manning)和阿德里安·拉莫(Adrian Lamo)来文的法院案件中,密码可否认性未能成功用作辩护。取而代之的是,法院通常依靠不诚实的聊天伙伴或扣押设备的对话屏幕截图来确定聊天参与者的真实身份。

此外,如果在敏感对话期间破坏了聊天伙伴或设备,则拒绝性不能提供保护。在这种情况下,受损的参与者或设备可以证明会话后哪个设备或聊天伙伴发送了哪些消息。

自我修复是Signal协议的一项属性,可确保如果泄漏了棘轮密钥,则无法从中衍生出将来的消息密钥,因此,将来的消息也不会受到损害。此属性由正在进行的Diffie-Hellman密钥交换提供,该交换重置了发送和接收棘轮。没有这些秘密,棘轮钥匙的暴露只会使攻击者读取与当前棘轮相关的消息。

如果密钥由应用程序正确管理,则攻击者获得完全的设备访问权限是损害会话密钥的唯一方法。如果攻击者可以访问设备,则他们可以从数据库中读取以前的纯文本消息。如果获得了对设备的完全访问权限,他们还可以使用设备的长期密钥来请求会话重置,这将导致攻击者将来破坏所有将来的消息。

Session使用Signal协议的Sender Keys组件的修改版本,该协议是由Signal开发的,但当前未在Signal应用程序中使用(Sender Keys当前最突出的部署是在WhatsApp中)。发件人密钥为所有封闭的群组对话提供PFS和可否认性,但不提供自我修复功能。这些保护主要是通过使用现有的1-1聊天机制在共享组密钥上达成一致,然后为每个参与者建立一个发件人密钥来提供的,该发送者密钥在发送每条消息后会棘手。

作为信号协议的派生功能,发件人密钥系统具有许多相同的属性,因此具有相同的实际缺点。如果攻击者破坏了聊天中的任何设备,并且参与者没有打开消失的消息,则攻击者可以直接从数据库中直接读取所有消息。如果攻击者破坏了聊天中任何设备的长期密钥,则可以读取所有将来的消息。通过使用每台设备的长期密钥强制不签名消息,可以提供可否认性。但是,就像在媒体或法院系统中用作1-1消息的加密可否定性时一样,在这种情况下,群组聊天的加密可否定性在现实世界中实际上是不切实际的。

会话协议将分两个阶段推出。第一个阶段是AEDT于12月11日星期五发布到移动应用商店和桌面客户端的,它是会话协议的修改版,该会话协议与仍依赖于Signal协议的旧版Session客户端保持向后兼容性。协议的此版本在下面详细介绍为“具有向后兼容性的会话协议”。第二阶段将在稍后发布,它将取消向后兼容层,从而完全实现我们对简化的E2E加密协议的愿景。协议的此版本在下面详细介绍为“会话协议(完整实现)”。

创建帐户时,会为每个会话帐户生成一个长期的X25519密钥对,该密钥对的公共部分是帐户的“会话ID”。

考虑一种情况,爱丽丝想将消息M发送给会话ID为IPK_2的鲍勃。为此,爱丽丝首先使用其私钥(身份)密钥IPK_1签署消息M:

然后,Alice生成一个临时密钥对((ESK,EPK)),其中ESK和EPK分别是私有和公共组件。然后,她在(ESK,IPK_2)上执行椭圆曲线Diffie Hellman(ECDH)生成共享密钥,然后使用密钥派生函数HKDF来导出共享密钥“ SK”。爱丽丝现在可以使用对称密码(AES-GCM)使用“ SK”加密“(S || M)”来获得密文“ C”。

密文与临时密钥对“ EPK”的公共部分一起发送给Bob。

鲍勃在((ISK_2,EPK))上执行ECDH,重复执行与爱丽丝相同的步骤以获取密钥“ SK”。现在,鲍勃可以使用“ SK”来解密密文“ C”并获得“ S ||”。 M`。鲍勃可以使用爱丽丝的身份密钥检查签名的有效性,如果签名无效,则忽略消息“ M”。如果签名有效,则将其删除,并将消息存储在设备的本地数据库中。

在此方案下,消息(M)包括正在发送的消息,发送者的ED25519公钥和接收者的X25519公钥。然后使用libsodium中的crypto_sign()函数用发送者的ED25519私钥对该消息进行签名,以生成S。然后,使用libsodium的crypto_box_sealed()函数对明文消息和签名进行加密,同时使用发送者的ED25519公钥和收件人的X25519公开然后,将X和消息标记(接收者的公共X25519密钥)一起发送给接收者,以确保可以从群中识别和请求消息。

当用户想要建立一个封闭的组时,他们将生成一个共享的长期对称密钥“ SK”,并通过成对通道与其他成员共享,这与“发件人密钥”协议中的情况相同。但是,与发件人密钥系统不同,用户不会建立单独的发件人密钥。取而代之的是,将使用对称密码直接使用“ SK”对消息进行加密,并使用用户的身份密钥对消息进行签名。群组的新进入者将收到当前的“ SK”通知,以便他们开始发送和接收消息。当用户离开或被踢出时,该组将建立一个新的共享组密钥“ SK”。

作为该方案的概述,首先,组的创建者将为该组导出一个共享的ED25519公共密钥对。该密钥将通过1-1聊天网络共享给所有组成员。成员拥有此密钥对后,他们就可以识别出发往该组的新消息并为该组加密新消息。

消息(M)包括正在发送的消息,发件人的ED25519公钥和组的共享X25519公钥。该消息使用libsodium中的crypto_sign()函数与发送者的ED25519私钥进行签名以产生S。然后,使用libsodium的crypto_box_sealed()函数对发送者的ED25519公共密钥和X25519组公共密钥进行加密,以加密明文消息和签名。产生X。然后将X与消息标记(该组的X25519公钥)一起发送到组的已定义群,以确保可以从群中识别和请求消息。

使用现有的长期密钥对代替Signal协议可大大简化1-1消息传递。不再需要复杂的密钥交换过程和共享预密钥束(在分散的环境中特别难以管理的过程)。此新协议还使会话无法同步或无法为不存在的会话加密消息,这都是会话用户在当前协议下经常遇到的非常常见的错误。

对于封闭的组,删除单个发件人密钥就无需为每个用户逐步地分配棘轮密钥,这也可能导致不存在的会话对邮件进行加密。

根据会话协议,只需将用户的长期密钥对共享到新设备,然后将发送的消息复制回自己的集群,即可重新实现多设备。与我们以前使用的多设备方法相比,它的复杂性和复杂性要低得多,后者要求会话可以在不依赖集中式服务器的情况下,可以在线或离线的多个设备之间保持不断同步。

删除仅存储在本地设备上的临时密钥将大大提高会话帐户的可移植性。这意味着在还原会话ID时,您将能够立即接收新消息。在先前的实现方式(即Signal协议)下,新消息将针对不存在的会话进行加密,直到恢复其帐户的用户执行了会话重置。

Signal协议维护Android,iOS和桌面客户端之间Signal协议的三个复杂而又独立的实现。 Session协议的简单性使得加密和解密流水线可以用不到一页代码的代码(可在所有平台上有效标准化的代码)来实现。这显着降低了进行将来更改的难度,并且还使该协议从安全角度更易于理解和分析。

切换到会话协议意味着会话将不再具有1-1聊天中的可拒绝性和PFS或封闭组中的PFS。但是,如前所述,这些属性在实际情况下仅提供有限的保护。为了证明这一点,探讨会话协议要比信号协议和旧的封闭组发件人密钥系统弱的情况很有用。

如果攻击者具有完全的设备访问权限,则会话协议和信号协议都无法通过直接从设备中提取明文消息历史记录来阻止攻击者读取会话中的所有先前消息。如果攻击者具有完全的设备访问权限,并且用户打开了消失的消息,则会话协议和信号协议都将阻止攻击者读取任何以前的消息。

如果攻击者具有完全的设备访问权限和目标网络抓取功能,并且用户打开了消失的消息,则信号协议可以保护用户以前的消息不被读取,而会话协议则不能。封闭团体的情况与此类似。 Session有多种方法可以通过限制攻击者可以抓取的数据来限制此攻击的范围,这将在后面讨论。

使用会话协议发送的所有消息均使用发送者的长期密钥签名,因此可以向第三方提供加密证明,以证明特定密钥对确实对消息进行了签名。

但是,由于签名在验证后会立即被删除,因此这限制了会话协议与实际场景中信号协议的实际好处之间的差异。实际上,攻击者或接收者将需要破坏设备的长期密钥对,并能够在删除签名之前将消息从网络或设备上刮下来,以使这种区别具有任何有意义的安全隐患,并且就像上面讨论的抓取攻击一样,可以针对此类抓取部署保护措施。

会话协议没有会话密钥,因此不会保留信号协议的自愈特性。如果长期密钥在任一协议中都受到破坏,则攻击者可以通过请求重置会话来破坏将来的消息。

由于会话中的所有消息都被洋葱路由到它们的目标群,因此在洋葱路由路径中的ISP或服务节点在传输过程中,由于洋葱路由提供了额外的加密层,因此无法将它们剪贴。但是,可以通过收件人群集中的任何节点(群集通常由5-7个Service节点组成)或向收件人群集中的节点发出请求的另一个实体,从群集中抓取邮件。

目前,邮件检索请求未经身份验证,这意味着任何用户都可以请求其他任何用户的(加密)邮件。为了限制抓取,我们将需要请求者的长期密钥签名。该签名将由服务节点进行验证,该服务节点可确保未经授权的各方无法从集群中抓取数据,而不能从属于已存储消息的长期密钥中生成签名。这并不能防止在所有可能的情况下报废;具有足够资源和积极性的攻击者可以运行服务节点并直接从其自己的数据库中提取消息。但是,由于运行服务节点所需的抵押要求(〜15,000美元),这将是非常昂贵的。此外,由于服务节点无法选择其集群,因此以实际不可能为目标,针对特定用户将极为困难。

如前所述,密码可否认性通常是法院系统和媒体普遍忽略的事情。如果可以在屏幕快照周围提供上下文信息,则无论是否存在密码可否认性,这通常足以导致定罪或人身伤害。

Session无需设计加密保护,而是可以在本地编辑其他用户的消息,从而提供了一种完全建立对话的方式。由于签名是在收到消息后删除的,因此无法证明对话的屏幕截图是真实的还是已编辑的,从而降低了屏幕截图作为证据的价值。

会话的某些其他方面进一步限制了使用信号协议的需求。

与在Signal中将帐户绑定到其电话号码并倾向于长期建立和维护帐户不同,Session是基于短暂身份的概念构建的。可以按会话,每周,每月或用户喜欢的频率创建和放弃会话ID。如果您要销毁帐户并创建一个新帐户,则可以随时执行此操作,并且该帐户与您的真实世界身份之间绝对没有加密链接。这限制了密钥泄露或消息被刮取的可能性。

会话使用洋葱路由进行邮件的发送和接收可以提高网络级别的可识别性,因为没有中央服务器可以记录何时检索或发送邮件,或者哪个IP地址正在发送或接收这些邮件。在Signal中不是这种情况; Signal的中央服务器有一个日志,其中记录了哪个IP地址发送哪个消息以及哪个IP地址检索该消息。

会话协议大大降低了应用程序的复杂性,使会话更易于管理,并提高了帐户的可移植性,同时还提高了可靠性,并使诸如多设备,帐户还原和其他即将到来的改进等要求较高的功能大大易于实现。 在实际情况下,会话协议和信号协议提供的实际保护是相似的。 此外,添加到会话应用程序中的功能(例如,经过身份验证的服务节点请求和收件人端消息编辑)使这两个协议的实际好处几乎彼此吻合-同时极大地提高了消息的发送和接收效率,并实现了 开发令人兴奋的新功能。