使用端到端加密保护您的消息数据

Android 传输层以及服务器、FCM 后端和客户端设备之间的整个连接均使用传输层安全协议 (TLS) 进行保护。这可为所有传输中的数据提供强大的点到点加密,防止数据在网络上被拦截。这种强大的安全模型适用于绝大多数应用。 如需了解详情,请参阅 FCM 架构文档。

点对点加密的局限性之一是,它不会在整个路径中进行加密,只有发送方和接收方可以解码消息。因此,FCM建议对聊天消息或身份验证交易等涉及隐私的通信使用端到端加密。为了充分利用端到端加密,必须在更高级别(例如在服务器和应用代码中)实现端到端加密。

为敏感数据添加端到端加密

对于处理特别敏感数据(例如私信或个人凭据)的应用,您可以使用端到端加密 (E2EE) 添加额外的保护层。此过程包括在服务器上加密消息载荷,然后再将其发送到 FCM,并在用户设备上的应用内解密。这适用于 FCM 数据消息,因为标准通知载荷由操作系统处理,并且在显示之前无法由您的应用解密。

请注意,FCM 不提供端到端加密的内置解决方案。您负责在应用内实现此安全层。为此,我们设计了外部库和协议,例如 CapillaryDTLS

概念性示例

以下是使用 E2EE 时 FCM data 载荷的变化情况。

加密前(标准载荷):

    {
      "token": "DEVICE_REGISTRATION_TOKEN",
      "data": {
        "sender": "user123",
        "message_body": "Your 2FA code is 555-123",
        "timestamp": "1661299200"
      }
    }

加密后(E2EE 载荷):

  {
    "token": "DEVICE_REGISTRATION_TOKEN",
    "data": {
      "encrypted_payload": "aG9va2Vk...so much encrypted gibberish...ZW5jcnlwdA=="
    }
  }

如果您已正确实现端到端加密,则客户端应用是唯一能够解密加密载荷以显示原始消息的一方。

替代方案:直接从您的服务器提取内容

如果端到端加密不适合您的应用,您可以改为发送空数据消息。这些消息会充当信号,指示应用直接从您的服务器提取内容。这意味着,敏感数据仅在您的应用和服务器之间传输,而不会通过 FCM 进行数据传输。

此方法的缺点是,应用连接到服务器以检索数据可能会导致延迟。当应用收到数据消息时,通常只有几秒钟的时间来显示通知,然后就会转到后台。从服务器提取数据可能无法在此窗口内完成。此数据提取的成功与否取决于用户设备连接性等因素。

因此,请考虑在数据提取可能需要很长时间的情况下,提供替代的用户体验。例如,您可以先显示一条“您有新消息”之类的通用通知,然后在检索到完整内容后更新该通知。