Auf Geräten mit einem Fingerabdrucksensor können Benutzer einen oder mehrere Fingerabdrücke registrieren und diese Fingerabdrücke verwenden, um das Gerät zu entsperren und andere Aufgaben auszuführen. Android verwendet die Fingerprint Hardware Interface Definition Language (HIDL), um eine Verbindung zu einer herstellerspezifischen Bibliothek und Fingerabdruckhardware (z. B. einem Fingerabdrucksensor) herzustellen.
Um das Fingerabdruck-HIDL zu implementieren, müssen Sie IBiometricsFingerprint.hal
in einer herstellerspezifischen Bibliothek implementieren.
Fingerabdruckabgleich
Der Fingerabdrucksensor eines Geräts ist im Allgemeinen im Leerlauf. Als Antwort auf einen Aufruf zur authenticate
oder enroll
der Fingerabdrucksensor jedoch auf eine Berührung (der Bildschirm wird möglicherweise auch aktiviert, wenn ein Benutzer den Fingerabdrucksensor berührt). Der allgemeine Ablauf des Fingerabdruckabgleichs umfasst die folgenden Schritte:
- Der Benutzer legt einen Finger auf den Fingerabdrucksensor.
- Die herstellerspezifische Bibliothek bestimmt, ob es im aktuellen Satz registrierter Fingerabdruckvorlagen eine Fingerabdruckübereinstimmung gibt.
- Übereinstimmungsergebnisse werden an
FingerprintService
übergeben.
Dieser Ablauf geht davon aus, dass ein Fingerabdruck bereits auf dem Gerät registriert wurde, d. h. die herstellerspezifische Bibliothek hat eine Vorlage für den Fingerabdruck registriert. Weitere Einzelheiten finden Sie unter Authentifizierung .
Die Architektur
Der Fingerprint HAL interagiert mit den folgenden Komponenten.
-
BiometricManager
interagiert direkt mit einer App in einem App-Prozess. Jede App hat eine Instanz vonIBiometricsFingerprint.hal
-
FingerprintService
arbeitet im Systemprozess, der die Kommunikation mit Fingerabdruck-HAL abwickelt. - Fingerprint HAL ist eine C/C++-Implementierung der IBiometricsFingerprint HIDL-Schnittstelle. Diese enthält die herstellerspezifische Bibliothek, die mit der gerätespezifischen Hardware kommuniziert.
- Keystore- API- und Keymaster -Komponenten bieten hardwaregestützte Kryptografie für sichere Schlüsselspeicherung in einer sicheren Umgebung, wie z. B. der Trusted Execution Environment (TEE).

Eine herstellerspezifische HAL-Implementierung muss das von einem TEE geforderte Kommunikationsprotokoll verwenden. Rohbilder und verarbeitete Fingerabdruckmerkmale dürfen nicht in nicht vertrauenswürdigem Speicher weitergegeben werden. Alle diese biometrischen Daten müssen in sicherer Hardware wie dem TEE gespeichert werden. Das Rooten darf biometrische Daten nicht kompromittieren können.
FingerprintService
und fingerprintd
rufen über die Fingerprint-HAL die herstellerspezifische Bibliothek auf, um Fingerabdrücke zu registrieren und andere Vorgänge auszuführen.

