Handledning för fingeravtrycksautentisering i Android

Fingeravtrycksautentisering använder den beröringssensor som finns inbyggd i många Android-enheter för att identifiera användaren och ge tillgång till både enheten och programfunktionalitet, t.ex. betalningsalternativ i appen. Implementeringen av fingeravtrycksautentisering är en process i flera steg som till en början kan verka överväldigande. När processen delas upp i enskilda steg blir den dock mycket mindre komplicerad. I grundläggande termer är fingeravtrycksautentisering främst en fråga om kryptering som inbegriper en nyckel, ett chiffer för att utföra krypteringen och en fingeravtryckshanterare för att hantera autentiseringsprocessen.

Detta kapitel ger både en översikt över fingeravtrycksautentisering och en detaljerad, stegvis handledning som visar ett praktiskt tillvägagångssätt för genomförandet.

Innehåll

En översikt över fingeravtrycksautentisering

Det finns i huvudsak 10 steg för att implementera fingeravtrycksautentisering i en Android-app. Dessa steg kan sammanfattas enligt följande:

1. Begär tillstånd för fingeravtrycksautentisering i projektmanifestfilen.

2. Kontrollera att låsskärmen på enheten som appen körs på är skyddad med en PIN-kod, ett mönster eller ett lösenord (fingeravtryck kan endast registreras på enheter där låsskärmen har säkrats).

3. Kontrollera att minst ett fingeravtryck har registrerats på enheten.

4. Skapa en instans av klassen FingerprintManager.

5. Använd en Keystore-instans för att få tillgång till Android Keystore-behållaren. Detta är ett lagringsområde som används för säker lagring av kryptografiska nycklar på Android-enheter.

6. Generera en krypteringsnyckel med hjälp av KeyGenerator-klassen och lagra den i Keystore-behållaren.

7. Initialisera en instans av Cipher-klassen med hjälp av nyckeln som genererades i steg 5.

8. Använd Cipher-instansen för att skapa ett CryptoObject och tilldela det till den FingerprintManager-instans som skapades i steg 4.

9. Kalla autentiseringsmetoden för FingerprintManager-instansen.

10. Implementera metoder för att hantera de callbacks som utlöses av autentiseringsprocessen. Ge tillgång till det skyddade innehållet eller den skyddade funktionaliteten efter en lyckad autentisering.

Varje steg ovan kommer att behandlas mer i detalj under den handledning som beskrivs i resten av det här kapitlet.

rapportera den här annonsen

Skapande av fingeravtrycksautentiseringsprojektet

Börja det här exemplet genom att starta Android Studio-miljön och skapa ett nytt projekt, ange FingerprintDemo i fältet Application name och ebookfrenzy.com som inställning för företagsdomän innan du klickar på knappen Nästa.

På skärmen Formfaktorer aktiverar du alternativet Telefon och surfplatta och ställer in minsta SDK-inställning till API 23: Android 6.0 (Marshmallow). Fortsätt genom inställningsskärmarna och begär att en tom aktivitet som heter FingerprintDemoActivity skapas med en motsvarande layout som heter activity_fingerprint_demo.

Konfigurera autentisering av fingeravtryck på enheten

Fingeravtrycksautentisering är endast tillgänglig på enheter som innehåller en beröringssensor och där lämpliga konfigurationssteg har vidtagits för att säkra enheten och registrera minst ett fingeravtryck. Steg för att konfigurera en emulatorsession för att testa fingeravtrycksautentisering finns i kapitlet Användning och konfiguration av Android Studio 2 AVD Emulator.

För att konfigurera fingeravtrycksautentisering på en fysisk enhet börjar du med att öppna appen Inställningar och välja alternativet Säkerhet. I skärmen Säkerhetsinställningar väljer du alternativet Fingeravtryck. På den resulterande informationsskärmen klickar du på knappen Fortsätt för att gå vidare till inställningsskärmen för fingeravtryck. Innan fingeravtryckssäkerheten kan aktiveras måste en backupmetod för skärmupplåsning (t.ex. en PIN-kod) konfigureras. Klicka på knappen Konfigurera skärmlås om låsskärmen inte redan är säkrad och följ stegen för att konfigurera antingen PIN-, mönster- eller lösenordssäkerhet.

