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 ni 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 par le programme d'installation du package sur l'appareil Android.
Sur Google Play, la signature d'application établit un lien entre la confiance que Google accorde au développeur et la confiance que le développeur a envers son application. Les développeurs savent que leur application est fournie, non modifiée, sur 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 candidatures 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 externe. Les candidatures ne doivent pas nécessairement être signées par une autorité centrale. Android n'effectue actuellement pas de vérification CA pour les certificats d'application.
Les applications sont également capables de déclarer des autorisations de sécurité au niveau de protection Signature, limitant l'accès uniquement aux applications signées avec la même clé tout en conservant des UID et des bacs à sable d'application distincts. Une relation plus étroite avec un bac à sable d'application partagé est autorisée à l'aide de la fonctionnalité 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 d'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 , introduit dans Android 7.0.
- Schéma v3 : APK Signature Scheme v3 , introduit dans Android 9.
Pour une compatibilité maximale, signez les applications avec tous les schémas, d'abord avec v1, puis v2, puis v3. Les appareils Android 7.0+ et 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 nécessitent donc 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 un JAR signé . 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 éliminer les données non couvertes par les signatures. Cela offre une surface d’attaque importante. 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 le schéma de signature APK 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 par ailleurs 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 Schéma de signature APK 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 de l'APK. Cette forme de vérification APK est nettement plus rapide et permet de détecter davantage 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 des appareils Android plus anciens (qui ignorent simplement les données supplémentaires ajoutées à l'APK), à condition que ces APK soient également signés v1.
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 de l'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é en v2, ce qui fait qu'Android 7.0 et les versions ultérieures 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.