信号协议实现:公钥认证和可检查性?(Allo、WhatsApp、FB messenger、Signal)

信息安全 加密 密码学 隐私 公钥基础设施 攻击
2021-08-25 04:38:32

由 Google Allo、WhatsApp、Facebook Messenger 和 Signal 等使用的Signal 协议的一个关键部分是公钥基础设施。设置会话需要公钥。据我所知,它没有指定验证密钥的方法。即,当 Alice 与 Bob 建立会话时,她如何确定自己收到的是他的公钥而不是其他人的?

其次,假设上述问题有一个令人满意的答案,我们可以检查电线上发生了什么吗?即,Alice(可以访问她的私钥)可以检查网络上的协议,提取 Bob 的公钥并手动验证它(指纹,打电话给 Bob 并让他比较)吗?

我猜这可能因实现而异。首先,我在WhatsApp 加密概述白皮书中没有看到答案那么这是如何实现的呢?

在更广泛的背景下,真正的问题当然是:我们需要在多大程度上信任实现,即服务提供者?老实说,我很奇怪这些服务是端到端加密的。在我看来(不是协议专家!)服务提供商很容易窃听,如果他们愿意的话。他们可能不想或不打算这样做,但对于谁来说隐私足够重要,它仍然是一种责任。

3个回答

当 Alice 与 Bob 建立会话时,她如何确定自己收到的是他的公钥而不是其他人的?

她目前做不到。(一个更好的问题是:Alice 如何确定客户端使用 Bob 的公钥来建立会话,而不是恶意用户?)WhatsApp 安全白皮书说:

对于身份验证,用户可以通过外部通道手动比较公钥指纹。

这有两个问题:

  • Alice 不得不依赖客户端生成公钥指纹/二维码。您可能会看到依赖客户端来验证客户端是否使用正确的密钥的问题。
  • 这给我们带来了第二个问题:即使 Alice 可以在不使用客户端的情况下指纹客户端为 Bob 存储的公钥,那么她如何确定客户端在与 Bob 通信时使用这个密钥,而不是例如使用一些恶意用户的公钥?这里需要验证线路上的协议。客户端是封闭源代码也不会让事情变得更容易。

我们可以检查电线上发生了什么吗?

据我所知不是。在与此问题相关的Reddit 线程中,一位评论者指出,关于信号协议的更好文档将很快发布希望这会有所帮助。但我们真正需要的是关于验证流量的详细说明。

我们需要在多大程度上信任实现,即服务提供者?

首先,据我所知,Signal 协议基本上包括加密协议设置安全 e2e 通道所需的所有内容。如果密钥交换变得安全,我们就拥有了 e2e 通信所需的所有要素。

但是对于当前的实现,我们还没有实现。

因此,作为对这个问题的回答,我想说我们应该假设我们聊天消息的保密性完全取决于服务提供商的善意。

现在,我们需要信任仅在二进制平台上运行的实现,并且没有真正的方法来确保在这些“二进制交付”系统中正确处理所有加密、证书和随机性。我的信念是,在 iOS 或 Android 等平台上创建的任何东西都不能被信任,并且所有端到端加密都是无用的,因为端点安全性在很长一段时间内都失败了。由于这些操作系统内部的“已知未知数”。

我一直在为我们创建用于您的苹果或安卓的外部加密设备的项目做出贡献。我们从 100% 源代码树编译 Linux 内核 4.8、库和 e2e 加密(使用用户处理的 PKI),并用正确且可审计的实现替换信任​​。我相信这是解决这个问题的唯一方法。

所以在它到达电话和网络之前运行你的加密,完全不受信任的域。

这个问题已经沉寂了很长一段时间——但在此期间,Signal 提出了“安全号码”的概念。安全号码是对话的唯一指纹,基于对话参与者的基础公钥。双方参与者都可以在他们的设备上看到对话的安全号码,并通过一些带外方法(例如电话)相互验证他们的安全号码是否匹配,如下图所示https : //signal.org/blog/safety-number-updates/

安全号码

可以看出,安全编号可以通过数字或二维码进行比较。如果安全数字匹配,则可以确保不会发生 MITM 攻击。

有关详细信息,请参阅: