Ein Android-Tutorial zur Fingerabdruck-Authentifizierung

Die Fingerabdruck-Authentifizierung nutzt den in vielen Android-Geräten eingebauten Berührungssensor, um den Benutzer zu identifizieren und den Zugriff sowohl auf das Gerät als auch auf Anwendungsfunktionen wie In-App-Zahlungsoptionen zu ermöglichen. Die Implementierung der Fingerabdruck-Authentifizierung ist ein mehrstufiger Prozess, der auf den ersten Blick überwältigend erscheinen kann. Wenn man ihn jedoch in einzelne Schritte zerlegt, wird der Prozess viel weniger komplex. Grundsätzlich handelt es sich bei der Fingerabdruckauthentifizierung in erster Linie um eine Verschlüsselung mit einem Schlüssel, einer Chiffre zur Durchführung der Verschlüsselung und einem Fingerabdruckmanager zur Abwicklung des Authentifizierungsprozesses.

Dieses Kapitel bietet sowohl einen Überblick über die Fingerabdruckauthentifizierung als auch ein detailliertes, schrittweises Tutorial, das einen praktischen Ansatz für die Implementierung demonstriert.

Inhalt

Ein Überblick über die Fingerabdruck-Authentifizierung

Es gibt im Wesentlichen 10 Schritte zur Implementierung der Fingerabdruck-Authentifizierung innerhalb einer Android-App. Diese Schritte lassen sich wie folgt zusammenfassen:

1. Beantragen Sie die Berechtigung zur Fingerabdruck-Authentifizierung in der Projekt-Manifest-Datei.

2. Stellen Sie sicher, dass der Sperrbildschirm des Geräts, auf dem die App ausgeführt wird, durch eine PIN, ein Muster oder ein Kennwort geschützt ist (Fingerabdrücke können nur auf Geräten registriert werden, auf denen der Sperrbildschirm gesichert wurde).

3. Stellen Sie sicher, dass mindestens ein Fingerabdruck auf dem Gerät registriert wurde.

4. Erstellen Sie eine Instanz der Klasse FingerprintManager.

5. Verwenden Sie eine Keystore-Instanz, um Zugriff auf den Android Keystore-Container zu erhalten. Dies ist ein Speicherbereich, der für die sichere Speicherung von kryptographischen Schlüsseln auf Android-Geräten verwendet wird.

6. Erzeugen Sie einen Verschlüsselungsschlüssel mit der KeyGenerator-Klasse und speichern Sie ihn im Keystore-Container.

7. Initialisieren Sie eine Instanz der Cipher-Klasse mit dem in Schritt 5 erzeugten Schlüssel.

8. Verwenden Sie die Cipher-Instanz, um ein CryptoObject zu erstellen und weisen Sie es der in Schritt 4 erstellten FingerprintManager-Instanz zu.

9. Rufe die authenticate Methode der FingerprintManager Instanz auf.

10. Implementieren Sie Methoden, um die durch den Authentifizierungsprozess ausgelösten Rückrufe zu behandeln. Ermöglichen Sie den Zugriff auf den geschützten Inhalt oder die geschützte Funktionalität nach erfolgreicher Authentifizierung.

Jeder der oben genannten Schritte wird im Laufe des Tutorials, das im Rest dieses Kapitels beschrieben wird, ausführlicher behandelt.

Berichten Sie diese Anzeige

Erstellen des Fingerabdruck-Authentifizierungsprojekts

Beginnen Sie dieses Beispiel, indem Sie die Android Studio-Umgebung starten und ein neues Projekt erstellen, wobei Sie FingerprintDemo in das Feld Anwendungsname und ebookfrenzy.com als Unternehmensdomäne ein, bevor Sie auf die Schaltfläche Next (Weiter) klicken.

Auf dem Bildschirm Formfaktoren aktivieren Sie die Option Phone and Tablet (Telefon und Tablet) und setzen die Mindest-SDK-Einstellung auf API 23: Android 6.0 (Marshmallow). Fahren Sie mit den Einrichtungsbildschirmen fort und fordern Sie die Erstellung einer leeren Aktivität mit dem Namen FingerprintDemoActivity und einem entsprechenden Layout mit dem Namen activity_fingerprint_demo an.

Konfigurieren der Fingerabdruckauthentifizierung des Geräts

Die Fingerabdruckauthentifizierung ist nur auf Geräten verfügbar, die einen Berührungssensor enthalten und auf denen die entsprechenden Konfigurationsschritte durchgeführt wurden, um das Gerät zu sichern und mindestens einen Fingerabdruck zu registrieren. Schritte zum Konfigurieren einer Emulator-Sitzung zum Testen der Fingerabdruck-Authentifizierung finden Sie im Kapitel Verwenden und Konfigurieren des Android Studio 2 AVD-Emulators.

Um die Fingerabdruck-Authentifizierung auf einem physischen Gerät zu konfigurieren, öffnen Sie zunächst die App Einstellungen und wählen Sie die Option Sicherheit. Wählen Sie auf dem Bildschirm mit den Sicherheitseinstellungen die Option Fingerabdruck. Klicken Sie auf dem daraufhin angezeigten Informationsbildschirm auf die Schaltfläche Weiter, um zum Bildschirm für die Einrichtung des Fingerabdrucks zu gelangen. Bevor die Fingerabdruck-Sicherheit aktiviert werden kann, muss eine Backup-Methode zur Entsperrung des Bildschirms (z. B. eine PIN-Nummer) konfiguriert werden. Klicken Sie auf die Schaltfläche Bildschirmsperre einrichten, wenn der Sperrbildschirm noch nicht gesichert ist, und folgen Sie den Schritten zur Konfiguration der PIN-, Muster- oder Kennwortsicherheit.

Wenn der Sperrbildschirm gesichert ist, gehen Sie zum Bildschirm für die Fingerabdruckerkennung und berühren Sie den Sensor, wenn Sie dazu aufgefordert werden (Abbildung 62-1), und wiederholen Sie den Vorgang, um bei Bedarf weitere Fingerabdrücke hinzuzufügen.

Abbildung 62-1

Hinzufügen der Fingerabdruckberechtigung zur Manifestdatei

Fingerabdruckauthentifizierung erfordert, dass die App die Berechtigung USE_FINGERPRINT innerhalb der Projektmanifestdatei anfordert. Suchen und bearbeiten Sie im Android Studio Project Tool-Fenster die App -> Manifeste -> AndroidManifest.xml-Datei, um die Berechtigungsanforderung wie folgt hinzuzufügen:

Herunterladen des Fingerabdrucksymbols

Google stellt ein Standardsymbol (Abbildung 62-2) zur Verfügung, das immer dann angezeigt werden muss, wenn eine App die Authentifizierung eines Benutzers anfordert.

Abbildung 62-2

Eine Kopie dieses Symbols kann von der folgenden URL heruntergeladen werden:

Öffnen Sie den Dateisystemnavigator für Ihr Betriebssystem, wählen Sie das neu heruntergeladene Bild aus und drücken Sie Strg-C (Cmd-C auf Mac OS X), um die Datei zu kopieren. Kehren Sie zu Android Studio zurück, klicken Sie mit der rechten Maustaste auf den Ordner „app -> res -> drawable“ und wählen Sie die Menüoption „Paste“, um eine Kopie der Bilddatei zum Projekt hinzuzufügen. Wenn das Dialogfeld Kopieren angezeigt wird, klicken Sie auf die Schaltfläche OK, um die Standardeinstellungen zu verwenden.

Entwerfen der Benutzeroberfläche

Um das Beispiel so einfach wie möglich zu halten, werden die einzigen Elemente innerhalb der Benutzeroberfläche eine TextView und eine ImageView sein. Suchen Sie die Layout-Ressourcendatei activity_fingerprint_demo.xml und wählen Sie sie aus, um sie in das Designer-Tool zu laden. Sobald sie geladen ist, löschen Sie das TextView-Beispielobjekt, ziehen Sie ein ImageView-Objekt aus dem Panel und positionieren Sie es in der Mitte der Layout-Leinwand.

In der Eigenschaftsleiste suchen Sie das src-Attribut, klicken in das entsprechende Textfeld und anschließend auf die in Abbildung 62-3 hervorgehobene Schaltfläche, um den Ressourcendialog aufzurufen:

Abbildung 62-3

Im linken Bereich des Dialogs wählen Sie die Option Drawable. Geben Sie im Hauptfenster in das Suchfeld ic_fp ein, wie in Abbildung 62-4 dargestellt, um das Fingerabdrucksymbol zu finden. Wählen Sie das Symbol aus dem Dialogfeld aus und klicken Sie auf OK, um es dem ImageView-Objekt zuzuweisen.

