Penandatanganan aplikasi memungkinkan developer mengidentifikasi penulis aplikasi dan mengupdate aplikasi mereka tanpa membuat antarmuka dan izin yang rumit. Setiap aplikasi yang dijalankan di platform Android harus ditandatangani oleh developer. Aplikasi yang mencoba menginstal tanpa ditandatangani ditolak oleh Google Play atau penginstal paket di perangkat Android.
Di Google Play, penandatanganan aplikasi menjembatani kepercayaan yang dimiliki Google dengan developer dan kepercayaan yang dimiliki developer terhadap aplikasi mereka. Developer mengetahui bahwa aplikasi diberikan, tidak dimodifikasi, ke perangkat Android; dan developer dapat dimintai pertanggungjawaban atas perilaku aplikasi mereka.
Di Android, penandatanganan aplikasi adalah langkah pertama untuk menempatkan aplikasi di Sandbox Aplikasinya. Sertifikat aplikasi yang ditandatangani menentukan ID pengguna yang terkait dengan aplikasi mana; aplikasi yang berbeda berjalan di bawah ID pengguna yang berbeda. Penandatanganan aplikasi memastikan satu aplikasi tidak dapat mengakses aplikasi lain kecuali melalui IPC yang didefinisikan dengan baik.
Saat aplikasi (file APK) diinstal ke perangkat Android, Pengelola Paket akan memverifikasi bahwa APK telah ditandatangani dengan benar dengan sertifikat yang disertakan dalam APK tersebut. Jika sertifikat (atau, lebih tepatnya, kunci publik dalam sertifikat) cocok dengan kunci yang digunakan untuk menandatangani APK lain di perangkat, APK baru memiliki opsi untuk menentukan dalam manifes bahwa APK tersebut memiliki UID yang sama dengan APK lain yang ditandatangani dengan cara yang sama.
Aplikasi dapat ditandatangani oleh pihak ketiga (OEM, operator, pasar alternatif) atau ditandatangani sendiri. Android menyediakan penandatanganan kode menggunakan sertifikat dengan tanda tangan sendiri yang dapat dibuat developer tanpa bantuan atau izin eksternal. Aplikasi tidak harus ditandatangani oleh otoritas pusat. Android saat ini tidak melakukan verifikasi CA untuk sertifikat aplikasi.
Aplikasi juga dapat mendeklarasikan izin keamanan di tingkat perlindungan Tanda Tangan, yang membatasi akses hanya ke aplikasi yang ditandatangani dengan kunci yang sama, sekaligus mempertahankan UID dan Sandbox Aplikasi yang berbeda. Hubungan yang lebih dekat dengan Sandbox Aplikasi bersama diizinkan menggunakan fitur UID bersama dengan dua aplikasi atau lebih yang ditandatangani dengan kunci developer yang sama dapat mendeklarasikan UID bersama dalam manifesnya.
Skema penandatanganan APK
Android mendukung tiga skema penandatanganan aplikasi:
- Skema v1: berdasarkan penandatanganan JAR
- Skema v2: APK Signature Scheme v2, yang diperkenalkan di Android 7.0.
- Skema v3: APK Signature Scheme v3, yang diperkenalkan di Android 9.
Untuk kompatibilitas maksimum, tanda tangani aplikasi dengan semua skema, pertama dengan v1, lalu v2, lalu v3. Perangkat Android 7.0+ dan yang lebih baru menginstal aplikasi yang ditandatangani dengan skema v2+ lebih cepat daripada aplikasi yang hanya ditandatangani dengan skema v1. Platform Android lama mengabaikan tanda tangan v2+ sehingga memerlukan aplikasi untuk berisi tanda tangan v1.
Penandatanganan JAR (skema v1)
Penandatanganan APK telah menjadi bagian dari Android sejak awal. Hal ini didasarkan pada JAR yang ditandatangani. Untuk detail tentang penggunaan skema ini, lihat dokumentasi Android Studio tentang Menandatangani aplikasi.
Tanda tangan v1 tidak melindungi beberapa bagian APK, seperti metadata ZIP. Pengverifikasi APK perlu memproses banyak struktur data yang tidak tepercaya (belum diverifikasi), lalu menghapus data yang tidak tercakup dalam tanda tangan. Hal ini menawarkan permukaan serangan yang cukup besar. Selain itu, verifier APK harus mengekstrak semua entri yang dikompresi, sehingga menghabiskan lebih banyak waktu dan memori. Untuk mengatasi masalah ini, Android 7.0 memperkenalkan APK Signature Scheme v2.
Skema tanda tangan APK v2 dan v3 (skema v2+)
Perangkat yang menjalankan Android 7.0 dan yang lebih baru mendukung APK signature scheme v2 (skema v2) dan yang lebih baru. (Skema v2 diperbarui ke v3 di Android 9 untuk menyertakan informasi tambahan dalam blok penandatanganan, tetapi cara kerjanya tetap sama.) Konten APK di-hash dan ditandatangani, lalu blok penandatanganan APK yang dihasilkan dimasukkan ke dalam APK. Untuk mengetahui detail tentang cara menerapkan skema v2+ ke aplikasi, lihat APK Signature Scheme v2.
Selama validasi, skema v2+ memperlakukan file APK sebagai blob dan melakukan pemeriksaan tanda tangan di seluruh file. Setiap modifikasi pada APK, termasuk modifikasi metadata ZIP, akan membatalkan tanda tangan APK. Bentuk verifikasi APK ini jauh lebih cepat dan memungkinkan deteksi lebih banyak kelas modifikasi yang tidak sah.
Format baru ini kompatibel dengan versi lama, sehingga APK yang ditandatangani dengan format tanda tangan baru dapat diinstal di perangkat Android lama (yang hanya mengabaikan data tambahan yang ditambahkan ke APK), selama APK ini juga ditandatangani v1.
Hash seluruh file APK diverifikasi dengan tanda tangan v2+ yang disimpan di blok penandatanganan APK. Hash mencakup semuanya kecuali blok penandatanganan APK, yang berisi tanda tangan v2+. Setiap modifikasi pada APK di luar blok penandatanganan APK akan membatalkan tanda tangan v2+ APK. APK dengan tanda tangan v2+ yang dihapus juga ditolak, karena tanda tangan v1-nya menentukan bahwa APK ditandatangani v2, yang membuat Android 7.0 dan yang lebih baru menolak untuk memverifikasi APK menggunakan tanda tangan v1-nya.
Untuk mengetahui detail tentang proses verifikasi tanda tangan APK, lihat bagian Verifikasi APK Signature Scheme v2.