När låsskärmen är säkrad fortsätter du till skärmen för fingeravtrycksdetektering och rör vid sensorn när du uppmanas att göra det (Figur 62-1), upprepa processen för att lägga till ytterligare fingeravtryck om det behövs.

Figur 62-1

Lägg till fingeravtrycksbehörigheten i manifestfilen

Fingeravtrycksautentisering kräver att appen begär behörigheten USE_FINGERPRINT i projektets manifestfil. I verktygsfönstret Android Studio Project letar du upp och redigerar filen app -> manifests -> AndroidManifest.xml för att lägga till behörighetsbegäran enligt följande:

Hämtning av fingeravtrycksikonen

Google tillhandahåller en standardikon (Figur 62-2) som måste visas när en app begär autentisering från en användare.

Figur 62-2

En kopia av den här ikonen kan laddas ner från följande URL:

Öppna filsystemsnavigatorn för ditt operativsystem, välj den nyss nedladdade bilden och tryck på Ctrl-C (Cmd-C på Mac OS X) för att kopiera filen. Återvänd till Android Studio, högerklicka på mappen app -> res -> drawable och välj menyalternativet Klistra in för att lägga till en kopia av bildfilen i projektet. När dialogrutan Kopiera visas klickar du på knappen OK för att använda standardinställningarna.

Utformning av användargränssnittet

För att hålla exemplet så enkelt som möjligt kommer de enda elementen i användargränssnittet att vara en TextView och en ImageView. Leta upp och välj layoutresursfilen activity_fingerprint_demo.xml för att ladda den i Designer-verktyget. När den har laddats tar du bort exemplet TextView-objektet, drar och släpper ett ImageView-objekt från panelen och placerar det i mitten av layoutduken.

I panelen Egenskaper letar du upp attributet src, klickar i motsvarande textfält följt av knappen som markeras i Figur 62-3 för att visa dialogrutan Resurser:

Figur 62-3

Från dialogrutans vänstra panel väljer du alternativet Drawable. I huvudpanelen anger du ic_fp i sökrutan enligt figur 62 4 för att hitta fingeravtrycksikonen. Välj ikonen i dialogrutan och klicka på OK för att tilldela den till ImageView-objektet.

Figur 62-4

Lokalisera Large Text-objektet från paletten och dra och släpp det så att det placeras under ImageView-objektet. Dubbelklicka på objektet och ändra texten så att den lyder ”Touch Sensor”. Använd glödlampsikonen för att extrahera strängen till en resurs som heter touch_sensor.

När ovanstående steg är utförda bör layouten motsvara den som visas i Figur 62-5:

Figur 62-5

Accessing the Keyguard and Fingerprint Manager Services

Fingeravtrycksautentisering använder sig av två systemtjänster i form av KeyguardManager och FingerprintManager. Redigera onCreate-metoden som finns i filen FingerprintDemoActivity.java för att få referenser till dessa två tjänster enligt följande:

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); }}

Kontroll av säkerhetsinställningarna

Tidigare i det här kapitlet togs steg för att konfigurera låsskärmen och registrera fingeravtryck på enheten eller emulatorn som appen ska testas på. Det är dock viktigt att inkludera försvarskod i appen för att se till att dessa krav har uppfyllts innan man försöker söka fingeravtrycksautentisering. Dessa steg kommer att utföras i onCreate-metoden i filen FingerprintDemoActivity.java, med hjälp av tjänsterna Keyguard och Fingerprint Manager. Observera att kod också har lagts till för att kontrollera att behörigheten USE_FINGERPRINT har konfigurerats för appen:

Ovanstående kodändringar börjar med att använda Keyguard-managern för att kontrollera att en reservmetod för upplåsning av skärmen har konfigurerats (med andra ord kan en PIN-kod eller en annan autentiseringsmetod användas som ett alternativ till fingeravtrycksautentisering för att låsa upp skärmen). Om låsskärmen inte är säkrad rapporterar koden problemet till användaren och återvänder från metoden.

Fingeravtryckshanteraren används sedan för att kontrollera att minst ett fingeravtryck har registrerats på enheten, och återigen rapporterar koden problemet och återvänder från metoden vid behov.

Accessing the Android Keystore and KeyGenerator

En del av autentiseringsprocessen för fingeravtryck innebär att en krypteringsnyckel genereras som sedan lagras säkert på enheten med hjälp av Android Keystore-systemet. Innan nyckeln kan genereras och lagras måste appen först få tillgång till Keystore. En ny metod som heter generateKey kommer nu att implementeras i filen FingerprintDemoActivity.java för att utföra nyckelgenerering och lagring. Initialt kommer endast koden för att få tillgång till Keystore att läggas till enligt följande:

En referens till Keystore erhålls genom att anropa getInstance-metoden för Keystore-klassen och skicka över identifieraren för Androids standard Keystore-behållare (”AndroidKeyStore”). Nästa steg i handledningen är att generera en nyckel med hjälp av tjänsten KeyGenerator. Innan nyckeln genereras måste kod läggas till för att erhålla en referens till en instans av KeyGenerator, genom att som argument skicka in typen av nyckel som ska genereras och namnet på Keystore-behållaren i vilken nyckeln ska sparas:

Generera nyckeln

Nu när vi har en referens till Android Keystore-behållaren och en instans av KeyGenerator är nästa steg att generera nyckeln som kommer att användas för att skapa ett chiffer för krypteringsprocessen. I filen FingerprintDemoActivity.java lägger du till den här nya koden enligt följande:

De ovanstående ändringarna kräver en förklaring. Efter att ha importerat ett antal ytterligare moduler deklarerar koden en strängvariabel som representerar namnet (i det här fallet ”example_key”) som kommer att användas när nyckeln lagras i Keystore-behållaren.

Nästan laddas keystore-behållaren och KeyGenerator initialiseras. Denna initialiseringsprocess använder sig av klassen KeyGenParameterSpec.Builder för att ange vilken typ av nyckel som ska genereras. Detta innefattar att referera till nyckelnamnet, konfigurera nyckeln så att den kan användas för både kryptering och dekryptering och ställa in olika krypteringsparametrar. Metodanropet setUserAuthenticationRequired konfigurerar nyckeln så att användaren måste godkänna varje användning av nyckeln med en fingeravtrycksautentisering. När KeyGenerator har konfigurerats används den sedan för att generera nyckeln via ett anrop till instansens generateKey-metod.

Initialisering av chiffer

När nyckeln har genererats är nästa steg att initialisera det chiffer som kommer att användas för att skapa den krypterade instansen FingerprintManager.CryptoObject. Detta CryptoObject kommer i sin tur att användas under autentiseringsprocessen för fingeravtryck. Konfigurering av chiffer innebär att man skaffar en chifferinstans och initialiserar den med den nyckel som finns lagrad i behållaren Keystore. Lägg till en ny metod med namnet cipherInit i filen FingerprintDemoActivity.java för att utföra dessa uppgifter:

GetInstance-metoden för Cipher-klassen anropas för att erhålla en Cipher-instans som sedan konfigureras med de egenskaper som krävs för fingeravtrycksautentisering. Den tidigare genererade nyckeln hämtas sedan från Keystore-behållaren och används för att initiera Cipher-instansen. Fel hanteras i enlighet med detta och ett sant eller falskt resultat returneras baserat på om initialiseringsprocessen för cipher har lyckats eller inte.

Arbetet är nu slutfört för både metoderna generateKey och cipherInit. Nästa steg är att modifiera onCreate-metoden så att den anropar dessa metoder och, i händelse av en lyckad chifferinitialisering, skapar en CryptoObject-instans.

