API Chứng thực SafetyNet

API Chứng thực SafetyNet là một API chống hành vi sai trái cho phép nhà phát triển ứng dụng đánh giá thiết bị Android mà ứng dụng của họ đang chạy trên đó. Bạn nên sử dụng API này như một phần của hệ thống phát hiện hành vi sai trái để giúp xác định xem các máy chủ của bạn có đang tương tác với ứng dụng chính thống đang chạy trên một thiết bị Android thực hay không.

API Chứng thực SafetyNet cung cấp chứng thực có chữ ký mã hoá, giúp đánh giá tính toàn vẹn của thiết bị. Để tạo chứng thực, API này sẽ kiểm tra môi trường phần mềm và phần cứng của thiết bị, tìm các vấn đề liên quan đến tính toàn vẹn rồi so sánh với dữ liệu tham chiếu của các thiết bị Android đã được phê duyệt. Chứng thực tạo ra được liên kết với số chỉ dùng một lần mà ứng dụng gọi cung cấp. Chứng thực này cũng chứa một dấu thời gian khi chứng thực được tạo và siêu dữ liệu về ứng dụng yêu cầu.

API này không được thiết kế để dùng cho các trường hợp sử dụng sau đây:

  • Hoạt động như một cơ chế độc lập để bảo mật ứng dụng hoặc chống hành vi sai trái. Hãy sử dụng API này cùng với các phương pháp bảo mật ứng dụng hay nhất đã đăng và bộ tín hiệu chống hành vi sử dụng sai mục đích dành riêng cho sản phẩm của bạn.
  • Hoạt động khi thiết bị không kết nối Internet. API này sẽ trả về lỗi trong các trường hợp như vậy.
  • Cho phép phản hồi được thông dịch trực tiếp trong ứng dụng gọi. Di chuyển toàn bộ logic của quyết định chống hành vi sai trái sang một máy chủ thuộc quyền kiểm soát của bạn.
  • Cung cấp tín hiệu chi tiết về hoạt động sửa đổi hệ thống. API này cung cấp các giá trị boolean thể hiện nhiều mức độ toàn vẹn của hệ thống.
  • Chứa các tín hiệu cho những trường hợp sử dụng dành riêng cho ứng dụng, chẳng hạn như giá trị nhận dạng thiết bị, trạng thái mô phỏng GPS và trạng thái khoá màn hình.
  • Thay thế hoặc triển khai các biện pháp kiểm tra DRM mạnh mẽ.
  • Chỉ để kiểm tra xem thiết bị có bị can thiệp vào hệ thống hay không, vì API này được thiết kế để kiểm tra tính toàn vẹn tổng thể của thiết bị.

Tổng quan

API Chứng thực SafetyNet sử dụng quy trình sau đây:

  1. API Chứng thực SafetyNet nhận một lệnh gọi từ ứng dụng của bạn. Lệnh gọi này bao gồm một số chỉ dùng một lần.
  2. Dịch vụ Chứng thực SafetyNet đánh giá môi trường thời gian chạy và yêu cầu chứng thực kết quả đánh giá có chữ ký từ các máy chủ của Google.
  3. Các máy chủ của Google sẽ gửi chứng thực có chữ ký đến dịch vụ Chứng thực SafetyNet trên thiết bị.
  4. Dịch vụ Chứng thực SafetyNet sẽ trả về chứng thực có chữ ký này cho ứng dụng của bạn.
  5. Ứng dụng của bạn sẽ chuyển tiếp chứng thực có chữ ký đến máy chủ.
  6. Máy chủ này xác thực phản hồi và sử dụng phản hồi đó cho các quyết định chống hành vi sai trái. Máy chủ sẽ truyền thông tin đã phát hiện được cho ứng dụng của bạn.

Hình 1 dưới đây mô tả quá trình này:

Hình 1. Giao thức API Chứng thực SafetyNet

Lưu ý: Tài liệu và danh sách kiểm tra bổ sung

Trong suốt quá trình khởi chạy, định cấu hình và kích hoạt API Chứng thực SafetyNet, ngoài tài liệu chính này, hãy lưu ý và tuân theo lời khuyên sau đây:

Lấy khoá API

Để gọi các phương thức của API Chứng thực SafetyNet, bạn phải sử dụng một khoá API. API Chứng thực SafetyNet không còn được dùng nên bạn không thể yêu cầu một khoá API mới nữa.

Hoạt động giám sát và hạn mức API

Hạn mức phân bổ mặc định cho mỗi dự án dùng để gọi API Chứng thực SafetyNet là 10.000 yêu cầu mỗi ngày trên cơ sở người dùng của bạn. Để thực hiện nhiều yêu cầu về tính toàn vẹn hơn, hãy di chuyển sang API Tính toàn vẹn của Play và yêu cầu tăng hạn mức theo hướng dẫn trong tài liệu về API Tính toàn vẹn của Play. Xin lưu ý rằng hệ thống sẽ mất vài ngày làm việc để xử lý các yêu cầu về hạn mức, vì vậy, bạn nên thiết lập tính năng giám sát và cảnh báo hạn mức để tránh các tình huống khẩn cấp.

Lưu ý: Bất kể hạn mức được cấp cho dự án của bạn là bao nhiêu, từng thực thể ứng dụng đều được điều tiết ở mức tối đa là 5 yêu cầu mỗi phút. Nếu vượt quá giới hạn này, thì tất cả các yêu cầu còn lại trong phút đó sẽ trả về lỗi.

Hãy lưu ý hành vi này khi triển khai cơ chế thử lại của ứng dụng.

Kiểm tra phiên bản Dịch vụ Google Play

Trước khi sử dụng API Chứng thực SafetyNet, bạn phải đảm bảo rằng thiết bị của người dùng đã cài đặt đúng phiên bản Dịch vụ Google Play. Nếu một phiên bản không chính xác được cài đặt, thì ứng dụng của bạn có thể ngừng phản hồi sau khi gọi API này. Nếu ứng dụng phát hiện thấy một phiên bản không chính xác được cài đặt, bạn nên yêu cầu người dùng cập nhật ứng dụng Dịch vụ Google Play trên thiết bị của họ.

Để kiểm tra xem phiên bản đã cài đặt của Dịch vụ Google Play có tương thích với phiên bản SDK Android mà bạn đang sử dụng hay không, hãy gọi phương thức isGooglePlayServicesAvailable() như minh hoạ trong đoạn mã sau đây:

if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
        == ConnectionResult.SUCCESS) {
  // The SafetyNet Attestation API is available.
} else {
  // Prompt user to update Google Play services.
}

Trên các thiết bị chạy Dịch vụ Google Play phiên bản 13.0 trở lên, API Chứng thực SafetyNet cũng hỗ trợ các khoá API bị hạn chế theo ứng dụng. Tính năng này giúp giảm nguy cơ vô tình sử dụng hoặc sử dụng trái phép các khoá API bị hạn chế theo hạn mức. Nếu muốn sử dụng tính năng không bắt buộc này, hãy kiểm tra để đảm bảo phiên bản tối thiểu của Dịch vụ Google Play trên thiết bị ít nhất phải là 13.0, như minh hoạ trong đoạn mã sau đây:

if (GoogleApiAvailability.getInstance()
    .isGooglePlayServicesAvailable(context, 13000000) ==
    ConnectionResult.SUCCESS) {
  // The SafetyNet Attestation API is available.
} else {
  // Prompt user to update Google Play Services.
}

Yêu cầu chứng thực SafetyNet

Sau khi bạn nhận được một khoá API hợp lệ cho API Xác minh thiết bị Android trong Google API Console, ứng dụng của bạn có thể dùng dịch vụ Chứng thực SafetyNet. Để thực hiện điều này, vui lòng hoàn thành các bước sau:

  1. Lấy một số chỉ dùng một lần.
  2. Yêu cầu một chứng thực SafetyNet.
  3. Chuyển phản hồi này đến máy chủ của bạn.
  4. Sử dụng phản hồi này trên máy chủ của bạn cùng các tín hiệu chống hành vi sai trái khác để kiểm soát hành vi của ứng dụng.