Umsetzungsrichtlinien
Die folgenden HAL-Richtlinien für Fingerabdrücke sollen sicherstellen, dass Fingerabdruckdaten nicht durchsickern und entfernt werden, wenn ein Benutzer von einem Gerät entfernt wird:
- Rohe Fingerabdruckdaten oder Derivate (z. B. Vorlagen) dürfen niemals von außerhalb des Sensortreibers oder TEE zugänglich sein. Wenn die Hardware einen TEE unterstützt, muss der Hardwarezugriff auf den TEE beschränkt und durch eine SELinux-Richtlinie geschützt werden. Der Serial Peripheral Interface (SPI)-Kanal darf nur für das TEE zugänglich sein, und es muss eine explizite SELinux-Richtlinie für alle Gerätedateien geben.
- Erfassung, Registrierung und Erkennung von Fingerabdrücken müssen innerhalb des TEE erfolgen.
- Auf dem Dateisystem kann nur die verschlüsselte Form der Fingerabdruckdaten gespeichert werden, selbst wenn das Dateisystem selbst verschlüsselt ist.
- Fingerabdruckvorlagen müssen mit einem privaten, gerätespezifischen Schlüssel signiert werden. Für Advanced Encryption Standard (AES) muss mindestens eine Vorlage mit dem absoluten Dateisystempfad, der Gruppe und der Finger-ID signiert werden, sodass Vorlagendateien auf einem anderen Gerät oder für andere Personen als den Benutzer, der sie auf dem registriert hat, nicht funktionsfähig sind gleiches Gerät. Beispielsweise darf das Kopieren von Fingerabdruckdaten eines anderen Benutzers auf demselben Gerät oder von einem anderen Gerät nicht funktionieren.
- Implementierungen müssen entweder den von der Funktion
setActiveGroup()
bereitgestellten Dateisystempfad verwenden oder eine Möglichkeit bieten, alle Benutzervorlagendaten zu löschen, wenn der Benutzer entfernt wird. Es wird dringend empfohlen, Fingerabdruckvorlagendateien verschlüsselt und im angegebenen Pfad zu speichern. Wenn dies aufgrund von TEE-Speicheranforderungen nicht möglich ist, muss der Implementierer Hooks hinzufügen, um sicherzustellen, dass die Daten entfernt werden, wenn der Benutzer entfernt wird.
Fingerabdruck-Methoden
Die Fingerabdruck-HIDL-Schnittstelle enthält die folgenden Hauptmethoden in IBiometricsFingerprint.hal
.
Methode | Beschreibung |
---|---|
enroll() | Schaltet die HAL-Zustandsmaschine um, um die Erfassung und Speicherung einer Fingerabdruckvorlage zu starten. Wenn die Registrierung abgeschlossen ist oder nach einer Zeitüberschreitung, kehrt die HAL-Zustandsmaschine in den Ruhezustand zurück. |
preEnroll() | Generiert ein eindeutiges Token, um den Beginn einer Fingerabdruckregistrierung anzuzeigen. Stellt der Registrierungsfunktion ein Token enroll , um sicherzustellen, dass eine vorherige Authentifizierung stattgefunden hat, z. B. mithilfe eines Kennworts. Um Manipulationen zu verhindern, wird das Token verpackt, nachdem die Geräteanmeldeinformationen bestätigt wurden. Das Token muss während der Registrierung überprüft werden, um sicherzustellen, dass es noch gültig ist. |
getAuthenticatorId() | Gibt ein Token zurück, das dem aktuellen Fingerabdrucksatz zugeordnet ist. |
cancel() | Bricht ausstehende Registrierungs- oder Authentifizierungsvorgänge ab. Die HAL-Zustandsmaschine wird in den Ruhezustand zurückgebracht. |
enumerate() | Synchroner Aufruf zum Aufzählen aller bekannten Fingerprint-Templates. |
remove() | Löscht eine Fingerabdruckvorlage. |
setActiveGroup() | Schränkt einen HAL-Vorgang auf einen Satz von Fingerabdrücken ein, die zu einer bestimmten Gruppe gehören, die durch eine Gruppenkennung (GID) identifiziert wird. |
authenticate() | Authentifiziert einen Fingerabdruck-bezogenen Vorgang (identifiziert durch eine Vorgangs-ID). |
setNotify() | Registriert eine Benutzerfunktion, die Benachrichtigungen von der HAL empfängt. Wenn sich die HAL-Zustandsmaschine in einem Belegtzustand befindet, wird die Funktion blockiert, bis die HAL den Belegtzustand verlässt. |
postEnroll() | Beendet den Registrierungsvorgang und macht die von preEnroll() generierte Abfrage ungültig. Dies muss am Ende einer Registrierungssitzung mit mehreren Fingern aufgerufen werden, um anzuzeigen, dass keine weiteren Finger hinzugefügt werden können. |
Weitere Einzelheiten dazu finden Sie in den Kommentaren in IBiometricsFingerprint.hal
.