Thêm API Tính toàn vẹn của Play

API Tính toàn vẹn của Play cho máy tính giúp bạn kiểm tra để đảm bảo các lượt tương tác và yêu cầu gửi tới máy chủ đến từ một thiết bị máy tính chính hãng. Bằng cách phát hiện các lượt tương tác tiềm ẩn rủi ro và gian lận, máy chủ phụ trợ của ứng dụng có thể phản hồi bằng những hành động thích hợp để ngăn chặn các cuộc tấn công và giảm thiểu hành vi sử dụng sai mục đích.

API này trả về các kết quả giúp bạn phát hiện các mối đe doạ tiềm ẩn, bao gồm:

  • Thiết bị và môi trường có rủi ro: Kết quả deviceIntegrity giúp bạn xác định xem ứng dụng của bạn có đang chạy trên một thiết bị máy tính chính hãng hay một phiên bản chính hãng của Google Play Games dành cho máy tính hay không.

Tích hợp với API

Để tích hợp API Tính toàn vẹn của Play cho máy tính vào ứng dụng, trước tiên bạn cần thiết lập ban đầu trong Google Cloud Console. Sau đó, bạn cần làm theo các bước sau cho mỗi lần kiểm tra tính toàn vẹn:

  1. Chuẩn bị mã thông báo về tính toàn vẹn
  2. Yêu cầu mã thông báo về tính toàn vẹn
  3. Yêu cầu dữ liệu mã thông báo

Thiết lập ban đầu trong Google Cloud Console

Mọi ứng dụng hoặc SDK gọi API Tính toàn vẹn của Play đều cần dùng một dự án Google Cloud để xác thực các lệnh gọi và giám sát mức sử dụng API. Nếu muốn tạo một dự án Google Cloud mới hoặc trong trường hợp ứng dụng của bạn được phân phối độc quyền bên ngoài Google Play, thì bạn có thể bật tính năng phản hồi cho API Tính toàn vẹn của Play từ Google Cloud Console.

Trong Google Cloud Console, hãy tạo một dự án Google Cloud mới hoặc chọn một dự án Google Cloud hiện có mà bạn muốn sử dụng cùng với API Tính toàn vẹn của Play cho máy tính. Chuyển đến phần API và dịch vụ. Chọn bật API và dịch vụ. Tìm kiếm API Tính toàn vẹn của Play rồi bật API đó. Lúc này, bạn có thể tích hợp API Tính toàn vẹn của Play vào ứng dụng.

Bước 1: Chuẩn bị mã thông báo về tính toàn vẹn

void PrepareIntegrityToken(
  const PrepareIntegrityTokenParams & params,
  PrepareIntegrityTokenContinuation continuation
)

Trước khi yêu cầu mã thông báo về tính toàn vẹn (xem RequestIntegrityToken), bạn phải chuẩn bị (hoặc "khởi động") API Tính toàn vẹn của Play. Điều này cho phép Google Play lưu một phần thông tin chứng thực trên thiết bị vào bộ nhớ đệm một cách thông minh để giảm độ trễ trên đường dẫn quan trọng khi bạn yêu cầu kết quả về tính toàn vẹn.

Khi thành công, lệnh tiếp tục sẽ được gọi bằng một PrepareIntegrityTokenResultValue chứa một RequestTokenData mà bạn nên dùng để yêu cầu mã thông báo về tính toàn vẹn. Dữ liệu này phải được lưu vào bộ nhớ đệm và dùng lại trong suốt phiên hoạt động của ứng dụng cho các lệnh gọi đến RequestIntegrityToken. Chỉ khi ứng dụng của bạn xác định rằng cần phải đánh giá lại hoàn toàn kết quả về tính toàn vẹn, thì bạn mới nên gọi PrepareIntegrityToken.

Chi tiết
Tham số params: Các tham số chứa số dự án trên Google Cloud.
continuation: Lệnh gọi lại không đồng bộ để trả về trình cung cấp mã thông báo về tính toàn vẹn.

Bước 2: Yêu cầu mã thông báo về tính toàn vẹn

void RequestIntegrityToken(
  const RequestIntegrityTokenParams & params,
  RequestIntegrityTokenContinuation continuation
)

