Tính minh bạch của mã cho gói ứng dụng

Tính minh bạch của mã là cơ chế xác minh và ký mã cho ứng dụng được phát hành bằng Android App Bundle. Việc xác minh sử dụng khóa ký minh bạch về mã chỉ do nhà phát triển ứng dụng nắm giữ.

Tính minh bạch của mã không phụ thuộc vào lược đồ ký dùng cho gói ứng dụng và APK. Khóa minh bạch của mã mang tính riêng biệt và khác với khóa ký ứng dụng lưu trữ trên cơ sở hạ tầng bảo mật của Google khi bạn sử dụng Tính năng ký ứng dụng của Play.

Cách hoạt động của tính minh bạch về mã

Quá trình này hoạt động bằng cách đưa tệp minh bạch về mã vào gói sau khi nó được tạo và trước khi được tải lên Play Console để phân phối.

Tệp minh bạch về mã là một Mã thông báo web JSON (JWT) chứa danh sách các tệp DEX và thư viện gốc có trong gói cùng với hàm băm của những tệp đó. Sau đó, khóa này được ký bằng khóa minh bạch do nhà phát triển ứng dụng nắm giữ.

Sơ đồ minh bạch về mã

Tệp minh bạch về mã được truyền đến APK cơ sở tạo từ gói ứng dụng (dành riêng cho phần phân tách chính của mô-đun cơ sở). Sau đó, bạn có thể xác minh:

  • Tất cả các tệp mã DEX và mã gốc có trong APK đều có hàm băm khớp trong tệp minh bạch về mã.
  • Thành phần khóa công khai của khóa ký minh bạch mã trong ứng dụng khớp với khóa công khai của nhà phát triển ứng dụng (phải do nhà phát triển cung cấp qua một kênh riêng biệt và an toàn).

Thông tin này xác minh mã chứa trong APK phù hợp với ý định của nhà phát triển và chưa sửa đổi.

Tệp minh bạch về mã không xác minh tài nguyên, tài sản, Android Manifest hoặc bất kỳ tệp nào khác không phải là tệp DEX hoặc thư viện gốc có trong thư mục lib/.

Việc xác minh tính minh bạch của mã chỉ được nhà phát triển và người dùng cuối kiểm tra. Họ muốn đảm bảo mã đang chạy khớp với mã do nhà phát triển ứng dụng tạo và ký ban đầu.

Các hạn chế đã biết

Trong một số trường hợp, bạn không thể sử dụng tính minh bạch của mã:

  • Các ứng dụng chỉ định thuộc tính sharedUserId trong tệp kê khai. Các ứng dụng đó có thể chia sẻ quy trình với ứng dụng khác, điều này gây khó khăn cho việc đảm bảo về mã đang thực thi.
  • Các ứng dụng sử dụng tính năng bảo vệ chống giả mạo, hoặc bất kỳ dịch vụ nào khác thực hiện thay đổi mã sau khi tạo tệp độ minh bạch của mã sẽ khiến quá trình xác minh tính minh bạch của mã không thành công.
  • Các ứng dụng sử dụng Multidex cũ ở cấp API dưới 21 (Android 5.0) và sử dụng các mô-đun tính năng. Tính minh bạch của mã tiếp tục duy trì khi Google Play cài đặt ứng dụng trên các thiết bị phiên bản Android 5.0 trở lên. Tính minh bạch về mã sẽ bị vô hiệu hóa trên các phiên bản hệ điều hành cũ hơn.

Cách thêm tính minh bạch của mã

Trước khi thêm tính năng minh bạch về mã vào ứng dụng, hãy đảm bảo bạn có cặp khóa riêng tư và khóa công khai có thể dùng để ký xác minh tính minh bạch của mã. Nó phải là khóa duy nhất khác với khóa ký ứng dụng mà bạn dùng cho Tính năng ký ứng dụng của Play. Bạn phải giữ khóa này một cách an toàn và tuyệt đối không chia sẻ với ai bên ngoài tổ chức của mình.

Nếu không có khóa, bạn có thể làm theo hướng dẫn trong bài viết Ký ứng dụng để tạo một khóa trên máy của mình. Tính minh bạch của mã sử dụng tệp kho khóa chuẩn, do đó, mặc dù hướng dẫn dành cho tính năng ký ứng dụng, nhưng quy trình tạo khóa cũng giống nhau.

Sử dụng trình bổ trợ Android cho Gradle

Hỗ trợ tính minh bạch của mã yêu cầu trình bổ trợ Android cho Gradle phiên bản 7.1.0-alpha03 trở lên. Để định cấu hình khóa ký tính minh bạch của mã, hãy thêm nội dung sau trong khối bundle.

Groovy

// In your app module's build.gradle file:
android {
    ...
    bundle {
        codeTransparency {
            signing {
                keyAlias = "ALIAS"
                keyPassword = "PASSWORD"
                storeFile = file("path/to/keystore")
                storePassword = "PASSWORD"
            }
        }
        ...
    }
}

Kotlin

// In your app module's build.gradle.kts file:
android {
    ...
    bundle {
        codeTransparency {
            signing {
                keyAlias = "ALIAS"
                keyPassword = "PASSWORD"
                storeFile = file("path/to/keystore")
                storePassword = "PASSWORD"
            }
        }
        ...
    }
}

