Fingeraftryksgodkendelse bruger den berøringssensor, der er indbygget i mange Android-enheder, til at identificere brugeren og give adgang til både enheden og programfunktioner som f.eks. betalingsmuligheder i appen. Implementeringen af fingeraftryksgodkendelse er en proces i flere trin, som i første omgang kan virke overvældende. Når processen opdeles i individuelle trin, bliver den dog langt mindre kompleks. Grundlæggende set er fingeraftryksgodkendelse primært et spørgsmål om kryptering, der involverer en nøgle, en cipher til at udføre krypteringen og en fingeraftryksmanager til at håndtere godkendelsesprocessen.
Dette kapitel giver både en oversigt over fingeraftryksgodkendelse og en detaljeret, trinvis vejledning, der viser en praktisk tilgang til implementeringen.
En oversigt over fingeraftryksgodkendelse
Der er i det væsentlige 10 trin for at implementere fingeraftryksgodkendelse i en Android-app. Disse trin kan sammenfattes som følger:
1. Anmod om tilladelse til fingeraftryksgodkendelse i projektmanifestfilen.
2. Kontroller, at låseskærmen på den enhed, som appen kører på, er beskyttet af en pinkode, et mønster eller en adgangskode (fingeraftryk kan kun registreres på enheder, hvor låseskærmen er blevet sikret).
3. Kontroller, at der er registreret mindst ét fingeraftryk på enheden.
4. Opret en instans af FingerprintManager-klassen.
5. Brug en Keystore-instans til at få adgang til Android Keystore-containeren. Dette er et lagerområde, der bruges til sikker opbevaring af kryptografiske nøgler på Android-enheder.
6. Generer en krypteringsnøgle ved hjælp af KeyGenerator-klassen, og gem den i Keystore-containeren.
7. Initialiser en instans af Cipher-klassen ved hjælp af den nøgle, der blev genereret i trin 5.
8. Brug Cipher-instansen til at oprette et CryptoObject, og tildel den til den FingerprintManager-instans, der blev oprettet i trin 4.
9. Kald metoden authenticate for FingerprintManager-instansen.
10. Implementer metoder til at håndtere de callbacks, der udløses af autentificeringsprocessen. Giv adgang til det beskyttede indhold eller den beskyttede funktionalitet ved afslutning af en vellykket autentificering.
Hvert af ovenstående trin vil blive behandlet mere detaljeret i løbet af den vejledning, der er beskrevet i resten af dette kapitel.
Skabelse af fingeraftryksgodkendelsesprojektet
Begynd dette eksempel ved at starte Android Studio-miljøet og oprette et nyt projekt, indtast FingerprintDemo i feltet Programnavn og ebookfrenzy.com som indstilling for Company Domain, før du klikker på knappen Next (Næste).
På skærmen Form factors (formfaktorer) skal du aktivere indstillingen Phone and Tablet (Telefon og tablet) og indstille minimum SDK-indstillingen til API 23: Android 6.0 (Marshmallow). Fortsæt gennem opsætningsskærmene og anmod om oprettelse af en tom aktivitet ved navn FingerprintDemoActivity med et tilsvarende layout ved navn activity_fingerprint_demo.
Konfigurering af enheds-fingeraftryksgodkendelse
Fingeraftryksgodkendelse er kun tilgængelig på enheder, der indeholder en berøringssensor, og hvor de relevante konfigurationstrin er blevet taget for at sikre enheden og registrere mindst ét fingeraftryk. Du kan finde trin til konfiguration af en emulatorsession for at teste fingeraftryksgodkendelse i kapitlet Brug og konfiguration af Android Studio 2 AVD-emulatoren.
For at konfigurere fingeraftryksgodkendelse på en fysisk enhed skal du begynde med at åbne appen Indstillinger og vælge indstillingen Sikkerhed. I skærmbilledet Sikkerhedsindstillinger skal du vælge indstillingen Fingeraftryk. På den resulterende informationsskærm klikker du på knappen Fortsæt for at gå videre til skærmbilledet for konfiguration af fingeraftryk. Før fingeraftrykssikkerhed kan aktiveres, skal der konfigureres en backup-skærmoplåsningsmetode (f.eks. en pinkode). Klik på knappen Opsætning af skærmlås, hvis låseskærmen ikke allerede er sikret, og følg trinene for at konfigurere enten PIN-, mønster- eller adgangskode-sikkerhed.
Når låseskærmen er sikret, skal du gå videre til skærmen til registrering af fingeraftryk og berøre sensoren, når du bliver bedt om det (Figur 62-1), og gentage processen for at tilføje yderligere fingeraftryk, hvis det er nødvendigt.
Figur 62-1
Tilføjelse af tilladelsen til fingeraftryk til manifestfilen
Fingeraftryksgodkendelse kræver, at appen anmoder om tilladelsen USE_FINGERPRINT i projektmanifestfilen. I Android Studio Project-værktøjsvinduet skal du finde og redigere appen -> manifests -> AndroidManifest.xml-filen for at tilføje tilladelsesanmodningen som følger:
Download af fingeraftryksikonet
Google leverer et standardikon (Figur 62-2), som skal vises, når en app anmoder om godkendelse fra en bruger.
Figur 62-2
En kopi af dette ikon kan downloades fra følgende URL:
Åbn filsystemnavigatoren for dit operativsystem, vælg det nyligt downloadede billede, og tryk på Ctrl-C (Cmd-C på Mac OS X) for at kopiere filen. Vend tilbage til Android Studio, højreklik på mappen app -> res -> drawable, og vælg menupunktet Paste (indsæt) for at tilføje en kopi af billedfilen til projektet. Når dialogboksen Kopier vises, skal du klikke på OK-knappen for at bruge standardindstillingerne.
Design af brugergrænsefladen
For at holde eksemplet så enkelt som muligt vil de eneste elementer i brugergrænsefladen være et TextView og et ImageView. Find og vælg layoutressourcefilen activity_fingerprint_demo.xml for at indlæse den i Designer-værktøjet. Når den er indlæst, sletter du eksemplet TextView-objektet, trækker og slipper et ImageView-objekt fra panelet og placerer det i midten af layoutkanvaset.
I panelet Egenskaber skal du finde src-attributten, klikke i det tilsvarende tekstfelt efterfulgt af knappen fremhævet i Figur 62-3 for at få vist dialogboksen Ressourcer:
Figur 62-3
I dialogboksens venstre panel skal du vælge Drawable-indstillingen. I hovedpanelet skal du indtaste ic_fp i søgefeltet som illustreret i Figur 62 4 for at finde fingeraftryksikonet. Vælg ikonet i dialogboksen, og klik på OK for at tildele det til ImageView-objektet.
Figur 62-4
Lokaliser Large Text-objektet fra paletten, og træk og slip det, så det placeres under ImageView-objektet. Dobbeltklik på objektet, og ændr teksten, så den lyder “Touch Sensor”. Brug pæreikonet til at udtrække strengen til en ressource ved navn touch_sensor.
Når ovenstående trin er udført, bør layoutet svare til det, der er vist i Figur 62-5:
Figur 62-5
Accessing the Keyguard and Fingerprint Manager Services
Fingeraftryksgodkendelse gør brug af to systemtjenester i form af KeyguardManager og FingerprintManager. Rediger onCreate-metoden i filen FingerprintDemoActivity.java for at få referencer til disse to tjenester som følger:
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); }}
Kontrol af sikkerhedsindstillingerne
Tidligere i dette kapitel blev der taget skridt til at konfigurere låseskærmen og registrere fingeraftryk på den enhed eller emulator, som appen skal testes på. Det er dog vigtigt at inkludere forsvarskode i appen for at sikre, at disse krav er opfyldt, før man forsøger at søge fingeraftryksgodkendelse. Disse trin udføres i onCreate-metoden, der findes i filen FingerprintDemoActivity.java, og der gøres brug af Keyguard- og Fingerprint Manager-tjenesterne. Bemærk, at der også er tilføjet kode til at kontrollere, at tilladelsen USE_FINGERPRINT er blevet konfigureret for appen:
Overstående kodeændringer begynder med at bruge Keyguard-manager til at kontrollere, at der er konfigureret en backupmetode til oplåsning af skærmen (med andre ord kan en pinkode eller en anden godkendelsesmetode bruges som et alternativ til fingeraftryksgodkendelse til at låse skærmen op). I tilfælde af, at låseskærmen ikke er sikret, rapporterer koden problemet til brugeren og vender tilbage fra metoden.
Fingeraftryksmanageren bruges derefter til at kontrollere, at mindst ét fingeraftryk er registreret på enheden, og rapporterer igen problemet og vender om nødvendigt tilbage fra metoden.
Accessing the Android Keystore and KeyGenerator
En del af fingeraftryksgodkendelsesprocessen indebærer generering af en krypteringsnøgle, som derefter gemmes sikkert på enheden ved hjælp af Android Keystore-systemet. Før nøglen kan genereres og gemmes, skal appen først få adgang til Keystore. Der vil nu blive implementeret en ny metode ved navn generateKey i filen FingerprintDemoActivity.java for at udføre opgaverne med generering og lagring af nøglen. I første omgang vil kun koden til at få adgang til Keystore blive tilføjet som følger:
En reference til Keystore fås ved at kalde getInstance-metoden for Keystore-klassen og videregive identifikatoren for Android-standardkeystore-containeren (“AndroidKeyStore”). Det næste trin i vejledningen vil være at generere en nøgle ved hjælp af KeyGenerator-tjenesten. Før genereringen af denne nøgle skal der tilføjes kode for at opnå en reference til en instans af KeyGenerator, idet der som argumenter overføres den type nøgle, der skal genereres, og navnet på den Keystore-container, som nøglen skal gemmes i:
Generering af nøglen
Nu, hvor vi har en reference til Android Keystore-containeren og en KeyGenerator-instans, er det næste skridt at generere den nøgle, der skal bruges til at oprette en cipher til krypteringsprocessen. I den resterende del af filen FingerprintDemoActivity.java tilføjes denne nye kode som følger:
De ovenstående ændringer kræver en forklaring. Efter import af en række yderligere moduler deklarerer koden en strengvariabel, der repræsenterer det navn (i dette tilfælde “example_key”), der skal bruges ved lagring af nøglen i Keystore-containeren.
Dernæst indlæses keystore-containeren, og KeyGenerator initialiseres. Denne initialiseringsproces gør brug af klassen KeyGenParameterSpec.Builder til at angive den type nøgle, der skal genereres. Dette omfatter henvisning til nøglenavnet, konfiguration af nøglen, således at den kan bruges til både kryptering og dekryptering, og indstilling af forskellige krypteringsparametre. Metodekaldet setUserAuthenticationRequired konfigurerer nøglen således, at brugeren skal godkende enhver brug af nøglen med en fingeraftryksgodkendelse. Når KeyGenerator er blevet konfigureret, bruges den derefter til at generere nøglen via et kald til generateKey-metoden for instansen.
Initialisering af Cipher
Nu, hvor nøglen er blevet genereret, er det næste skridt at initialisere den cipher, der skal bruges til at oprette den krypterede FingerprintManager.CryptoObject-instans. Dette CryptoObject vil til gengæld blive brugt under fingeraftryksgodkendelsesprocessen. Cipher-konfigurationen indebærer, at der skal hentes en Cipher-instans og initialiseres den med den nøgle, der er gemt i Keystore-containeren. Tilføj en ny metode ved navn cipherInit til filen FingerprintDemoActivity.java for at udføre disse opgaver:
GetInstance-metoden getInstance i Cipher-klassen kaldes for at opnå en Cipher-instans, som efterfølgende konfigureres med de egenskaber, der er nødvendige for fingeraftryksgodkendelse. Den tidligere genererede nøgle udtrækkes derefter fra Keystore-containeren og bruges til at initialisere Cipher-instansen. Fejl håndteres i overensstemmelse hermed, og et sandt eller falsk resultat returneres baseret på succes eller ej i cipher-initialiseringsprocessen.
Arbejdet er nu afsluttet med både generateKey- og cipherInit-metoderne. Det næste skridt er at ændre onCreate-metoden til at kalde disse metoder og, i tilfælde af en vellykket cipher-initialisering, oprette en CryptoObject-instans.
Skabelse af CryptoObject-instansen
Resten i FingerprintDemoActivity.java-filen ændres onCreate-metoden til at kalde de to nyoprettede metoder og generere CryptoObjektet som følger:
Den sidste opgave i projektet er at implementere en ny klasse til håndtering af selve fingeraftryksgodkendelsen.
Implementering af håndteringsklassen til fingeraftryksgodkendelse
Så langt i dette kapitel har det meste af arbejdet handlet om at forberede fingeraftryksgodkendelsen med hensyn til nøgle, cipher og kryptoobjekt. Den egentlige autentificering udløses via et kald til authenticate-metoden i FingerprintManager-instansen. Dette metodekald udløser imidlertid en af en række callback-hændelser afhængigt af, om godkendelsen er lykkedes eller mislykkedes. Både authenticate-metodeopkaldet og callback-håndteringsmetoderne skal implementeres i en klasse, der udvider FingerprintManager.AuthenticationCallback-klassen. En sådan klasse skal nu tilføjes til projektet.
Navigér til indgangen app -> java -> com.ebookfrenzy.fingerprintdemo i værktøjsvinduet Android Studio Project, og højreklik på den. I den resulterende menu skal du vælge indstillingen Ny -> Java-klasse for at få vist dialogboksen Opret ny klasse. Navngiv klassen FingerprintHandler, og klik på OK-knappen for at oprette klassen.
Rediger den nye klassefil, så den udvider FingerprintManager.AuthenticationCallback, importerer nogle yderligere moduler og implementerer en konstruktionsmetode, der gør det muligt at videregive applikationskonteksten, når en instans af klassen oprettes (konteksten vil blive brugt i callback-metoderne til at underrette brugeren om godkendelsesstatus):
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; }}
Næst skal der tilføjes en metode, som kan kaldes for at igangsætte fingeraftryksgodkendelsen. Når denne metode kaldes, skal den have overdraget FingerprintManager- og CryptoObject-instanserne. Navngiv denne metode startAuth, og implementer den i FingerprintHandler.java-klassefilen på følgende måde (bemærk, at der også er tilføjet kode til endnu en gang at kontrollere, at der er givet tilladelse til fingeraftryk):
Næst tilføjes callback-håndteringsmetoderne, som hver især er implementeret til at vise en toastmeddelelse, der angiver resultatet af fingeraftryksgodkendelsen:
Den sidste opgave, inden projektet testes, er at ændre onCreate-metoden, så den opretter en ny instans af FingerprintHandler-klassen og kalder startAuth-metoden. Rediger filen FingerprintDemoActivity.java, og ændr slutningen af onCreate-metoden, så den får følgende ordlyd
Test af projektet
Nu er projektet færdigt, og appen kan køres på en fysisk Android-enhed eller en emulatorsession. Når den kører, skal du enten berøre fingeraftrykssensoren eller bruge det udvidede kontrolpanel i emulatoren til at simulere et fingeraftryksberøring som beskrevet i kapitlet Brug og konfiguration af Android Studio 2 AVD-emulatoren. Hvis der registreres et registreret fingeraftryk, vises en toastmeddelelse, der angiver en vellykket autentificering som vist i figur 62-6:
Figur 62-6
Stop den kørende app, og genstart den, denne gang med et uregistreret fingeraftryk til at forsøge autentificering. Denne gang bør der vises en toastmeddelelse, der angiver, at godkendelsen mislykkedes.
Summary
Fingeraftryksgodkendelse i Android er en proces i flere trin, der i første omgang kan virke kompleks. Når processen opdeles i individuelle trin, bliver den dog mere klar, når den opdeles i individuelle trin. Fingeraftryksgodkendelse indebærer brug af nøgler, kryptering og nøgleopbevaring kombineret med funktionerne i FingerprintManager-klassen. Dette kapitel har givet en introduktion til disse trin og gennemarbejdet oprettelsen af et eksempelprogramprojekt, der har til formål at vise den praktiske implementering af fingeraftryksgodkendelse i Android.