Uygulama imzalama, geliştiricilerin uygulamanın yazarını tanımlamasına ve karmaşık arayüzler ve izinler oluşturmadan uygulamalarını güncellemesine olanak tanır. Android platformunda çalıştırılan her uygulama geliştirici tarafından imzalanmalıdır. İmzalanmadan yüklenmeye çalışılan uygulamalar Google Play veya Android cihazdaki paket yükleyici tarafından reddedilir.
Google Play'de uygulama imzalama, Google'ın geliştiriciyle olan güveni ve geliştiricinin güvenini kazanma konusunda köprü görevi görür. Geliştiriciler, uygulamalarının değiştirilmeden Android cihaza sağlandığını bilirler ve geliştiriciler, uygulamalarının davranışlarından sorumlu tutulabilirler.
Android'de uygulama imzalama, bir uygulamayı uygulama korumalı alanına yerleştirmenin ilk adımıdır. İmzalı uygulama sertifikası, hangi kullanıcı kimliğinin hangi uygulamayla ilişkilendirildiğini tanımlar. Farklı uygulamalar farklı kullanıcı kimlikleri altında çalışır. Uygulama imzalama, bir uygulamanın iyi tanımlanmış IPC dışında başka bir uygulamaya erişememesini sağlar.
Bir Android cihaza uygulama (APK dosyası) yüklendiğinde, Paket Yöneticisi APK'nın söz konusu APK'da bulunan sertifikayla düzgün şekilde imzalandığını doğrular. Sertifika (veya daha doğrusu sertifikadaki ortak anahtar) cihazdaki diğer APK'ları imzalamak için kullanılan anahtarla eşleşiyorsa yeni APK, manifest dosyasında benzer şekilde imzalanmış diğer APK'larla UID paylaştığını belirtebilir.
Uygulamalar üçüncü taraflarca (OEM, operatör, alternatif pazar) veya kendi kendine imzalanabilir. Android, geliştiricilerin harici yardım veya izin almadan oluşturabileceği kendinden imzalı sertifikalar kullanarak kod imzalama olanağı sunar. Uygulamaların merkezi bir yetkili tarafından imzalanması gerekmez. Android şu anda uygulama sertifikaları için CA doğrulaması gerçekleştirmiyor.
Uygulamalar, güvenlik izinlerini İmza koruması düzeyinde de belirtebilir. Böylece, farklı UID'ler ve Uygulama Özel Korumalı Alanları korurken erişimi yalnızca aynı anahtarla imzalanan uygulamalarla kısıtlayabilir. Aynı geliştirici anahtarıyla imzalanan iki veya daha fazla uygulamanın manifest dosyalarında ortak bir UID beyan edebileceği ortak UID özelliği kullanılarak ortak bir uygulama korumalı alanıyla daha yakın bir ilişki kurulmasına izin verilir.
APK imzalama şemaları
Android üç uygulama imzalama şemasını destekler:
- v1 şeması: JAR imzalamaya dayalı
- v2 şeması: Android 7.0'da kullanıma sunulan APK İmza Şeması v2.
- v3 şeması: Android 9'da kullanıma sunulan APK İmza Şeması v3.
Maksimum uyumluluk için uygulamaları tüm şemalarla (önce v1, ardından v2 ve v3) imzalayın. Android 7.0 ve sonraki sürümlerin yüklü olduğu cihazlar, v2 ve sonraki şemalarla imzalanan uygulamaları yalnızca v1 şemalarıyla imzalanan uygulamalardan daha hızlı yükler. Eski Android platformları v2 ve üstü imzaları yoksayar ve bu nedenle uygulamaların v1 imzaları içermesi gerekir.
JAR imzalama (v1 şeması)
APK imzalama, başından beri Android'in bir parçasıydı. Signed JAR'ı temel alır. Bu şemayı kullanmayla ilgili ayrıntılar için Uygulamanızı imzalama ile ilgili Android Studio dokümanlarına bakın.
1. sürüm imzalar, APK'nın ZIP meta verileri gibi bazı bölümlerini korumaz. APK doğrulayıcının çok sayıda güvenilmeyen (henüz doğrulanmamış) veri yapısını işlemesi ve ardından imzaların kapsamadığı verileri silmesi gerekir. Bu, oldukça boyutlu bir saldırı yüzeyi sağlar. Ayrıca APK doğrulayıcı, sıkıştırılmış tüm girişleri açmak zorundadır. Bu işlem daha fazla zaman ve bellek tüketir. Bu sorunları gidermek için Android 7.0'da APK İmza Şeması v2 kullanıma sunulmuştur.
APK imza şeması v2 ve v3 (v2+ şeması)
Android 7.0 ve sonraki sürümleri çalıştıran cihazlar APK imza şeması v2'yi (v2 şeması) ve sonraki sürümleri destekler. (v2 şeması, imzalama bloğuna ek bilgiler eklemek için Android 9'da v3 olarak güncellendi ancak diğer açılardan aynı şekilde çalışır.) APK'nın içeriği karma oluşturma işlemine tabi tutulur ve imzalanır. Ardından, ortaya çıkan APK imzalama bloğu APK'ya eklenir. Bir uygulamaya v2 ve sonraki sürümlerin şemasını uygulama hakkında ayrıntılı bilgi edinmek için APK İmza Şeması v2 başlıklı makaleyi inceleyin.
Doğrulama sırasında v2 ve sonraki şemalarda APK dosyası bir blob olarak değerlendirilir ve dosyanın tamamında imza kontrolü gerçekleştirilir. ZIP meta veri değişiklikleri de dahil olmak üzere APK'da yapılan herhangi bir değişiklik, APK imzasını geçersiz kılar. Bu APK doğrulama şekli önemli ölçüde daha hızlıdır ve daha fazla sayıda yetkisiz değişiklik sınıfının tespit edilmesini sağlar.
Yeni biçim geriye dönük uyumludur. Bu nedenle, yeni imza biçimiyle imzalanan APK'lar, v1 imzalı oldukları sürece eski Android cihazlara (APK'ya eklenen ek verileri yok sayan) yüklenebilir.
APK'nın tüm dosya karması, APK imzalama bloğunda depolanan v2 ve sonraki sürüm imzalarıyla doğrulanır. Karma oluşturma işlemi, v2 ve sonraki sürümlerin imzasını içeren APK imzalama bloğu dışındaki her şeyi kapsar. APK'da APK imzalama bloğunun dışında yapılacak herhangi bir değişiklik, APK'nın v2+ imzasını geçersiz kılar. V2 ve sonraki sürümlerin imzaları kaldırılmış APK'lar da reddedilir. Bunun nedeni, v1 imzaları APK'nın v2 ile imzalandığını belirtmesidir. Bu da Android 7.0 ve sonraki sürümlerin APK'ları v1 imzalarını kullanarak doğrulamasını reddetmesine neden olur.
APK imza doğrulama işlemiyle ilgili ayrıntılar için APK İmza Şeması v2'nin Doğrulama bölümüne bakın.