Mã thông báo về tính toàn vẹn là một cơ chế để ứng dụng của bạn xác minh rằng thiết bị không bị can thiệp. Ví dụ: máy chủ phụ trợ của bạn có thể dùng mã thông báo về tính toàn vẹn để xác minh:

  • Thiết bị chính hãng: Xác định xem ứng dụng của bạn có đang chạy trên một thiết bị chính hãng chứa một phiên bản chính hãng của Google Play Games dành cho máy tính và không bị giả mạo hay không.

Khi kiểm tra hành động của người dùng trong ứng dụng bằng API Tính toàn vẹn của Play cho máy tính, bạn có thể dùng trường RequestIntegrityTokenParams::request_hash để giảm thiểu các cuộc tấn công can thiệp. Ví dụ: một trò chơi có thể cần báo cáo điểm số của người chơi tới máy chủ phụ trợ của trò chơi. Đồng thời, máy chủ của bạn muốn xác minh điểm số này không bị máy chủ proxy can thiệp. API Tính toàn vẹn của Play sẽ trả về giá trị bạn đặt trong trường này, bên trong phản hồi về tính toàn vẹn đã ký. Nếu không có requestHash, mã thông báo về tính toàn vẹn sẽ chỉ được liên kết với thiết bị chứ không được liên kết với yêu cầu cụ thể, từ đó dẫn đến nguy cơ bị tấn công.

Để giảm thiểu vấn đề này khi bạn yêu cầu kết quả về tính toàn vẹn:

  • Tính toán chuỗi đại diện của tất cả các tham số yêu cầu có liên quan (ví dụ: SHA256 của quá trình chuyển đổi tuần tự yêu cầu có tính ổn định) dựa trên hành động của người dùng hoặc yêu cầu tới máy chủ đang diễn ra.
  • Đặt trường RequestIntegrityTokenParams::request_hash thành thông báo.
Chi tiết
Tham số params: Các tham số chứa RequestTokenData đã chuẩn bị và hàm băm yêu cầu kiểm tra tính toàn vẹn.
continuation: Lệnh gọi lại không đồng bộ để trả về dữ liệu.

Bước 3: Yêu cầu dữ liệu mã thông báo

Sau khi bạn yêu cầu kết quả về tính toàn vẹn, API Tính toàn vẹn của Play sẽ cung cấp mã thông báo phản hồi đã mã hoá. Để có được kết quả về tính toàn vẹn của thiết bị, bạn phải giải mã mã thông báo tính toàn vẹn trên các máy chủ của Google. Cách làm như sau:

  1. Tạo một tài khoản dịch vụ trong dự án Google Cloud được liên kết với ứng dụng của bạn.
  2. Trên máy chủ của ứng dụng, hãy tìm nạp mã truy cập từ thông tin xác thực tài khoản dịch vụ của bạn bằng phạm vi playintegrity và thực hiện yêu cầu sau:

    playintegrity.googleapis.com/v1/<var>PACKAGE_NAME</var>:decodePcIntegrityToken -d \
     '{ "integrity_token": "<var>INTEGRITY_TOKEN</var>" }'
    
  3. Đọc phản hồi JSON.

Tải trọng phát sinh là một mã thông báo dạng văn bản thuần tuý chứa các kết quả về tính toàn vẹn và thông tin chi tiết cùng với thông tin do nhà phát triển cung cấp. Định dạng mã thông báo như sau:

{
  "requestDetails": { ... },
  "deviceIntegrity": { ... },
}

Trước tiên, bạn phải kiểm tra để đảm bảo rằng các giá trị trong trường requestDetails khớp với các giá trị của yêu cầu ban đầu trước khi kiểm tra từng kết quả về tính toàn vẹn. Các phần sau đây sẽ mô tả chi tiết hơn về từng trường.

Trường thông tin chi tiết về yêu cầu

Trường requestDetails chứa thông tin về yêu cầu, bao gồm thông tin do nhà phát triển cung cấp trong requestHash đối với các yêu cầu thông thường và nonce đối với các yêu cầu kiểu cũ.

"requestDetails": {
  // Application package name this attestation was requested for.
  // Note that this field might be spoofed in the middle of the request.
  "requestPackageName": "com.package.name",
  // The timestamp when the integrity token was requested.
  "requestTime": "1675655009345"
  // Request hash provided by the developer.
  "requestHash": "aGVsbG8gd29scmQgdGhlcmU",
}