Abbildung 62-4

Lokalisieren Sie das Objekt Großer Text aus der Palette und ziehen Sie es per Drag & Drop so, dass es unter dem ImageView-Objekt positioniert ist. Doppelklicken Sie auf das Objekt und ändern Sie den Text so, dass er „Touch Sensor“ lautet. Verwenden Sie das Glühbirnensymbol, um die Zeichenfolge in eine Ressource namens touch_sensor zu extrahieren.

Nach Abschluss der obigen Schritte sollte das Layout dem in Abbildung 62-5 gezeigten entsprechen:

Abbildung 62-5

Zugriff auf die Dienste Keyguard und FingerprintManager

Fingerprint-Authentifizierung nutzt zwei Systemdienste in Form des KeyguardManagers und des FingerprintManagers. Bearbeiten Sie die onCreate-Methode in der Datei FingerprintDemoActivity.java, um Verweise auf diese beiden Dienste wie folgt zu erhalten:

package com.ebookfrenzy.fingerprintdemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.app.KeyguardManager;import android.hardware.fingerprint.FingerprintManager;public class FingerprintDemoActivity extends AppCompatActivity { private FingerprintManager fingerprintManager; private KeyguardManager keyguardManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fingerprint_demo); keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE); }}

Prüfen der Sicherheitseinstellungen

Zurück in diesem Kapitel wurden Schritte unternommen, um den Sperrbildschirm zu konfigurieren und Fingerabdrücke auf dem Gerät oder Emulator zu registrieren, auf dem die App getestet werden soll. Es ist jedoch wichtig, in die App einen Abwehrcode einzubauen, um sicherzustellen, dass diese Anforderungen erfüllt sind, bevor die Fingerabdruckauthentifizierung versucht wird. Diese Schritte werden in der onCreate-Methode in der Datei FingerprintDemoActivity.java ausgeführt, wobei die Dienste Keyguard und Fingerprint Manager verwendet werden. Beachten Sie, dass auch Code hinzugefügt wurde, um zu überprüfen, ob die Berechtigung USE_FINGERPRINT für die Anwendung konfiguriert wurde:

Die oben genannten Codeänderungen beginnen mit der Verwendung des Keyguard-Managers, um zu überprüfen, ob eine Backup-Methode zur Entsperrung des Bildschirms konfiguriert wurde (mit anderen Worten kann eine PIN oder eine andere Authentifizierungsmethode als Alternative zur Fingerabdruck-Authentifizierung zum Entsperren des Bildschirms verwendet werden). Falls der Sperrbildschirm nicht gesichert ist, meldet der Code das Problem an den Benutzer und kehrt aus der Methode zurück.

Der Fingerabdruck-Manager wird dann verwendet, um zu überprüfen, ob mindestens ein Fingerabdruck auf dem Gerät registriert wurde, meldet erneut das Problem und kehrt, falls erforderlich, aus der Methode zurück.

Zugriff auf den Android Keystore und KeyGenerator

Teil des Fingerabdruck-Authentifizierungsprozesses ist die Generierung eines Verschlüsselungsschlüssels, der dann mithilfe des Android Keystore-Systems sicher auf dem Gerät gespeichert wird. Bevor der Schlüssel generiert und gespeichert werden kann, muss die App zunächst Zugriff auf den Keystore erhalten. Eine neue Methode namens generateKey wird nun in der Datei FingerprintDemoActivity.java implementiert, um die Schlüsselgenerierung und -speicherung durchzuführen. Zunächst wird nur der Code für den Zugriff auf den Keystore wie folgt hinzugefügt:

Ein Verweis auf den Keystore wird durch Aufruf der getInstance-Methode der Keystore-Klasse und Übergabe des Bezeichners des Standard-Android-Keystore-Containers („AndroidKeyStore“) erhalten. Der nächste Schritt des Tutorials besteht darin, einen Schlüssel mithilfe des KeyGenerator-Dienstes zu erzeugen. Vor der Erzeugung dieses Schlüssels muss Code hinzugefügt werden, um einen Verweis auf eine Instanz des KeyGenerators zu erhalten, wobei als Argumente der Typ des zu erzeugenden Schlüssels und der Name des Keystore-Containers, in dem der Schlüssel gespeichert werden soll, übergeben werden:

Schlüsselerzeugung