Skapande av CryptoObject-instans

Restande inom FingerprintDemoActivity.java-filen ändrar du onCreate-metoden så att den anropar de två nyskapade metoderna och genererar CryptoObject enligt följande:

Den sista uppgiften i projektet är att implementera en ny klass för att hantera själva fingeravtrycksautentiseringen.

Implementering av klassen för hantering av fingeravtrycksautentisering

Sedan tidigare i det här kapitlet har det mesta arbetet handlat om att förbereda fingeravtrycksautentiseringen när det gäller nyckel, chiffer och kryptoobjekt. Själva autentiseringen utlöses via ett anrop till autentiseringsmetoden authenticate i instansen FingerprintManager. Detta metodanrop kommer dock att utlösa en av ett antal callback-händelser beroende på om autentiseringen har lyckats eller misslyckats. Både autentiseringsmetoden och metoderna för hantering av callbacks måste implementeras i en klass som utvidgar klassen FingerprintManager.AuthenticationCallback. En sådan klass måste nu läggas till i projektet.

Navigera till posten app -> java -> com.ebookfrenzy.fingerprintdemo i verktygsfönstret Android Studio Project och högerklicka på den. Från den resulterande menyn väljer du alternativet New -> Java Class (Ny -> Javaklass) för att visa dialogrutan Create New Class (Skapa en ny klass). Namnge klassen FingerprintHandler och klicka på OK-knappen för att skapa klassen.

Redigera den nya klassfilen så att den utökar FingerprintManager.AuthenticationCallback, importerar några ytterligare moduler och implementerar en konstruktionsmetod som gör det möjligt att skicka applikationskontexten när en instans av klassen skapas (kontexten kommer att användas i callbackmetoderna för att meddela användaren om autentiseringsstatusen):

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ästan måste en metod läggas till som kan anropas för att initiera fingeravtrycksautentiseringen. När metoden anropas måste den få fingerprintManager- och CryptoObject-instanserna överlämnats. Namnge den här metoden startAuth och implementera den i FingerprintHandler.java-klassfilen på följande sätt (observera att kod också har lagts till för att återigen kontrollera att fingeravtrycksbehörighet har beviljats):

Nästan lägger du till callback-hanteringsmetoderna, varav var och en är implementerad för att visa ett toastmeddelande som anger resultatet av fingeravtrycksautentiseringen:

Den sista uppgiften innan du testar projektet är att modifiera onCreate-metoden så att den skapar en ny instans av FingerprintHandler-klassen och anropar startAuth-metoden. Redigera filen FingerprintDemoActivity.java och ändra slutet av onCreate-metoden så att den lyder som följer:

Testning av projektet

När projektet nu är färdigt kör du appen på en fysisk Android-enhet eller en emulatorsession. När du har kört, rör antingen fingeravtryckssensorn eller använd den utökade kontrollpanelen i emulatorn för att simulera en fingeravtrycksberöring enligt kapitlet Användning och konfiguration av Android Studio 2 AVD-emulatorn. Om ett registrerat fingeravtryck upptäcks visas ett toastmeddelande som visar att autentiseringen lyckats enligt figur 62-6:

Figur 62-6

Stoppa appen som körs och starta den på nytt, den här gången med ett oregistrerat fingeravtryck för att försöka autentisera. Den här gången bör ett toastmeddelande visas som visar att autentiseringen misslyckades.

Sammanfattning

Fingeravtrycksautentisering i Android är en process i flera steg som till en början kan verka komplicerad. När processen delas upp i enskilda steg blir den dock tydligare. Vid autentisering av fingeravtryck används nycklar, chiffer och nyckellagring i kombination med funktionerna i klassen FingerprintManager. Det här kapitlet har gett en introduktion till dessa steg och arbetat igenom skapandet av ett exempelapplikationsprojekt som är avsett att visa det praktiska genomförandet av autentisering av fingeravtryck i Android.

Lämna ett svar

Din e-postadress kommer inte publiceras.