WhatsApp 如何在推送通知中发送端到端加密消息?

信息安全 加密 AES whatsapp
2021-08-13 07:39:42

WhatsApp在其最新更新中实施了端到端加密(白皮书)。

WhatsApp 如何将带有消息内容的推送通知发送到 Apple 推送通知服务?

一种可能的解决方案是从应用程序内部将未加密的消息发送到 APN,但这很容易被滥用,并且会破坏端到端加密的目的。

更新:
根据 Apple 的文档,我刚刚对其进行了更多测试:

但是,如果用户强制退出,系统不会自动启动您的应用程序。在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会再次尝试自动启动您的应用程序。

我对其进行了测试,结果我仍然收到纯文本推送通知。这会让我相信该应用程序没有在后台运行以解密收到的任何通知然后重新发布它们。

2017 年 5 月更新:

我现在已经使用 VoIP API(如下面的答案中所述)在演示应用程序中自己有效地实现了相同的结果。效果很好。

2017 年 7 月更新:

Apple 不再允许将 API 用于非 VOIP 应用程序的推送通知。但是,他们确实允许 WhatsApp 以无限公平的方式进行操作。

2018 年 9 月更新:

现在可以使用通知应用程序扩展来解密推送通知。但是,不鼓励在此类扩展中使用动态库,因此您必须拥有可以静态编译以进行解密等的代码库。

2个回答

WhatsApp 可以使用 VOIP 后台模式和 PushKit 来解决这个问题。

VoIP 推送是:

  • 直接发送到应用程序。
  • 被认为是高优先级的通知,并且会立即发送。
  • 即使应用程序被用户强制退出。

有关详细信息,请参阅IP 语音 (VoIP) 最佳实践

一旦 VOIP 推送的加密有效负载被解密,它们就会显示带有解密消息的“本地通知”。

不过有一个小问题,PushKit 仅适用于 iOS 8 及更高版本。那么,Whatsapp 是如何为早期版本的 iOS 做的呢?好吧,它不是。他们不允许您在 iOS 8 之前的版本的通知中查看消息预览(在 iOS 7 上验证,请参见屏幕截图)

iOS 7 中的 Whatsapp 设置

您所称的(您在通知中心看到的)与(通过 APN 发送的 Push Notifications)并不完全相同。Remote Notifications

在 Android 上,两者完全不同。第一个称为Notification,第二个称为MessageDownstream Message

但是在 iOS 上,应用程序可以生成将显示在您的通知中心的本地通知。这些不需要由任何远程通知触发,这取决于应用程序中的逻辑来执行它,并且 iOS 应用程序确实有可能执行可以生成这些通知的后台任务和同步。
从 iOS7 开始,iOS 应用程序还可以在后台无限时间执行 HTTP 操作(因为应用程序将网络传输委托给系统,这将在传输完成后唤醒应用程序有限的时间)。

另一方面,远程通知最初被设计为直接向用户发送 APN 推送。但苹果意识到开发人员需要将推送通知发送到他们的应用程序而不是通知中心,并在远程通知中添加了一个静默标志,以便服务器可以发送通知以唤醒应用程序而不会打扰用户。然后应用程序将执行一些同步和逻辑并决定自己是否创建本地通知(将显示在通知中心)。
此外,直到最近,Remote Notifications 的有效负载一直受到 256 字节的限制,这迫使许多开发人员将这些通知用作推送同步 消息而不是作为数据通道。

如果你理解我,那么你就会明白 Whatsapp 不需要使用 APNs 在远程通知中发送消息有效负载。