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

Lớp truyền tải Android, cùng với toàn bộ kết nối giữa máy chủ, phần phụ trợ FCM và thiết bị khách, được bảo mật bằng Bảo mật tầng truyền tải (TLS). Điều này cung cấp mã hoá điểm-điểm mạnh mẽ cho tất cả dữ liệu trong khi truyền, 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 hầu hết các ứng dụng. Bạn có thể xem thêm thông tin chi tiết trong tài liệu về Kiến trúc FCM.

Một trong những hạn chế của phương thức mã hoá điểm-điểm là dữ liệu không được mã hoá trên toàn bộ đường truyền, nơi chỉ người gửi và người nhận mới có thể giải mã thông điệp. Đây là lý do FCM khuyên bạn nên sử dụng phương thức mã hoá hai đầu cho các hoạt động giao tiếp 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á hai đầu, 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.

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

Đối với các ứ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 xác thực 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). Quá 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. Tính năng này hoạt động với các thông báo dữ liệu FCM, vì tải trọng thông báo tiêu chuẩn do 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 sẵn cho tính năng 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

Dưới đây là cách tải trọng FCM data thay đổi khi sử dụng E2EE.

Trước khi mã hoá (Nội dung 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á (Nội dung mã hoá hai đầu):

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

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

Cách khác: Tìm nạp nội dung ngay từ máy chủ của bạn

Nếu phương thức 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 tin nhắn 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 trong quá trình 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 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 sang chạy trong nền. Quá trình 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 thiết bị của người dùng.

Do đó, hãy cân nhắc các phương án thay thế cho trải nghiệm người dùng trong những trường hợp mà quá trình 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", sau đó cập nhật thông báo đó sau khi truy xuất được toàn bộ nội dung.