Để đảm bảo khả năng thích ứng của ứng dụng, hãy thực hiện các bước này bên ngoài luồng thực thi chính của ứng dụng. Để tìm hiểu thêm về cách tạo các luồng thực thi riêng biệt, hãy xem phần Gửi thao tác đến nhiều luồng.

Bạn nên thực hiện bước kiểm tra này để bảo vệ mọi hành động quan trọng (bao gồm các lần đăng nhập, sự kiện mua hàng và hoạt động thu nạp sản phẩm mới trong ứng dụng) trong ứng dụng của mình. Tuy nhiên, các lệnh gọi đến API Chứng thực SafetyNet sẽ làm tăng độ trễ, mức sử dụng dữ liệu di động và mức sử dụng pin, vì vậy, bạn nên cân bằng giữa tính bảo mật và khả năng hữu dụng. Ví dụ: bạn có thể chọn yêu cầu chứng thực SafetyNet khi đăng nhập và chạy quy trình kiểm tra lại tối đa 30 phút một lần. Bạn cũng có thể cho phép máy chủ chọn thời điểm ứng dụng sẽ yêu cầu chứng thực, để khiến đối tượng gây hại khó dự đoán thời gian kiểm tra hơn.

Lấy một số chỉ dùng một lần

Khi gọi API Chứng thực SafetyNet, bạn phải truyền vào một số chỉ dùng một lần. Chứng thực thu được chứa số chỉ dùng một lần này, cho phép bạn xác định rằng hoạt động chứng thực thuộc về lệnh gọi API của bạn và không bị kẻ tấn công phát lại.

Số chỉ dùng một lần dùng với yêu cầu SafetyNet phải có độ dài ít nhất là 16 byte. Bạn nên biến đổi số chỉ dùng một lần nhằm đảm bảo rằng cùng một số chỉ dùng một lần sẽ không bao giờ được sử dụng hai lần. Phương pháp hay nhất là lấy một phần số chỉ dùng một lần từ dữ liệu đang được gửi đến các máy chủ của bạn. Ví dụ: nối hàm băm của tên người dùng với dấu thời gian yêu cầu để tạo thành số chỉ dùng một lần.

Lưu ý quan trọng: Đưa nhiều phần dữ liệu nhất có thể vào số chỉ dùng một lần. Khi làm như vậy, bạn sẽ khiến kẻ tấn công khó thực hiện các cuộc tấn công phát lại hơn. Ví dụ: việc lấy số chỉ dùng một lần từ tên người dùng sẽ giới hạn các cuộc tấn công phát lại ở cùng một tài khoản. Tuy nhiên, việc lấy số chỉ dùng một lần từ tất cả các thông tin chi tiết của một sự kiện mua hàng sẽ giới hạn việc sử dụng thông báo phản hồi của API ở riêng sự kiện mua hàng đó.

Khi nhận được phản hồi đã ký từ API, hãy luôn so sánh số chỉ dùng một lần trong phản hồi đã ký với phản hồi mà bạn tạo lại từ phần còn lại của thông báo được gửi đến các máy chủ của bạn. Bước kiểm tra này nhằm đảm bảo rằng kẻ tấn công không thể sử dụng lại các chứng thực đã ký thu thập từ những thiết bị ở trạng thái tốt cho các yêu cầu khác được tạo một cách ác ý.

Để biết thêm thông tin về cách dùng các hàm mật mã học, hãy xem hướng dẫn về cách sử dụng mật mã học.

Yêu cầu chứng thực

Sau khi thiết lập kết nối với Dịch vụ Google Play và tạo một số chỉ dùng một lần, bạn có thể gửi yêu cầu chứng thực SafetyNet. Phản hồi cho yêu cầu của bạn có thể không có sẵn ngay lập tức, vì vậy, tốt nhất bạn nên thiết lập một trình nghe gọi lại để xử lý phản hồi từ dịch vụ. Đoạn mã sau đây có chứa một trình nghe mẫu:

Kotlin

