Bảo mật dữ liệu tin nhắn bằng phương thức mã hoá hai đầu

Tầng truyền tải Android, cùng với toàn bộ kết nối giữa máy chủ, các dịch vụ phụ trợ FCM và thiết bị của người dùng, đều được bảo mật bằng giao thức Bảo mật tầng truyền tải (TLS). Điều này cung cấp phương thức mã hoá đầu cuối mạnh mẽ cho tất cả dữ liệu trong quá trình truyền tải, giúp bảo vệ dữ liệu khỏi bị chặn trên mạng. Mô hình bảo mật mạnh mẽ này phù hợp với phần lớn các ứng dụng. Bạn có thể tìm thêm thông tin chi tiết trong tài liệu về Cấu trúc FCM.

Một trong những hạn chế của phương thức mã hoá điểm đến điểm là phương thức này không được mã hoá cho toàn bộ đường dẫn, trong đó chỉ người gửi và người nhận mới có thể giải mã thông báo. Đây là lý do khiến FCM đề xuất sử dụng phương thức mã hoá hai đầu cho các thông tin liên lạc nhạy cảm về quyền riêng tư, chẳng hạn như tin nhắn trò chuyện hoặc giao dịch xác thực. Để tận dụng tối đa tính năng mã hoá đầu cuối, bạn phải triển khai tính năng này ở cấp độ cao hơn, chẳng hạn như trong máy chủ và mã ứng dụng của bạn.

Thêm tính năng mã hoá hai đầu cho dữ liệu nhạy cảm

Đối với những ứng dụng xử lý dữ liệu đặc biệt nhạy cảm, chẳng hạn như tin nhắn riêng tư hoặc thông tin đăng nhập cá nhân, bạn có thể thêm một lớp bảo vệ bổ sung bằng phương thức mã hoá hai đầu (E2EE). Quy trình này bao gồm việc mã hoá tải trọng thông báo trên máy chủ của bạn trước khi gửi đến FCM và giải mã tải trọng đó trong ứng dụng trên thiết bị của người dùng. Điều này hoạt động với thông báo dữ liệu FCM, vì tải trọng thông báo tiêu chuẩn được hệ điều hành xử lý và ứng dụng của bạn không thể giải mã trước khi hiển thị.

Xin lưu ý rằng FCM không cung cấp giải pháp tích hợp cho phương thức mã hoá hai đầu. Bạn chịu trách nhiệm triển khai lớp bảo mật này trong ứng dụng của mình. Có các thư viện và giao thức bên ngoài được thiết kế cho mục đích này, chẳng hạn như Capillary hoặc DTLS.

Ví dụ về khái niệm

Sau đây là cách tải trọng FCM data thay đổi khi sử dụng tính năng mã hoá hai đầu.

Trước khi mã hoá (Tải trọng tiêu chuẩn):

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

Sau khi mã hoá (Tải trọng E2EE):

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

Nếu bạn đã triển khai tính năng mã hoá hai đầu một cách chính xác, thì ứng dụng khách là bên duy nhất có khả năng giải mã tải trọng đã mã hoá để hiển thị thông báo ban đầu.

Cách thay thế: Tìm nạp nội dung trực tiếp từ máy chủ của bạn

Nếu tính năng mã hoá hai đầu không phù hợp với ứng dụng của bạn, thì bạn có thể gửi thông báo dữ liệu trống. Những thông báo này đóng vai trò là tín hiệu để ứng dụng tìm nạp nội dung trực tiếp từ máy chủ của bạn. Điều này có nghĩa là dữ liệu nhạy cảm chỉ được truyền giữa ứng dụng và máy chủ của bạn, bỏ qua FCM để truyền dữ liệu.

Nhược điểm của phương thức này là có thể xảy ra độ trễ do ứng dụng kết nối với máy chủ của bạn để truy xuất dữ liệu. Khi nhận được một thông báo dữ liệu, ứng dụng thường chỉ có vài giây để hiển thị thông báo trước khi chuyển xuống nền. Việc tìm nạp dữ liệu từ máy chủ của bạn có thể không hoàn tất trong khoảng thời gian này. Việc tìm nạp dữ liệu này có thành công hay không phụ thuộc vào các yếu tố như khả năng kết nối của thiết bị người dùng.

Do đó, hãy cân nhắc các lựa chọn thay thế về trải nghiệm người dùng trong trường hợp việc tìm nạp dữ liệu có thể mất quá nhiều thời gian. Ví dụ: bạn có thể hiển thị một thông báo chung chung như "Bạn có tin nhắn mới" rồi cập nhật thông báo đó sau khi truy xuất toàn bộ nội dung.