Transparansi kode untuk app bundle

Transparansi kode adalah mekanisme penandatanganan dan verifikasi kode opsional untuk aplikasi yang dipublikasikan dengan Android App Bundle. Transparansi ini menggunakan kunci penandatanganan transparansi kode, yang hanya dipegang oleh developer aplikasi.

Transparansi kode terpisah dari skema penandatanganan yang digunakan untuk app bundle dan APK. Kunci transparansi kode terpisah dan berbeda dari kunci penandatanganan aplikasi yang disimpan di infrastruktur Google yang aman saat menggunakan Penandatanganan Aplikasi Play.

Cara kerja transparansi kode

Proses ini bekerja dengan menyertakan file transparansi kode dalam paket setelah dibuat, tetapi sebelum diupload ke Konsol Play untuk didistribusikan.

File transparansi kode adalah Token Web JSON (JWT) yang berisi daftar file DEX dan library native yang disertakan dalam paket, beserta hash-nya. File ini kemudian ditandatangani menggunakan kunci transparansi kode yang hanya dipegang oleh developer.

Diagram transparansi kode

File transparansi kode ini disebarkan ke APK dasar yang dibuat dari app bundle (khususnya ke bagian utama modul dasar). Lalu, dapat dipastikan bahwa:

  • Semua file DEX dan kode native yang ada di APK memiliki hash yang cocok dalam file transparansi kode.
  • Komponen kunci publik dari kunci penandatanganan transparansi kode di aplikasi cocok dengan kunci publik dari developer (yang harus disediakan oleh developer melalui saluran terpisah yang aman).

Bersama-sama, informasi ini memverifikasi bahwa kode yang terdapat dalam APK cocok dengan yang dimaksudkan developer, dan belum dimodifikasi.

File transparansi kode tidak memverifikasi resource, aset, Manifes Android, atau file lain yang bukan file DEX atau library native yang ada dalam folder lib/.

Verifikasi transparansi kode hanya digunakan untuk tujuan pemeriksaan oleh developer dan pengguna akhir, yang ingin memastikan bahwa kode yang mereka jalankan cocok dengan kode yang awalnya dibuat dan ditandatangani oleh developer aplikasi.

Batasan umum

Ada situasi tertentu saat transparansi kode tidak dapat digunakan:

  • Aplikasi yang menentukan atribut sharedUserId dalam manifes. Aplikasi tersebut dapat membagikan prosesnya ke aplikasi lain, sehingga sulit untuk memastikan kode yang akan dieksekusi.
  • Aplikasi yang menggunakan anti perlindungan terhadap modifikasi tidak sah atau layanan lain yang membuat perubahan kode setelah file transparansi kode dibuat akan menyebabkan kegagalan verifikasi transparansi kode.
  • Aplikasi yang menggunakan Multidex lama pada API level di bawah 21 (Android 5.0) dan menggunakan modul fitur. Transparansi kode akan terus berfungsi saat aplikasi diinstal oleh Google Play di perangkat Android 5.0 atau yang lebih tinggi. Transparansi kode akan dinonaktifkan di OS versi lama.

Cara menambahkan transparansi kode

Sebelum dapat menambahkan transparansi kode ke aplikasi, pastikan Anda memiliki pasangan kunci pribadi dan publik yang dapat digunakan untuk penandatanganan transparansi kode. Pasangan ini harus berupa kunci unik yang berbeda dari kunci penandatanganan aplikasi yang Anda gunakan untuk Penandatanganan Aplikasi Play, dan harus disimpan dengan aman serta tidak pernah dibagikan ke luar organisasi Anda.

Jika tidak memiliki kunci, Anda dapat mengikuti petunjuk di panduan Menandatangani aplikasi untuk membuat kunci di perangkat Anda. Transparansi kode menggunakan file keystore standar, jadi proses pembuatan kunci tetap sama meskipun panduannya untuk penandatanganan aplikasi.

Menggunakan plugin Android Gradle

Dukungan transparansi kode memerlukan plugin Android Gradle versi 7.1.0-alpha03 atau yang lebih baru. Untuk mengonfigurasi kunci yang digunakan untuk penandatanganan transparansi kode, tambahkan kode berikut dalam blok 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"
            }
        }
        ...
    }
}

Kunci yang digunakan harus berupa kunci yang hanya akan Anda gunakan untuk transparansi kode, dan bukan kunci penandatanganan aplikasi yang digunakan oleh Penandatanganan Aplikasi Play.

Menggunakan bundletool di command line

Dukungan transparansi kode memerlukan bundletool versi 1.7.0 atau lebih baru, yang dapat Anda download dari GitHub.

Jalankan perintah berikut untuk menambahkan transparansi kode ke Android App Bundle. Kunci yang digunakan harus berupa kunci yang hanya akan Anda gunakan untuk transparansi kode, dan bukan kunci penandatanganan aplikasi yang digunakan oleh Penandatanganan Aplikasi Play.

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

Atau, jika ingin menggunakan alat penandatanganan sendiri, Anda dapat menggunakan bundletool untuk menghasilkan file transparansi kode yang tidak ditandatangani, lalu menandatanganinya di lingkungan terpisah, dan memasukkan tanda tangan ke dalam paket tersebut:

# 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

Memverifikasi transparansi kode aplikasi

Ada berbagai metode untuk memverifikasi kode terhadap file transparansi kode, bergantung pada apakah Anda menginstal APK di perangkat Android atau mendownload secara lokal ke komputer Anda.

Menggunakan Bundletool untuk memeriksa app bundle atau kumpulan APK

Anda dapat menggunakan bundletool untuk memverifikasi transparansi kode di app bundle atau kumpulan APK. Gunakan perintah check-transparency untuk mencetak sidik jari sertifikat publik:

# 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.

Atau, Anda dapat menentukan sertifikat publik yang diinginkan untuk memverifikasi paket atau kumpulan APK, sehingga Anda tidak perlu membandingkan hash secara manual:

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.

Menggunakan Bundletool untuk memeriksa aplikasi yang diinstal di perangkat

Untuk memeriksa aplikasi yang telah diinstal di perangkat Android, pastikan perangkat terhubung ke komputer melalui ADB lalu jalankan perintah berikut:

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.

Pemeriksaan transparansi perangkat yang terhubung juga dapat memverifikasi tanda tangan dengan kunci publik yang Anda tentukan:

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.