Khóa sử dụng phải là khóa bạn sẽ chỉ sử dụng để minh bạch mã và không phải là khóa ký ứng dụng mà Tính năng ký ứng dụng của Play sử dụng.

Đang sử dụng bundletool trên dòng lệnh

Để hỗ trợ tính minh bạch của mã, bạn phải sử dụng bundletool phiên bản 1.7.0 trở lên. Có thể tải ứng dụng từ GitHub xuống.

Chạy lệnh sau để thêm tính minh bạch của mã vào Android App Bundle. Khóa sử dụng phải là khóa bạn sẽ chỉ sử dụng để minh bạch mã và không phải là khóa ký ứng dụng mà Tính năng ký ứng dụng của Play sử dụng.

bundletool add-transparency \
  --bundle=/MyApp/my_app.aab \
  --output=/MyApp/my_app_with_transparency.aab \
  --ks=/MyApp/keystore.jks \
  --ks-pass=file:/MyApp/keystore.pwd \
  --ks-key-alias=MyKeyAlias \
  --key-pass=file:/MyApp/key.pwd

Ngoài ra, nếu muốn sử dụng các công cụ ký riêng, bạn có thể sử dụng bundletool để tạo tệp minh bạch cho mã chưa ký: ký vào tệp này trong một dòng phân cách và chèn chữ ký vào gói:

# Generate code transparency file
bundletool add-transparency \
  --mode=generate_code_transparency_file \
  --bundle=/MyApp/my_app.aab \
  --output=/MyApp/code_transparency_file.jwt \
  --transparency-key-certificate=/MyApp/transparency.cert

# Add code transparency signature to the bundle
bundletool add-transparency \
  --mode=inject_signature \
  --bundle=/MyApp/my_app.aab \
  --output=/MyApp/my_app_with_transparency.aab \
  --transparency-key-certificate=/MyApp/transparency.cert \
  --transparency-signature=/MyApp/signature

Xác minh tính minh bạch của mã trong ứng dụng

Có nhiều phương thức khác nhau để xác minh mã dựa trên tệp minh bạch về mã, tùy thuộc vào việc bạn đã cài đặt các APK trên thiết bị Android hay đã tải tệp cục bộ xuống máy tính.

Sử dụng Bundletool để kiểm tra gói ứng dụng hoặc bộ APK

Bạn có thể sử dụng bundletool để xác minh tính minh bạch của mã trong gói ứng dụng hoặc một bộ APK. Dùng lệnh check-transparency để in dấu vân tay chứng chỉ công khai:

# For checking a bundle:
bundletool check-transparency \
  --mode=bundle \
  --bundle=/MyApp/my_app_with_transparency.aab

No APK present. APK signature was not checked.
Code transparency signature is valid. SHA-256 fingerprint of the code transparency key certificate (must be compared with the developer's public key manually): 01 23 45 67 89 AB CD EF ..
Code transparency verified: code related file contents match the code transparency file.


# For checking a ZIP containing app's APK splits:
bundletool check-transparency \
  --mode=apk \
  --apk-zip=/MyApp/my_app_with_transparency.zip

APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): 02 34 E5 98 CD A7 B2 12 ..
Code transparency signature is valid. SHA-256 fingerprint of the code transparency key certificate (must be compared with the developer's public key manually): 01 23 45 67 89 AB CD EF ..
Code transparency verified: code related file contents match the code transparency file.

Bạn có thể tùy ý chỉ định chứng chỉ công khai mình muốn xác minh gói APK hoặc APK đã đặt để không phải so sánh các hàm băm theo cách thủ công:

bundletool check-transparency \
  --mode=bundle \
  --bundle=/MyApp/my_app_with_transparency.aab \
  --transparency-key-certificate=/MyApp/transparency.cert

No APK present. APK signature was not checked.
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.


bundletool check-transparency \
  --mode=apk \
  --apk-zip=/MyApp/my_app_with_transparency.zip \
  --apk-signing-key-certificate=/MyApp/apk.cert \
  --transparency-key-certificate=/MyApp/transparency.cert

APK signature verified for the provided apk signing key certificate.
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.

Sử dụng Bundletool để kiểm tra một ứng dụng đã được cài đặt trên thiết bị hay chưa

Để kiểm tra ứng dụng đã được cài đặt trên thiết bị Android, phải đảm bảo thiết bị được kết nối với máy tính qua ADB và đưa ra câu lệnh sau:

bundletool check-transparency \
  --mode=connected_device \
  --package-name="com.my.app"

APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): 02 34 E5 98 CD A7 B2 12 ..
Code transparency signature is valid. SHA-256 fingerprint of the code transparency key certificate (must be compared with the developer's public key manually): 01 23 45 67 89 AB CD EF ..
Code transparency verified: code related file contents match the code transparency file.

Bước kiểm tra tính minh bạch của thiết bị đã kết nối cũng có thể tùy chọn (không bắt buộc) xác minh chữ ký đối với khóa công khai đã chỉ định:

bundletool check-transparency \
  --mode=connected-device \
  --package-name="com.my.app" \
  --apk-signing-key-certificate=/MyApp/apk.cert \
  --transparency-key-certificate=/MyApp/transparency.cert

APK signature verified for the provided apk signing key certificate.
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.