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

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 进行数据传输。

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

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