Nun, da wir einen Verweis auf den Android Keystore-Container und eine KeyGenerator-Instanz haben, besteht der nächste Schritt darin, den Schlüssel zu erzeugen, der verwendet wird, um eine Chiffre für den Verschlüsselungsprozess zu erstellen. Fügen Sie innerhalb der Datei FingerprintDemoActivity.java diesen neuen Code wie folgt hinzu:

Die obigen Änderungen bedürfen einer Erklärung. Nach dem Import einer Reihe von zusätzlichen Modulen deklariert der Code eine String-Variable, die den Namen (in diesem Fall „example_key“) darstellt, der beim Speichern des Schlüssels im Keystore-Container verwendet wird.

Als nächstes wird der Keystore-Container geladen und der KeyGenerator initialisiert. Bei diesem Initialisierungsprozess wird die Klasse KeyGenParameterSpec.Builder verwendet, um den Typ des zu erzeugenden Schlüssels anzugeben. Dazu gehören die Referenzierung des Schlüsselnamens, die Konfiguration des Schlüssels, so dass er sowohl für die Verschlüsselung als auch für die Entschlüsselung verwendet werden kann, und die Einstellung verschiedener Verschlüsselungsparameter. Der Methodenaufruf setUserAuthenticationRequired konfiguriert den Schlüssel so, dass der Benutzer jede Verwendung des Schlüssels mit einer Fingerabdruck-Authentifizierung autorisieren muss. Sobald der KeyGenerator konfiguriert wurde, wird er verwendet, um den Schlüssel über einen Aufruf der generateKey-Methode der Instanz zu erzeugen.

Initialisierung des Cipher

Nachdem der Schlüssel erzeugt wurde, besteht der nächste Schritt darin, den Cipher zu initialisieren, der verwendet wird, um die verschlüsselte FingerprintManager.CryptoObject-Instanz zu erzeugen. Dieses CryptoObject wird wiederum während des Fingerabdruck-Authentifizierungsprozesses verwendet. Die Cipher-Konfiguration beinhaltet die Beschaffung einer Cipher-Instanz und deren Initialisierung mit dem im Keystore-Container gespeicherten Schlüssel. Fügen Sie der Datei FingerprintDemoActivity.java eine neue Methode namens cipherInit hinzu, um diese Aufgaben auszuführen:

Die getInstance-Methode der Cipher-Klasse wird aufgerufen, um eine Cipher-Instanz zu erhalten, die anschließend mit den für die Fingerabdruck-Authentifizierung erforderlichen Eigenschaften konfiguriert wird. Der zuvor generierte Schlüssel wird dann aus dem Keystore-Container extrahiert und zur Initialisierung der Cipher-Instanz verwendet. Fehler werden entsprechend behandelt und je nach Erfolg oder Misserfolg des Cipher-Initialisierungsprozesses wird ein wahres oder falsches Ergebnis zurückgegeben.

Die Arbeit an den beiden Methoden generateKey und cipherInit ist nun abgeschlossen. Der nächste Schritt besteht darin, die onCreate-Methode zu modifizieren, um diese Methoden aufzurufen und im Falle einer erfolgreichen Cipher-Initialisierung eine CryptoObject-Instanz zu erstellen.

Creating the CryptoObject Instance

In der Datei FingerprintDemoActivity.java-Datei die onCreate-Methode modifizieren, um die beiden neu erstellten Methoden aufzurufen und das CryptoObject wie folgt zu generieren:

Die letzte Aufgabe im Projekt besteht darin, eine neue Klasse zu implementieren, um die eigentliche Fingerabdruck-Authentifizierung zu handhaben.

Implementierung der Fingerabdruck-Authentifizierungs-Handler-Klasse

Bislang wurde in diesem Kapitel der größte Teil der Arbeit in die Vorbereitung der Fingerabdruck-Authentifizierung in Bezug auf den Schlüssel, den Cipher und das Crypto-Objekt investiert. Die eigentliche Authentifizierung wird durch einen Aufruf der authenticate-Methode der FingerprintManager-Instanz ausgelöst. Dieser Methodenaufruf löst jedoch, je nach Erfolg oder Misserfolg der Authentifizierung, eines von mehreren Callback-Ereignissen aus. Sowohl der Aufruf der authenticate-Methode als auch die Callback-Handler-Methoden müssen in einer Klasse implementiert werden, die die Klasse FingerprintManager.AuthenticationCallback erweitert. Eine solche Klasse muss nun dem Projekt hinzugefügt werden.