Các giá trị này phải khớp với các giá trị trong yêu cầu ban đầu. Do đó, hãy xác minh phần requestDetails trong tải trọng JSON bằng cách đảm bảo requestPackageNamerequestHash khớp với nội dung đã gửi trong yêu cầu ban đầu.

Trường tính toàn vẹn của thiết bị

Trường deviceIntegrity có thể chứa một giá trị deviceRecognitionVerdict duy nhất. Giá trị này có một hoặc nhiều nhãn thể hiện mức độ hiệu quả của thiết bị trong việc thực thi tính toàn vẹn của ứng dụng. Nếu thiết bị không đáp ứng tiêu chí của bất kỳ nhãn nào, thì trường deviceIntegrity sẽ bỏ qua deviceRecognitionVerdict.

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_PC_INTEGRITY"]
}

Theo mặc định, deviceRecognitionVerdict có thể chứa các thông tin sau:

MEETS_PC_INTEGRITY
Trả về kết quả nếu ứng dụng đang chạy trong một môi trường PC chính thống, trong đó không phát hiện thấy hành vi giả mạo trên thiết bị.
Trống (giá trị trống)
Ứng dụng đang chạy trên một thiết bị có dấu hiệu bị tấn công (chẳng hạn như hook API) hoặc bị xâm phạm hệ thống (chẳng hạn như đã bị can thiệp vào hệ thống) hoặc ứng dụng không chạy trên một thiết bị thực (chẳng hạn như trình mô phỏng không vượt qua được quy trình kiểm tra tính toàn vẹn của Google Play).

Hạn mức sử dụng

Giới hạn sử dụng API Tính toàn vẹn của Play

Hằng ngày, ứng dụng sẽ chỉ xử lý tối đa 10.000 yêu cầu/ứng dụng. Bạn có thể yêu cầu tăng mức tối đa hằng ngày này theo hướng dẫn sau nếu ứng dụng của bạn cần xử lý số lượng người dùng lớn hơn.

Hành động Hạn mức hằng ngày cho mỗi ứng dụng Ghi chú
Yêu cầu về mã thông báo 10.000 Được chia sẻ giữa API Tính toàn vẹn của Play cho máy tính cũng như API Tính toàn vẹn của Play cho các yêu cầu thông thường và yêu cầu kiểu cũ
Giải mã mã thông báo trên các máy chủ của Google 10.000 Được chia sẻ giữa API Tính toàn vẹn của Play cho máy tính cũng như API Tính toàn vẹn của Play cho các yêu cầu thông thường và yêu cầu kiểu cũ

Tăng mức tối đa hằng ngày cho số lượng yêu cầu

Để đủ điều kiện tăng mức tối đa hằng ngày cho số lượng yêu cầu, thì ngoài các kênh phân phối khác, ứng dụng của bạn phải có mặt trên Google Play.

Để đề nghị tăng mức tối đa hằng ngày cho số lượng yêu cầu, hãy làm như sau:

  1. Liên kết dự án Google Cloud bạn đang sử dụng cho API Tính toàn vẹn của Play trong Play Console.
  2. Xác minh rằng bạn đang triển khai chính xác logic API, bao gồm cả chiến lược thử lại được đề xuất.
  3. Yêu cầu tăng hạn mức bằng cách sử dụng biểu mẫu này.

Có thể cần tới một tuần để tăng hạn mức cho API Tính toàn vẹn của Play. Vì vậy, bạn nên theo dõi mức sử dụng API Tính toàn vẹn của Play trong Google Play Console hoặc trong Google Cloud Console. Tại đây, bạn cũng có thể thiết lập cảnh báo hạn mức để tránh bị gián đoạn dịch vụ.

Mức tăng hạn mức sẽ tự động được áp dụng cho cả lệnh gọi ứng dụng khách để tạo mã thông báo về tính toàn vẹn và lệnh gọi máy chủ để giải mã và xác minh mã thông báo về tính toàn vẹn.

Lưu ý về bảo mật

API Tính toàn vẹn của Play hữu ích nhất khi bạn làm theo các phương pháp đề xuất sau đây:

Có chiến lược chống hành vi sử dụng sai mục đích

