Auf Geräten mit einem Fingerabdrucksensor können Benutzer einen oder mehrere Fingerabdrücke registrieren und diese Fingerabdrücke zum Entsperren des Geräts und zum Ausführen anderer Aufgaben verwenden. Android verwendet die Fingerprint Hardware Interface Definition Language (HIDL), um eine Verbindung zu einer herstellerspezifischen Bibliothek und Fingerabdruck-Hardware (z. B. einem Fingerabdrucksensor) herzustellen.
Um die 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 Reaktion auf einen Aufruf zur authenticate
oder enroll
wartet der Fingerabdrucksensor jedoch auf eine Berührung (der Bildschirm kann auch aktiviert werden, wenn ein Benutzer den Fingerabdrucksensor berührt). Der übergeordnete Ablauf des Fingerabdruckabgleichs umfasst die folgenden Schritte:
- Der Benutzer legt einen Finger auf den Fingerabdrucksensor.
- Die herstellerspezifische Bibliothek ermittelt, ob im aktuellen Satz registrierter Fingerabdruckvorlagen eine Fingerabdruckübereinstimmung vorliegt.
- Übereinstimmungsergebnisse werden an
FingerprintService
übergeben.
Bei diesem Ablauf wird davon ausgegangen, dass bereits ein Fingerabdruck 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 Fingerabdruck-HAL interagiert mit den folgenden Komponenten.
-
BiometricManager
interagiert direkt mit einer App in einem App-Prozess. Jede App verfügt über eine Instanz vonIBiometricsFingerprint.hal
-
FingerprintService
arbeitet im Systemprozess, der die Kommunikation mit Fingerabdruck-HAL übernimmt. - Fingerprint HAL ist eine C/C++-Implementierung der IBimetricsFingerprint 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 die sichere Schlüsselspeicherung in einer sicheren Umgebung, beispielsweise der Trusted Execution Environment (TEE).
Eine herstellerspezifische HAL-Implementierung muss das von einem TEE geforderte Kommunikationsprotokoll verwenden. Rohbilder und verarbeitete Fingerabdruckmerkmale dürfen nicht im nicht vertrauenswürdigen Speicher weitergegeben werden. Alle derartigen biometrischen Daten müssen in der sicheren Hardware wie dem TEE gespeichert werden. Durch das Rooten dürfen biometrische Daten nicht beeinträchtigt werden.
FingerprintService
und fingerprintd
rufen über die Fingerprint-HAL die herstellerspezifische Bibliothek auf, um Fingerabdrücke zu registrieren und andere Vorgänge auszuführen.
Richtlinien zur Umsetzung
Die folgenden Fingerabdruck-HAL-Richtlinien sollen sicherstellen, dass Fingerabdruckdaten nicht verloren gehen 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 des TEE zugänglich sein. Wenn die Hardware ein TEE unterstützt, muss der Hardwarezugriff auf das TEE beschränkt und durch eine SELinux-Richtlinie geschützt sein. Der SPI-Kanal (Serial Peripheral Interface) darf nur für das TEE zugänglich sein und es muss eine explizite SELinux-Richtlinie für alle Gerätedateien vorhanden sein.
- Die Erfassung, Registrierung und Erkennung von Fingerabdrücken muss innerhalb des TEE erfolgen.
- Im Dateisystem kann nur die verschlüsselte Form der Fingerabdruckdaten gespeichert werden, auch 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 eine Vorlage mindestens mit dem absoluten Dateisystempfad, der Gruppe und der Finger-ID signiert sein, sodass Vorlagendateien auf einem anderen Gerät oder für andere Personen als den Benutzer, der sie 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, Fingerabdruck-Vorlagendateien verschlüsselt und im angegebenen Pfad zu speichern. Wenn dies aufgrund der TEE-Speicheranforderungen nicht möglich ist, muss der Implementierer Hooks hinzufügen, um sicherzustellen, dass die Daten entfernt werden, wenn der Benutzer entfernt wird.
Fingerabdruckmethoden
Die Fingerprint 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() | Erzeugt ein eindeutiges Token, um den Beginn einer Fingerabdruckregistrierung anzuzeigen. Stellt der enroll ein Token zur Verfügung, um sicherzustellen, dass zuvor eine Authentifizierung stattgefunden hat, beispielsweise mithilfe eines Kennworts. Um Manipulationen vorzubeugen, wird das Token verpackt, nachdem die Geräteanmeldeinformationen bestätigt wurden. Der Token muss bei der Registrierung überprüft werden, um sicherzustellen, dass er 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ückversetzt. |
enumerate() | Synchroner Aufruf zur Aufzählung aller bekannten Fingerabdruckvorlagen. |
remove() | Löscht eine Fingerabdruckvorlage. |
setActiveGroup() | Beschränkt einen HAL-Vorgang auf einen Satz von Fingerabdrücken, die zu einer angegebenen Gruppe gehören und durch eine Gruppenkennung (GID) identifiziert werden. |
authenticate() | Authentifiziert einen Fingerabdruck-bezogenen Vorgang (identifiziert durch eine Vorgangs-ID). |
setNotify() | Registriert eine Benutzerfunktion, die Benachrichtigungen von der HAL empfängt. Befindet sich die HAL-Zustandsmaschine im Besetztzustand, wird die Funktion blockiert, bis die HAL den Besetztzustand verlässt. |
postEnroll() | Beendet den Registrierungsvorgang und macht die preEnroll() generierte Herausforderung ungültig. Dies muss am Ende einer Multifinger-Registrierungssitzung aufgerufen werden, um anzugeben, dass keine weiteren Finger hinzugefügt werden dürfen. |
Weitere Einzelheiten hierzu finden Sie in den Kommentaren in IBiometricsFingerprint.hal
.