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ışan 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ştiriciye ve geliştiricinin de uygulamasına duyduğu güveni birbirine bağlar. Geliştiriciler, uygulamalarının Android cihaza değiştirilmeden sağlandığını bilir ve uygulamalarının davranışından sorumlu tutulabilir.
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şkili olduğunu 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 uygulama (APK dosyası) Android cihaza yüklendiğinde Paket Yöneticisi, APK'nın APK'ya dahil edilen sertifikayla düzgün bir ş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 sonraki sürümlerin imzalarını yoksayar. Bu nedenle, uygulamaların v1 imzaları içermesi gerekir.
JAR imzalama (v1 şeması)
APK imzalama, Android'in başlangıcından beri bir parçasıdır. Signed JAR'ı temel alır. Bu şemayı kullanmayla ilgili ayrıntılar için Uygulamanızı imzalama başlıklı 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, güvenilmeyen (henüz doğrulanmamış) birçok veri yapısını işlemesi ve ardından imzalar tarafından kapsanmayan verileri atması gerekir. Bu, önemli bir saldırı yüzeyi sunar. 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 dahil olmak üzere APK'da yapılan tüm değişiklikler APK imzasını geçersiz kılar. Bu APK doğrulama şekli çok 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 ile de imzalanmış oldukları sürece eski Android cihazlara (APK'ya eklenen ek verileri yoksayarlar) yüklenebilir.
Şekil 1. APK imza doğrulama süreci
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ılan herhangi bir değişiklik, APK'nın v2 ve sonraki sürümlerdeki 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 süreciyle ilgili ayrıntılar için APK İmza Şeması v2'nin Doğrulama bölümüne bakın.