API Tính toàn vẹn của Play hoạt động tốt nhất khi được dùng cùng với các tín hiệu khác để tạo thành một chiến lược chống hành vi sử dụng sai mục đích, chứ không phải như cơ chế phòng vệ duy nhất. Hãy sử dụng API này cùng với các phương pháp bảo mật hay nhất phù hợp khác cho ứng dụng của bạn. Theo mặc định, ứng dụng của bạn có thể thực hiện tổng cộng 10.000 yêu cầu mỗi ngày trên tất cả lượt cài đặt. Bạn có thể yêu cầu tăng mức tối đa hằng ngày.

Thu thập dữ liệu đo từ xa và tìm hiểu đối tượng của bạn trước khi hành động

Trước khi thay đổi cách ứng dụng hoạt động dựa trên kết quả của API Tính toàn vẹn của Play, bạn có thể hiểu được tình huống đang diễn ra với đối tượng hiện tại bằng cách triển khai API mà không cần thực thi. Sau khi biết các kết quả đánh giá mà số lượt cài đặt hiện tại của mình trả về, bạn có thể ước tính mức độ tác động của các biện pháp thực thi mà mình đang dự định sử dụng rồi điều chỉnh chiến lược chống hành vi sử dụng sai mục đích cho phù hợp.

Yêu cầu kết quả về tính toàn vẹn vào một thời điểm thích hợp

Bạn nên đưa ra yêu cầu API càng gần thời điểm thực hiện hành động hoặc yêu cầu gửi tới máy chủ mà bạn muốn bảo vệ càng tốt.

Khiến các yêu cầu API của bạn khó sao chép

Các yêu cầu API có một trường tên là requestHash dùng để ngăn chặn hành vi can thiệp và các cuộc tấn công tương tự. Trong trường này, bạn nên thêm một chuỗi đại diện cho tất cả các giá trị có liên quan trong yêu cầu của ứng dụng. Làm theo hướng dẫn về cách sử dụng tính năng liên kết nội dung để bảo vệ các yêu cầu thông thường của ứng dụng.

Tránh lưu kết quả về tính toàn vẹn vào bộ nhớ đệm

Việc lưu vào bộ nhớ đệm các kết quả về tính toàn vẹn sẽ làm tăng nguy cơ bị tấn công proxy. Đây là kiểu tấn công trong đó đối tượng xấu sử dụng lại kết quả từ một thiết bị tốt cho mục đích sai trái trong một môi trường khác.

Gửi một loạt các phản hồi từ máy chủ đến ứng dụng

Việc đưa ra một loạt kết quả cho quyết định sẽ khó sao chép hơn so với việc gửi một phản hồi nhị phân Cho phép / Từ chối từ máy chủ trở lại ứng dụng cho mỗi phản hồi. Ví dụ: bạn có thể sử dụng một loạt các phản hồi có liên quan như Cho phép, Cho phép kèm giới hạn, Cho phép kèm giới hạn sau khi hoàn thành hình ảnh xác thực (CAPTCHA) và Từ chối.

Hiện thông báo lỗi có thể xử lý

Khi có thể, hãy cung cấp các thông báo lỗi hữu ích cho người dùng và cho họ biết những việc có thể làm để khắc phục vấn đề.

Lên kế hoạch cho các vấn đề hoặc tình trạng ngừng dịch vụ bất ngờ

Trang tổng quan về trạng thái của Play hiển thị thông tin về trạng thái dịch vụ của API Tính toàn vẹn của Play, cùng với thông tin về mọi sự cố gián đoạn và ngừng hoạt động. Bạn nên lên kế hoạch trước về cách bạn muốn máy chủ phụ trợ hoạt động trong trường hợp xảy ra tình trạng ngừng dịch vụ của API Tính toàn vẹn của Play trên quy mô lớn (hiếm gặp).

Điều khoản dịch vụ và an toàn dữ liệu

Bằng cách truy cập hoặc sử dụng API Tính toàn vẹn của Play cho máy tính, bạn đồng ý với Điều khoản dịch vụ của API Tính toàn vẹn của Play. Đọc và nắm rõ tất cả các điều khoản và chính sách hiện hành trước khi truy cập vào API này.

Google Play có một mục An toàn dữ liệu dành cho nhà phát triển để công bố các phương pháp thu thập, chia sẻ và bảo mật dữ liệu của ứng dụng nhằm giúp người dùng nắm được các thông tin mới nhất. Để giúp bạn hoàn thành biểu mẫu dữ liệu, hãy xem thông tin về cách API Tính toàn vẹn của Play xử lý dữ liệu.