Durch die Anwendungssignatur können Entwickler den Autor der Anwendung identifizieren und ihre Anwendung aktualisieren, ohne komplizierte Schnittstellen und Berechtigungen zu erstellen. Jede Anwendung, die auf der Android-Plattform ausgeführt wird, muss vom Entwickler signiert werden. Anwendungen, die versuchen, ohne Signatur zu installieren, werden entweder von Google Play oder dem Paketinstallationsprogramm auf dem Android-Gerät abgelehnt.
Bei Google Play überbrückt die Anwendungssignatur das Vertrauen, das Google gegenüber dem Entwickler hat, und das Vertrauen, das der Entwickler gegenüber seiner Anwendung hat. Entwickler wissen, dass ihre Anwendung unverändert auf dem Android-Gerät bereitgestellt wird. und Entwickler können für das Verhalten ihrer Anwendung zur Verantwortung gezogen werden.
Unter Android ist das Signieren von Anwendungen der erste Schritt zum Platzieren einer Anwendung in der Anwendungssandbox. Das signierte Anwendungszertifikat definiert, welche Benutzer-ID welcher Anwendung zugeordnet ist; Verschiedene Anwendungen laufen unter unterschiedlichen Benutzer-IDs. Durch die Anwendungssignatur wird sichergestellt, dass eine Anwendung nur über einen genau definierten IPC auf eine andere Anwendung zugreifen kann.
Wenn eine Anwendung (APK-Datei) auf einem Android-Gerät installiert wird, überprüft der Paketmanager, ob die APK ordnungsgemäß mit dem in dieser APK enthaltenen Zertifikat signiert wurde. Wenn das Zertifikat (oder genauer gesagt der öffentliche Schlüssel im Zertifikat) mit dem Schlüssel übereinstimmt, der zum Signieren eines anderen APK auf dem Gerät verwendet wird, hat das neue APK die Möglichkeit, im Manifest anzugeben, dass es auf ähnliche Weise eine UID mit dem anderen teilen wird -signierte APKs.
Anträge können von einem Dritten (OEM, Betreiber, alternativer Markt) oder selbst unterzeichnet werden. Android bietet Code-Signierung mithilfe selbstsignierter Zertifikate, die Entwickler ohne externe Hilfe oder Erlaubnis generieren können. Anträge müssen nicht von einer zentralen Behörde unterzeichnet werden. Android führt derzeit keine CA-Überprüfung für Anwendungszertifikate durch.
Anwendungen können auch Sicherheitsberechtigungen auf der Signaturschutzebene deklarieren und so den Zugriff nur auf Anwendungen beschränken, die mit demselben Schlüssel signiert sind, während unterschiedliche UIDs und Anwendungssandboxen beibehalten werden. Eine engere Beziehung zu einer gemeinsam genutzten Anwendungs-Sandbox ist mithilfe der Funktion „Freigegebene UID“ möglich, bei der zwei oder mehr mit demselben Entwicklerschlüssel signierte Anwendungen eine gemeinsame UID in ihrem Manifest deklarieren können.
APK-Signaturschemata
Android unterstützt drei Anwendungssignaturschemata:
- v1-Schema: basierend auf JAR-Signierung
- v2-Schema: APK Signature Scheme v2 , das in Android 7.0 eingeführt wurde.
- v3-Schema: APK Signature Scheme v3 , das in Android 9 eingeführt wurde.
Für maximale Kompatibilität signieren Sie Anwendungen mit allen Schemata, zuerst mit v1, dann mit v2 und dann mit v3. Android 7.0+ und neuere Geräte installieren Apps, die mit v2+-Schemata signiert sind, schneller als solche, die nur mit v1-Schema signiert sind. Ältere Android-Plattformen ignorieren v2+-Signaturen und benötigen daher Apps, die v1-Signaturen enthalten.
JAR-Signierung (v1-Schema)
Die APK-Signierung war von Anfang an ein Teil von Android. Es basiert auf signiertem JAR . Einzelheiten zur Verwendung dieses Schemas finden Sie in der Android Studio-Dokumentation zum Signieren Ihrer App .
v1-Signaturen schützen einige Teile des APK nicht, wie z. B. ZIP-Metadaten. Der APK-Verifizierer muss viele nicht vertrauenswürdige (noch nicht verifizierte) Datenstrukturen verarbeiten und dann Daten verwerfen, die nicht von den Signaturen abgedeckt werden. Dies bietet eine große Angriffsfläche. Darüber hinaus muss der APK-Verifizierer alle komprimierten Einträge dekomprimieren, was mehr Zeit und Speicher verbraucht. Um diese Probleme zu beheben, wurde mit Android 7.0 das APK Signature Scheme v2 eingeführt.
APK-Signaturschema v2 und v3 (v2+-Schema)
Geräte mit Android 7.0 und höher unterstützen das APK-Signaturschema v2 (v2-Schema) und höher. (Das v2-Schema wurde in Android 9 auf v3 aktualisiert, um zusätzliche Informationen in den Signaturblock aufzunehmen, funktioniert aber ansonsten gleich.) Der Inhalt des APK wird gehasht und signiert, dann wird der resultierende APK-Signaturblock in das APK eingefügt. Einzelheiten zum Anwenden des v2+-Schemas auf eine App finden Sie unter APK Signature Scheme v2 .
Während der Validierung behandelt das v2+-Schema die APK-Datei als Blob und führt eine Signaturprüfung für die gesamte Datei durch. Jede Änderung an der APK, einschließlich ZIP-Metadatenänderungen, macht die APK-Signatur ungültig. Diese Form der APK-Überprüfung ist wesentlich schneller und ermöglicht die Erkennung weiterer Klassen nicht autorisierter Änderungen.
Das neue Format ist abwärtskompatibel, sodass mit dem neuen Signaturformat signierte APKs auf älteren Android-Geräten installiert werden können (die die zusätzlichen, dem APK hinzugefügten Daten einfach ignorieren), sofern diese APKs ebenfalls v1-signiert sind.
Der gesamte Datei-Hash des APK wird anhand der im APK-Signaturblock gespeicherten v2+-Signatur überprüft. Der Hash deckt alles ab, außer dem APK-Signaturblock, der die v2+-Signatur enthält. Jede Änderung an der APK außerhalb des APK-Signaturblocks macht die v2+-Signatur der APK ungültig. APKs mit entfernter v2+-Signatur werden ebenfalls abgelehnt, da ihre v1-Signatur angibt, dass das APK v2-signiert war, was dazu führt, dass Android 7.0 und neuere Versionen die Überprüfung von APKs mit ihren v1-Signaturen verweigern.
Einzelheiten zum APK-Signaturüberprüfungsprozess finden Sie im Abschnitt „Überprüfung“ von APK Signature Scheme v2.