Navigieren Sie zu dem Eintrag app -> java -> com.ebookfrenzy.fingerprintdemo im Android Studio Project Tool Fenster und klicken Sie mit der rechten Maustaste darauf. Wählen Sie im daraufhin angezeigten Menü die Option New -> Java Class, um den Dialog Create New Class anzuzeigen. Nennen Sie die Klasse FingerprintHandler und klicken Sie auf die Schaltfläche OK, um die Klasse zu erstellen.

Bearbeiten Sie die neue Klassendatei so, dass sie FingerprintManager.AuthenticationCallback erweitert, einige zusätzliche Module importiert und eine Konstruktormethode implementiert, die es ermöglicht, den Anwendungskontext zu übergeben, wenn eine Instanz der Klasse erstellt wird (der Kontext wird in den Callback-Methoden verwendet, um den Benutzer über den Authentifizierungsstatus zu informieren):

package com.ebookfrenzy.fingerprintdemo;import android.Manifest;import android.content.Context;import android.content.pm.PackageManager;import android.hardware.fingerprint.FingerprintManager;import android.os.CancellationSignal;import android.support.v4.app.ActivityCompat;import android.widget.Toast;public class FingerprintHandler extends FingerprintManager.AuthenticationCallback { private CancellationSignal cancellationSignal; private Context appContext; public FingerprintHandler(Context context) { appContext = context; }}

Als nächstes muss eine Methode hinzugefügt werden, die aufgerufen werden kann, um die Fingerabdruckauthentifizierung zu initiieren. Beim Aufruf dieser Methode müssen die Instanzen FingerprintManager und CryptoObject übergeben werden. Nennen Sie diese Methode startAuth und implementieren Sie sie in der FingerprintHandler.java-Klassendatei wie folgt (beachten Sie, dass auch Code hinzugefügt wurde, um erneut zu prüfen, ob die Fingerabdruckberechtigung erteilt wurde):

Fügen Sie als Nächstes die Callback-Handler-Methoden hinzu, von denen jede so implementiert ist, dass sie eine Toast-Meldung anzeigt, die das Ergebnis der Fingerabdruckauthentifizierung angibt:

Die letzte Aufgabe vor dem Testen des Projekts besteht darin, die onCreate-Methode so zu ändern, dass sie eine neue Instanz der FingerprintHandler-Klasse erstellt und die startAuth-Methode aufruft. Bearbeiten Sie die Datei FingerprintDemoActivity.java und ändern Sie das Ende der onCreate-Methode so, dass sie wie folgt lautet:

Testen des Projekts

Nachdem das Projekt nun fertiggestellt ist, führen Sie die App auf einem physischen Android-Gerät oder einer Emulator-Sitzung aus. Sobald die App läuft, berühren Sie entweder den Fingerabdrucksensor oder verwenden Sie das erweiterte Bedienfeld im Emulator, um eine Fingerabdruckberührung zu simulieren, wie im Kapitel „Verwenden und Konfigurieren des Android Studio 2 AVD Emulators“ beschrieben. Wenn ein registrierter Fingerabdruck erkannt wird, erscheint eine Toast-Meldung, die eine erfolgreiche Authentifizierung anzeigt, wie in Abbildung 62-6 gezeigt:

Abbildung 62-6

Stoppen Sie die laufende App und starten Sie sie erneut, diesmal mit einem nicht registrierten Fingerabdruck, um die Authentifizierung zu versuchen. Diesmal sollte eine Toast-Meldung erscheinen, die anzeigt, dass die Authentifizierung fehlgeschlagen ist.

Zusammenfassung

Die Authentifizierung per Fingerabdruck unter Android ist ein mehrstufiger Prozess, der zunächst komplex erscheinen kann. Wenn man ihn jedoch in einzelne Schritte zerlegt, wird der Prozess klarer. Die Fingerabdruck-Authentifizierung umfasst die Verwendung von Schlüsseln, Chiffren und Schlüsselspeichern in Kombination mit den Funktionen der Klasse FingerprintManager. In diesem Kapitel wurde eine Einführung in diese Schritte gegeben und ein Beispielprojekt erstellt, das die praktische Umsetzung der Fingerabdruckauthentifizierung in Android zeigen soll.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.