这篇文章上次修改于 205 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

加密

端到端加密:可以避免服务器查看用户之间的通信消息。

前向安全/前向保密:即使密钥在某个时候泄露,攻击者也不能用该私钥解密之前的消息。

后向安全/后向保密:即使密钥在某个时候泄露,攻击者也不能据此算出未来的 message key 以解密未来的消息。

Signal 可以实现后向安全,而 TLS 不能。

TLS 协议常用于存在“中间人”服务器的安全系统,保护中央服务器和用户之间的通信,但允许服务器查看所有消息。在实践中,可能用户和服务器之间的通信链路上可能存在许多网络节点,一些网络节点可能会结束 TLS 协议连接,然后重新以明文的方式将流量转发出去。

TLS 和 Signal 都可以实现前向安全。TLS 的前向安全是会话级别的(每次会话的密钥不同),Signal 协议的前向安全消息级别的(每个消息的密钥不同)。

对于 TLS,只要不结束会话,或删除临时密钥,临时密钥就不变。Signal 是社交软件,每个会话的有效时间可能长达数年,这与 TLS 会话有很大的不同。我们通常认为 TLS 会话是短期的,而 Signal 的会话是长期的,所以 Signal 引入消息级别的前向安全性。

TLS 实现前向保密的过程是交互式的,双方都必须在线生成临时的 DH 密钥对。Signal 协议使用非交互式密钥交换技术(一方离线状态的密钥交换协议)仍能保证前向安全。

认证

TLS 握手的最后一个阶段是认证(TLS 1.3 可同时进行协商和密钥交换,客户端可推测性地选择一个密钥交换算法。密钥交换放在最前面,原因可能是后面的消息都可以加密传输了):

41.png

在密钥交换过程中,攻击者可以轻而易举地拦截密钥交换过程的消息并伪装成密钥交换的一方或双方。为此,需要通过密码学算法验证服务器身份的真实性。

在 Web 系统上,TLS 协议中的认证通常是单向的。例如,只有浏览器才能验证 google.com 是否是 google.com,但 google.com 不会验证浏览器的身份。浏览器连接到 google.com 时,通过 Web 公钥基础设施(PKI)来验证是否与真实的 google.com 进行握手。对客户端的认证通常委托给 Web 的应用程序层来完成,最常见的方式是通过发送一个表单要求提交客户端的身份凭证。

Web PKI 包含两部分内容:1)浏览器必须信任一组证书认证机构(Certification Authority,CA)的根公钥。通常,浏览器会使用一组硬编码的公钥或由操作系统提供的可信公钥。2)想使用 https 的网站必须从上述可信的 CA 中获取证书,证书包含了公钥等以及 CA 对该证书的签名。

在正式握手结束时,连接的双方都必须在认证阶段发送一条 Finished 消息。Finished 消息中包含 HMAC 算法生成的认证标签。如果有中间人截获或篡改握手阶段的消息,双方都可以检测到攻击者并及时中止连接。

Signal 采用首次信任(Trust On First Use,TOFU)方法,允许用户在第一次通信时盲目地信任其它用户的公钥,并在未来拒绝任何更改。这样,敌手只能攻击用户之间的第一次连接,因此只有当时恰好处于活跃状态的中间人攻击者才能实施。用户可以在未来的任何时候通过带外匹配通信双方的会话秘密,自由检查第一次与他们进行信息交换的是否为中间人敌手。

参考

戴维-王. 深入浅出密码学[M]