La signature d'application permet aux développeurs d'identifier l'auteur de l'application et de mettre à jour leur application sans créer d'interfaces et d'autorisations compliquées. Chaque application exécutée sur la plate-forme Android doit être signée par le développeur . Les applications qui tentent de s'installer sans être signées seront rejetées par Google Play ou le programme d'installation du package sur l'appareil Android.
Sur Google Play, la signature d'application établit un pont entre la confiance que Google a avec le développeur et la confiance que le développeur a avec son application. Les développeurs savent que leur application est fournie, non modifiée, à l'appareil Android ; et les développeurs peuvent être tenus responsables du comportement de leur application.
Sur Android, la signature d'application est la première étape pour placer une application dans son Application Sandbox. Le certificat d'application signé définit quel ID utilisateur est associé à quelle application ; différentes applications s'exécutent sous différents ID utilisateur. La signature d'application garantit qu'une application ne peut accéder à aucune autre application, sauf via un IPC bien défini.
Lorsqu'une application (fichier APK) est installée sur un appareil Android, le gestionnaire de packages vérifie que l'APK a été correctement signé avec le certificat inclus dans cet APK. Si le certificat (ou, plus précisément, la clé publique du certificat) correspond à la clé utilisée pour signer tout autre APK sur l'appareil, le nouvel APK a la possibilité de spécifier dans le manifeste qu'il partagera un UID avec l'autre de la même manière. -APK signés.
Les applications peuvent être signées par un tiers (OEM, opérateur, marché alternatif) ou auto-signées. Android fournit la signature de code à l'aide de certificats auto-signés que les développeurs peuvent générer sans assistance ni autorisation externes. Les demandes ne doivent pas être signées par une autorité centrale. Actuellement, Android n'effectue pas de vérification CA pour les certificats d'application.
Les applications peuvent également déclarer des autorisations de sécurité au niveau de la protection de la signature, limitant l'accès uniquement aux applications signées avec la même clé tout en conservant des UID et des sandbox d'application distincts. Une relation plus étroite avec une Application Sandbox partagée est autorisée via la fonctionnalité d'UID partagé où deux applications ou plus signées avec la même clé de développeur peuvent déclarer un UID partagé dans leur manifeste.
Schémas de signature APK
Android prend en charge trois schémas de signature d'application :
- Schéma v1 : basé sur la signature JAR
- Schéma v2 : APK Signature Scheme v2 , qui a été introduit dans Android 7.0.
- Schéma v3 : APK Signature Scheme v3 , qui a été introduit dans Android 9.
Pour une compatibilité maximale, signez les applications avec tous les schémas, d'abord avec la v1, puis la v2, puis la v3. Android 7.0+ et les appareils plus récents installent les applications signées avec les schémas v2+ plus rapidement que celles signées uniquement avec le schéma v1. Les anciennes plates-formes Android ignorent les signatures v2+ et ont donc besoin que les applications contiennent des signatures v1.
Signature JAR (schéma v1)
La signature APK fait partie d'Android depuis le début. Il est basé sur des JAR signés . Pour plus de détails sur l'utilisation de ce schéma, consultez la documentation d'Android Studio sur la signature de votre application .
Les signatures v1 ne protègent pas certaines parties de l'APK, telles que les métadonnées ZIP. Le vérificateur APK doit traiter de nombreuses structures de données non fiables (pas encore vérifiées), puis supprimer les données non couvertes par les signatures. Cela offre une surface d'attaque conséquente. De plus, le vérificateur APK doit décompresser toutes les entrées compressées, ce qui consomme plus de temps et de mémoire. Pour résoudre ces problèmes, Android 7.0 a introduit APK Signature Scheme v2.
Schéma de signature APK v2 et v3 (schéma v2+)
Les appareils exécutant Android 7.0 et versions ultérieures prennent en charge le schéma de signature APK v2 (schéma v2) et versions ultérieures. (Le schéma v2 a été mis à jour vers la v3 dans Android 9 pour inclure des informations supplémentaires dans le bloc de signature, mais fonctionne de la même manière.) Le contenu de l'APK est haché et signé, puis le bloc de signature APK résultant est inséré dans l'APK. Pour plus de détails sur l'application du schéma v2+ à une application, consultez APK Signature Scheme v2 .
Lors de la validation, le schéma v2+ traite le fichier APK comme un blob et effectue une vérification de signature sur l'ensemble du fichier. Toute modification de l'APK, y compris les modifications des métadonnées ZIP, invalide la signature APK. Cette forme de vérification APK est nettement plus rapide et permet la détection d'un plus grand nombre de classes de modifications non autorisées.
Le nouveau format est rétrocompatible, de sorte que les APK signés avec le nouveau format de signature peuvent être installés sur les anciens appareils Android (qui ignorent simplement les données supplémentaires ajoutées à l'APK), tant que ces APK sont également signés v1.
Figure 1. Processus de vérification de signature APK
Le hachage complet du fichier APK est vérifié par rapport à la signature v2+ stockée dans le bloc de signature APK. Le hachage couvre tout sauf le bloc de signature APK, qui contient la signature v2+. Toute modification de l'APK en dehors du bloc de signature APK invalide la signature v2+ de l'APK. Les APK avec une signature v2+ supprimée sont également rejetés, car leur signature v1 spécifie que l'APK a été signé v2, ce qui fait qu'Android 7.0 et les versions plus récentes refusent de vérifier les APK à l'aide de leurs signatures v1.
Pour plus de détails sur le processus de vérification de la signature APK, consultez la section Vérification du schéma de signature APK v2.