Mit der App-Signatur können Entwickler den Autor der App identifizieren und ihre App aktualisieren, ohne komplizierte Benutzeroberflächen und Berechtigungen erstellen zu müssen. Jede App, die auf der Android-Plattform ausgeführt wird, muss vom Entwickler signiert sein. Apps, die ohne Signatur installiert werden sollen, werden entweder von Google Play oder vom Paketinstallationsprogramm auf dem Android-Gerät abgelehnt.
Bei Google Play stellt die App-Signatur eine Brücke zwischen dem Vertrauen von Google in den Entwickler und dem Vertrauen des Entwicklers in seine App dar. Entwickler wissen, dass ihre App unverändert auf dem Android-Gerät bereitgestellt wird. Außerdem können Entwickler für das Verhalten ihrer App zur Verantwortung gezogen werden.
Unter Android ist die App-Signatur der erste Schritt, um eine App in die Anwendungs-Sandbox zu verschieben. Im signierten App-Zertifikat wird festgelegt, welche Nutzer-ID mit welcher App verknüpft ist. Unterschiedliche Apps werden unter verschiedenen Nutzer-IDs ausgeführt. Durch die App-Signatur wird sichergestellt, dass eine App nur über eine klar definierte IPC auf eine andere App zugreifen kann.
Wenn eine App (APK-Datei) auf einem Android-Gerät installiert wird, prüft der Paketmanager, ob das APK mit dem darin enthaltenen Zertifikat ordnungsgemäß signiert wurde. Wenn das Zertifikat (oder genauer gesagt der öffentliche Schlüssel im Zertifikat) mit dem Schlüssel übereinstimmt, der zum Signieren eines anderen APKs auf dem Gerät verwendet wurde, kann im Manifest des neuen APKs angegeben werden, dass es dieselbe UID wie die anderen ähnlich signierten APKs hat.
Apps können von einem Drittanbieter (OEM, Mobilfunkanbieter, alternativer Markt) signiert oder selbst signiert sein. Android bietet die Codesignatur mit selbstsignierten Zertifikaten, die Entwickler ohne externe Unterstützung oder Berechtigung generieren können. Apps müssen nicht von einer zentralen Zertifizierungsstelle signiert werden. Android führt derzeit keine CA-Überprüfung für App-Zertifikate durch.
Apps können auch Sicherheitsberechtigungen auf Signaturschutzebene deklarieren, um den Zugriff nur auf Apps zu beschränken, die mit demselben Schlüssel signiert sind, und dabei eindeutige UIDs und Anwendungs-Sandboxes beizubehalten. Mit der Funktion für die gemeinsame UID ist eine engere Beziehung zu einer freigegebenen Anwendungs-Sandbox zulässig. Dabei können zwei oder mehr Apps, die mit demselben Entwicklerschlüssel signiert sind, in ihrem Manifest eine gemeinsame UID deklarieren.
APK-Signaturschemata
Android unterstützt drei App-Signaturschemata:
- V1-Schema: basiert auf JAR-Signatur
- V2-Schema: APK-Signaturschema v2, das mit Android 7.0 eingeführt wurde.
- Version 3-Schema: APK-Signaturschema Version 3, das in Android 9 eingeführt wurde.
Für maximale Kompatibilität sollten Sie Apps mit allen Schemas signieren, zuerst mit v1, dann mit v2 und dann mit v3. Auf Geräten mit Android 7.0 und höher werden Apps, die mit Version 2 oder höher signiert sind, schneller installiert als solche, die nur mit Version 1 signiert sind. Ältere Android-Plattformen ignorieren Signaturen der Version 2 und höher. Daher müssen Apps V1-Signaturen enthalten.
JAR-Signatur (V1-Schema)
Die APK-Signatur ist seit Beginn von Android Teil des Betriebssystems. Es basiert auf einer signierten JAR-Datei. Weitere Informationen zur Verwendung dieses Schemas finden Sie in der Android Studio-Dokumentation unter App signieren.
V1-Signaturen schützen einige Teile des APK nicht, z. B. ZIP-Metadaten. Der APK-Verifier muss viele nicht vertrauenswürdige (noch nicht verifizierte) Datenstrukturen verarbeiten und dann Daten verwerfen, die nicht von den Signaturen abgedeckt sind. Das bietet eine beträchtliche Angriffsfläche. Außerdem muss der APK-Verifier alle komprimierten Einträge dekomprimieren, was mehr Zeit und Speicherplatz beansprucht. Um diese Probleme zu beheben, wurde mit Android 7.0 das APK-Signaturschema v2 eingeführt.
APK-Signaturschema v2 und v3 (v2+-Schema)
Geräte mit Android 7.0 und höher unterstützen das APK-Signaturschema 2 (v2-Schema) und höher. Das V2-Schema wurde in Android 9 auf V3 aktualisiert, um zusätzliche Informationen in den Signaturblock aufzunehmen. Ansonsten funktioniert es aber genauso. Der Inhalt des APK wird gehasht und signiert. Anschließend wird der resultierende APK-Signaturblock in das APK eingefügt. Weitere Informationen zum Anwenden des V2-Schemas auf eine App finden Sie unter APK-Signaturschema V2.
Bei der Validierung wird die APK-Datei gemäß dem V2- oder höheren Schema als Blob behandelt und die Signatur wird für die gesamte Datei geprüft. Jegliche Änderung am APK, einschließlich Änderungen an ZIP-Metadaten, macht die APK-Signatur ungültig. Diese Art der APK-Überprüfung ist wesentlich schneller und ermöglicht die Erkennung von mehr Klassen nicht autorisierter Änderungen.
Das neue Format ist abwärtskompatibel. APKs, die mit dem neuen Signaturformat signiert sind, können also auf älteren Android-Geräten installiert werden, auf denen die zusätzlichen Daten einfach ignoriert werden. Voraussetzung ist, dass diese APKs auch mit der Version 1 signiert sind.
Abbildung 1: Überprüfung der APK-Signatur
Der Hashwert der gesamten Datei des APK wird anhand der im APK-Signaturblock gespeicherten Signatur der Version 2 oder höher überprüft. Der Hash umfasst alles außer dem APK-Signaturblock, der die Signatur der Version 2 und höher enthält. Jede Änderung am APK außerhalb des APK-Signaturblocks macht die V2- oder höher-Signatur des APK ungültig. APKs mit entfernter V2- oder höher-Signatur werden ebenfalls abgelehnt, da ihre V1-Signatur angibt, dass das APK mit einer V2-Signatur signiert wurde. Unter Android 7.0 und höher werden APKs daher nicht mit ihren V1-Signaturen überprüft.
Weitere Informationen zur Überprüfung der APK-Signatur finden Sie im Abschnitt „Überprüfung“ des APK-Signaturschemas v2.