SafetyNet.getClient(this).attest(nonce, API_KEY)
    .addOnSuccessListener(this) {
        // Indicates communication with the service was successful.
        // Use response.getJwsResult() to get the result data.
    }
    .addOnFailureListener(this) { e ->
        // An error occurred while communicating with the service.
        if (e is ApiException) {
            // An error with the Google Play services API contains some
            // additional details.
            val apiException = e as ApiException

            // You can retrieve the status code using the
            // apiException.statusCode property.
        } else {
            // A different, unknown type of error occurred.
            Log.d(FragmentActivity.TAG, "Error: " + e.message)
        }
    }

Java

// The nonce should be at least 16 bytes in length.
// You must generate the value of API_KEY in the Google APIs dashboard.
SafetyNet.getClient(this).attest(nonce, API_KEY)
    .addOnSuccessListener(this,
        new OnSuccessListener<SafetyNetApi.AttestationResponse>() {
            @Override
            public void onSuccess(SafetyNetApi.AttestationResponse response) {
                // Indicates communication with the service was successful.
                // Use response.getJwsResult() to get the result data.
            }
        })
    .addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // An error occurred while communicating with the service.
            if (e instanceof ApiException) {
                // An error with the Google Play services API contains some
                // additional details.
                ApiException apiException = (ApiException) e;
                // You can retrieve the status code using the
                // apiException.getStatusCode() method.
            } else {
                // A different, unknown type of error occurred.
                Log.d(TAG, "Error: " + e.getMessage());
            }
        }
    });

Phương thức onSuccess() cho biết rằng quá trình giao tiếp với dịch vụ đã thành công, nhưng không cho biết thiết bị đã vượt qua quy trình chứng thực SafetyNet hay chưa. Phần tiếp theo sẽ thảo luận về cách đọc kết quả chứng thực và xác minh tính toàn vẹn của kết quả đó.

Chuyển phản hồi của chứng thực SafetyNet đến máy chủ của bạn

Khi ứng dụng của bạn giao tiếp với SafetyNet, dịch vụ sẽ cung cấp một phản hồi chứa kết quả của chứng thực SafetyNet và đưa ra thông tin bổ sung để giúp bạn xác minh tính toàn vẹn của thông báo. Kết quả được cung cấp dưới dạng một đối tượng SafetyNetApi.AttestationResponse. Hãy sử dụng phương thức getJwsResult() của đối tượng này để lấy dữ liệu của yêu cầu. Phản hồi này được định dạng là Chữ ký web JSON (JWS).

Gửi đối tượng JWS trở lại máy chủ của bạn để xác thực và sử dụng.

Sử dụng phản hồi chứng thực SafetyNet trên máy chủ của bạn

Phần trích dẫn JWS sau đây cho thấy định dạng và nội dung mẫu của dữ liệu tải trọng:

{
  "timestampMs": 9860437986543,
  "nonce": "R2Rra24fVm5xa2Mg",
  "apkPackageName": "com.package.name.of.requesting.app",
  "apkCertificateDigestSha256": ["base64 encoded, SHA-256 hash of the
                                  certificate used to sign requesting app"],
  "ctsProfileMatch": true,
  "basicIntegrity": true,
  "evaluationType": "BASIC",
  "deprecationInformation": "..."
}

Tải trọng của chứng thực đã ký thường chứa các trường sau đây:

Dấu thời gian phản hồi

  • timestampMs: Số mili giây đã trôi qua theo thời gian UNIX khi thông báo phản hồi JWS được các máy chủ của Google tạo.

Dữ liệu do ứng dụng gọi cung cấp

  • nonce: Mã thông báo dùng một lần mà ứng dụng gọi truyền đến API.

Dữ liệu về ứng dụng gọi

  • apkPackageName: Tên gói của ứng dụng gọi.
  • apkCertificateDigestSha256: (Các) giá trị đại diện được mã hoá theo chuẩn Base-64 của hàm băm SHA-256 trong (các) chứng chỉ ký của ứng dụng gọi

Kết quả về tính toàn vẹn

  • ctsProfileMatch: Kết quả kiểm tra nghiêm ngặt hơn về tính toàn vẹn của thiết bị. Nếu giá trị của ctsProfileMatchtrue, thì hồ sơ của thiết bị đang chạy ứng dụng của bạn sẽ khớp với hồ sơ của một thiết bị đã vượt qua quá trình kiểm tra khả năng tương thích với Android và đã được phê duyệt là thiết bị Android được Google chứng nhận.
  • basicIntegrity: Kết quả kiểm tra ít nghiêm ngặt hơn về tính toàn vẹn của thiết bị. Nếu chỉ có giá trị của basicIntegritytrue, thì thiết bị đang chạy ứng dụng của bạn có khả năng không bị can thiệp. Tuy nhiên, thiết bị không nhất thiết phải vượt qua quá trình kiểm tra khả năng tương thích với Android.

    Để biết thêm thông tin về quá trình kiểm tra khả năng tương thích với Android, hãy xem phần Thiết kế thiết bị Android, cũng như phần Khả năng tương thích với Android và Bộ kiểm tra tính tương thích (CTS).

Thông tin về việc ngừng sử dụng

  • deprecationInformation: Một chuỗi chứa thông tin dành cho nhà phát triển về việc ngừng sử dụng API Chứng thực SafetyNet.

Trường không bắt buộc

  • error: Thông tin lỗi đã được mã hoá có liên quan đến yêu cầu API hiện tại.
  • advice: Đề xuất về cách đưa thiết bị trở lại trạng thái tốt.
  • evaluationType: Các kiểu đo lường góp phần vào phản hồi hiện tại của API.

Các kết quả có thể có về tính toàn vẹn

Thông báo JWS chứa 2 tham số cho biết kết quả của quá trình kiểm tra khả năng tương thích của thiết bị: ctsProfileMatchbasicIntegrity. Trạng thái của thiết bị đang chạy ứng dụng có thể ảnh hưởng đến giá trị của từng tham số, như minh hoạ trong Bảng 1:

Bảng 1. Ví dụ về ảnh hưởng của trạng thái thiết bị đến các giá trị của basicIntegrityctsProfileMatch

Trạng thái thiết bị Giá trị của ctsProfileMatch Giá trị của basicIntegrity
Thiết bị thực, được chứng nhận và vượt qua CTS true true
Thiết bị được chứng nhận có trình tải khởi động đã mở khoá false true
Thiết bị thực nhưng chưa được chứng nhận, chẳng hạn như trong trường hợp nhà sản xuất không đăng ký xin cấp chứng nhận false true
Thiết bị có ROM tuỳ chỉnh (không bị can thiệp vào hệ thống) false true
Trình mô phỏng false false
Không có thiết bị nào (chẳng hạn như tập lệnh mô phỏng giao thức) false false
Dấu hiệu cho thấy tính toàn vẹn của hệ thống bị xâm phạm, một trong số đó có thể là trường hợp bị can thiệp vào hệ thống false false
Dấu hiệu cho thấy các cuộc tấn công khác đang diễn ra, chẳng hạn như hook API false false

Các trường hợp lỗi

Thông báo JWS cũng có thể sẽ hiện một số kiểu tình trạng lỗi sau đây:

  • Kết quả null chỉ ra rằng lệnh gọi đến dịch vụ không hoàn tất thành công.
  • Một tham số lỗi trong JWS chỉ ra rằng đã xảy ra vấn đề, chẳng hạn như lỗi mạng hoặc lỗi cho biết kẻ tấn công đã giả mạo. Hầu hết các lỗi đều là tạm thời và sẽ không xuất hiện nếu bạn thực hiện một lệnh gọi khác đến dịch vụ. Bạn nên thử lại thêm một vài lần với độ trễ tăng dần giữa mỗi lần thử lại.
  • Nếu thiết bị bị can thiệp (tức là nếu basicIntegrity được đặt thành false trong phản hồi), thì kết quả có thể không chứa dữ liệu về ứng dụng gọi, chẳng hạn như apkPackageNameapkCertificateDigestSha256. Điều này xảy ra khi hệ thống của chúng tôi không thể xác định một cách chính xác ứng dụng gọi.

Bạn nên làm gì khi chứng thực đã ký báo cáo lỗi?

  • Thử lại. Lỗi trên các thiết bị hợp lệ là tạm thời và sẽ không xuất hiện nếu bạn thực hiện một lệnh gọi khác đến dịch vụ.
  • Kiểm tra để đảm bảo rằng ứng dụng của bạn không gọi API quá 5 lần mỗi phút trên các thiết bị bị ảnh hưởng và hạn mức API của dự án chưa hết.
  • Giả sử rằng đó có thể là một kẻ tấn công đang cố ý kích hoạt một trường hợp lỗi để giả trang cho hoạt động của chúng.

Lời khuyên giúp vượt qua các lần kiểm tra trong tương lai

Nếu có, tham số advice sẽ cung cấp thông tin giúp giải thích lý do API Chứng thực SafetyNet đặt ctsProfileMatch hoặc basicIntegrity thành false trong một kết quả cụ thể. Giá trị của tham số này chứa một danh sách các chuỗi, chẳng hạn như các chuỗi trong ví dụ sau:

{"advice": "LOCK_BOOTLOADER,RESTORE_TO_FACTORY_ROM"}

Trong ứng dụng của mình, bạn có thể chuyển đổi các giá trị trong tham số của lời khuyên thành các thông báo thân thiện với người dùng để giúp người dùng vượt qua các chứng thực SafetyNet trong tương lai, như minh hoạ trong danh sách sau đây:

LOCK_BOOTLOADER
Người dùng nên khoá trình tải khởi động của thiết bị.
RESTORE_TO_FACTORY_ROM
Người dùng cần khôi phục thiết bị về ROM gốc.

Các kiểu đánh giá

Tham số evaluationType sẽ xuất hiện bất cứ khi nào có kết quả ctsProfileMatchbasicIntegrity.

Tham số này cung cấp thông tin về các kiểu đo lường dùng để tính các trường như ctsProfileMatchbasicIntegrity cho một phản hồi cụ thể. Giá trị của tham số chứa một danh sách các chuỗi như trong ví dụ sau:

{"evaluationType": "BASIC,HARDWARE_BACKED"}

Hiện tại, các giá trị có thể có là:

BASIC
Sử dụng thông tin đo lường và dữ liệu tham chiếu điển hình.
HARDWARE_BACKED
Sử dụng các tính năng bảo mật dựa trên phần cứng, trong đó có những tính năng như Chứng thực khoá, được hỗ trợ trên các thiết bị đi kèm với Android 8.0 (API cấp 26) trở lên.

Trong ứng dụng của mình, bạn có thể coi sự hiện diện của HARDWARE_BACKED trong tham số evaluationType là một chỉ báo cho biến cần đánh giá hiệu quả hơn tính toàn vẹn của thiết bị.

Lưu ý: Bạn chỉ nên dựa vào tham số evaluationType đối với các ứng dụng đã sử dụng kết quả ctsProfileMatch và yêu cầu mức đảm bảo tính toàn vẹn của thiết bị ở cấp cao nhất, ngay cả khi cái giá phải trả là hạn chế cơ sở người dùng. Trong hầu hết các trường hợp, bạn nên tiếp tục dựa vào kết quả basicIntegrityctsProfileMatch để phát hiện hành vi sai trái. Những kết quả này đã tích hợp các tính năng bảo mật dựa trên phần cứng (nếu có).

Nếu quyết định dựa vào sự hiện diện của một giá trị nhất định trong tham số evaluationType, thì bạn nên cân nhắc triển khai một cơ chế thử lại trong ứng dụng phòng trường hợp xảy ra lỗi tạm thời.

Xác minh phản hồi chứng thực SafetyNet

Bạn nên thực hiện các bước nhằm đảm bảo rằng phản hồi chứng thực SafetyNet thực sự đến từ dịch vụ SafetyNet và có chứa dữ liệu phù hợp với yêu cầu của bạn.

Để xác minh nguồn gốc của thông báo JWS, hãy hoàn tất các bước sau đây:

  1. Trích xuất chuỗi chứng chỉ SSL từ thông báo JWS.
  2. Xác thực chuỗi chứng chỉ SSL và sử dụng tính năng so khớp tên máy chủ SSL để xác minh rằng leaf certificate đã được phát hành cho tên máy chủ attest.android.com.
  3. Sử dụng chứng chỉ này để xác minh chữ ký của thông báo JWS.
  4. Kiểm tra dữ liệu của thông báo JWS để đảm bảo dữ liệu đó khớp với dữ liệu trong yêu cầu ban đầu của bạn. Cụ thể, hãy đảm bảo rằng dấu thời gian đã được xác thực và số chỉ dùng một lần, tên gói cũng như hàm băm trong (các) chứng chỉ ký của ứng dụng khớp với các giá trị dự kiến.

Bạn nên xác minh câu lệnh JWS bằng các giải pháp mật mã tiêu chuẩn (chẳng hạn như các giải pháp có trong phần sử dụng API mẫu android-play-safetynet) có sẵn trên GitHub.

Trong quá trình kiểm thử và phát triển ban đầu (nhưng chưa chính thức), bạn có thể gọi một API trực tuyến để xác minh chữ ký của câu lệnh JWS. Quy trình này cũng đã được minh hoạ trong cách sử dụng API mẫu android-play-safetynet có sẵn trên GitHub. Xin lưu ý rằng API xác minh trực tuyến chỉ dành cho việc kiểm thử ở giai đoạn đầu và bạn có một hạn mức cố định là 10.000 yêu cầu mỗi ngày.

Lưu ý quan trọng: Việc sử dụng API xác minh trực tuyến chỉ xác thực rằng thông báo JWS do máy chủ của API Chứng thực SafetyNet ký. API trực tuyến này không thể xác minh liệu các trường trong tải trọng có khớp với các giá trị mà dịch vụ của bạn mong đợi hay không.

Lên kế hoạch cho các trường hợp ngoài dự kiến

Bạn nên lên kế hoạch sử dụng để tính đến các trường hợp thay đổi và sự cố ngừng dịch vụ.

Các thay đổi về API
Các trường mới (thử nghiệm) có thể xuất hiện trong kết quả bất cứ lúc nào. Hãy đảm bảo các trường bổ sung này không làm hỏng trình phân tích cú pháp hoặc logic sử dụng của bạn. Cụ thể, đừng dựa vào các trường thử nghiệm trước khi các trường đó được công bố trong danh sách gửi thư của các ứng dụng API SafetyNet.
API Chứng thực SafetyNet ngừng hoạt động

Trong trường hợp hiếm gặp là API Chứng thực SafetyNet không hoạt động, người dùng API này nên tạo các tính năng phía máy chủ để linh hoạt kiểm soát sự phụ thuộc vàotình trạng hoạt động cũng như chất lượng của API này và phản hồi của nó.

Các chiến lược thông thường phải bao gồm khả năng hướng dẫn linh hoạt để ra lệnh ứng dụng ngừng gọi API này, cũng như các danh sách cho phép dựa trên thiết bị và người dùng để bỏ qua kết quả API Chứng thực SafetyNet đối với một số loại thiết bị và người dùng.

Mã mẫu

Để được hướng dẫn thêm về cách làm việc với các API SafetyNet, hãy xem mã mẫu có trên GitHub.

Danh sách thông báo

Bạn nên tham gia danh sách gửi thư của ứng dụng API SafetyNet để nhận thông tin cập nhật về API Chứng thực SafetyNet.

Phản hồi

Vui lòng cân nhắc đưa ra ý kiến phản hồi về API này. Chúng tôi sẽ dựa vào ý kiến phản hồi của bạn để đặt ra mức độ ưu tiên cho các tính năng và chức năng mới của API này.

Tìm hiểu thêm

Để tìm hiểu thêm về các phương pháp hay nhất khi sử dụng API Chứng thực SafetyNet, hãy xem các đường liên kết sau đây:

Điều khoản dịch vụ bổ sung

Bằng cách truy cập hoặc sử dụng API SafetyNet, bạn đồng ý với Điều khoản dịch vụ dành cho các API của Google và các Điều khoản bổ sung này. Vui lòng đọc và nắm rõ tất cả các điều khoản và chính sách áp dụng trước khi truy cập vào các API này.

Điều khoản dịch vụ của SafetyNet

Tương tự với bất kỳ dữ liệu nào được thu thập với khối lượng lớn từ quá trình quan sát trong trường, vẫn có khả năng xảy ra cả trường hợp dương tính giả (FN) và âm tính giả (FN). Chúng tôi đang trình bày dữ liệu theo hiểu biết tốt nhất của mình. Chúng tôi kiểm tra kỹ lưỡng cơ chế phát hiện của mình để đảm bảo độ chính xác và cam kết cải tiến các phương thức đó theo thời gian nhằm đảm bảo chúng luôn duy trì độ chính xác.

Bạn đồng ý tuân thủ tất cả các luật, quy định hiện hành và quyền của bên thứ ba (bao gồm nhưng không giới hạn ở các luật liên quan đến việc nhập/xuất dữ liệu hoặc phần mềm, quyền riêng tư và luật địa phương). Bạn sẽ không được sử dụng các API này để khuyến khích hoặc quảng bá hoạt động bất hợp pháp hoặc vi phạm quyền của bên thứ ba. Bạn không được vi phạm bất kỳ điều khoản dịch vụ nào khác mà bạn có với Google (hoặc các đơn vị liên kết của Google).

Bạn xác nhận và hiểu rằng API SafetyNet hoạt động bằng cách thu thập thông tin phần cứng và phần mềm, chẳng hạn như dữ liệu thiết bị và ứng dụng cũng như kết quả của hoạt động chứng thực SafetyNet, đồng thời gửi dữ liệu đó đến Google để phân tích. Căn cứ vào Mục 3(d) trong Điều khoản dịch vụ dành cho các API của Google, bạn đồng ý rằng nếu bạn sử dụng các API đó, thì bạn có trách nhiệm cung cấp mọi thông báo hoặc sự đồng ý cần thiết cho việc thu thập và chia sẻ dữ liệu này với Google.

An toàn dữ liệu trong dịch vụ chứng thực SafetyNet

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. Để hoàn tất các yêu cầu trong mục an toàn dữ liệu, bạn có thể sử dụng thông tin sau đây về cách API Chứng thực SafetyNet xử lý dữ liệu:

Kiểu phương pháp Cách API Chứng thực SafetyNet áp dụng phương pháp này
Dữ liệu thu được về mức sử dụng
  • Tên gói
  • Chứng chỉ ký của ứng dụng
  • Mã thông báo chứng thực thiết bị do Dịch vụ Google Play tạo
Mục đích của việc thu thập dữ liệu Dữ liệu thu thập được dùng để xác minh tính toàn vẹn của ứng dụng và tính toàn vẹn của thiết bị.
Mã hoá dữ liệu Dữ liệu không được mã hoá.
Chia sẻ dữ liệu Dữ liệu không được chuyển cho bất kỳ bên thứ ba nào.
Xoá dữ liệu Dữ liệu sẽ bị xoá sau một khoảng thời gian lưu giữ cố định.

Để hoàn tất thông tin công bố liên quan đến việc thu thập và sử dụng dữ liệu, bạn có thể tham khảo hướng dẫn về các kiểu dữ liệu của Android để xác định kiểu dữ liệu nào mô tả chính xác nhất dữ liệu được thu thập. Trong thông tin công bố liên quan đến việc thu thập và sử dụng dữ liệu, hãy nhớ đề cập đến cả cách ứng dụng cụ thể của bạn chia sẻ và sử dụng dữ liệu đã thu thập.

Mặc dù luôn cố gắng minh bạch nhất có thể trong quá trình hỗ trợ bạn, nhưng chúng tôi không thể thay mặt bạn và bạn hoàn toàn chịu trách nhiệm đối với việc đưa ra quyết định về cách phản hồi biểu mẫu trong mục an toàn dữ liệu của Google Play liên quan đến hoạt động thu thập, chia sẻ dữ liệu người dùng trong ứng dụng của bạn và các biện pháp bảo mật.