Az ujjlenyomat-hitelesítés a sok Android-eszközbe épített érintésérzékelőt használja a felhasználó azonosítására, és hozzáférést biztosít mind a készülékhez, mind az alkalmazásfunkciókhoz, például az alkalmazáson belüli fizetési lehetőségekhez. Az ujjlenyomat-hitelesítés megvalósítása egy többlépcsős folyamat, amely elsőre túlterhelőnek tűnhet. Az egyes lépésekre lebontva azonban a folyamat sokkal kevésbé összetetté válik. Alapvetően az ujjlenyomat-hitelesítés elsősorban titkosításról szól, amely magában foglal egy kulcsot, egy titkosítót a titkosítás végrehajtásához és egy ujjlenyomat-kezelőt a hitelesítési folyamat kezeléséhez.
Ez a fejezet egyrészt áttekintést nyújt az ujjlenyomat-hitelesítésről, másrészt egy részletes, lépésről lépésre történő bemutatót, amely a megvalósítás gyakorlati megközelítését mutatja be.
Az ujjlenyomat-hitelesítés áttekintése
Az ujjlenyomat-hitelesítés Android-alkalmazáson belüli megvalósítása lényegében 10 lépésből áll. Ezek a lépések a következőképpen foglalhatók össze:
1. Kérjen engedélyt az ujjlenyomat-hitelesítésre a projekt Manifest fájljában.
2. Ellenőrizze, hogy annak az eszköznek a zárolási képernyője, amelyen az alkalmazás fut, PIN-kóddal, mintával vagy jelszóval védett-e (ujjlenyomatot csak olyan eszközön lehet regisztrálni, amelyen a zárolási képernyő védett).
3. Ellenőrizze, hogy legalább egy ujjlenyomatot regisztráltak-e az eszközön.
4. Hozzon létre egy példányt a FingerprintManager osztályból.
5. A FingerprintManager osztályból. Használjon egy Keystore példányt az Android Keystore tárolóhoz való hozzáféréshez. Ez egy olyan tárolóterület, amelyet a kriptográfiai kulcsok biztonságos tárolására használnak az Android eszközökön.
6. Generáljon egy titkosítási kulcsot a KeyGenerator osztály segítségével, és tárolja azt a Keystore tárolóban.
7. Inicializáljuk a Cipher osztály egy példányát az 5. lépésben generált kulcs segítségével.
8. A Cipher példány segítségével hozzunk létre egy CryptoObjectet, és rendeljük hozzá a 4. lépésben létrehozott FingerprintManager példányhoz.
9. Használjuk a Cipher példányt egy CryptoObject létrehozásához, és rendeljük hozzá a 4. lépésben létrehozott FingerprintManager példányhoz.
9. Hívja meg a FingerprintManager példány authenticate metódusát.
10. Implementáljon metódusokat a hitelesítési folyamat által kiváltott visszahívások kezelésére. A sikeres hitelesítés befejeztével biztosítson hozzáférést a védett tartalomhoz vagy funkcióhoz.
A fenti lépések mindegyikével részletesebben foglalkozik majd a fejezet hátralévő részében ismertetett bemutató során.
Az ujjlenyomat-hitelesítési projekt létrehozása
A példát az Android Studio környezet elindításával és egy új projekt létrehozásával kezdjük, a FingerprintDemo beírásával az Application name mezőbe és az ebookfrenzy.com-ot a Company Domain beállításként, mielőtt a Next gombra kattintana.
A Form factors képernyőn engedélyezze a Phone and Tablet opciót, és állítsa a minimális SDK beállítást API 23: Android 6.0 (Marshmallow) értékre. Folytassa a beállítási képernyőkön keresztül, kérve egy üres, FingerprintDemoActivity nevű tevékenység létrehozását egy megfelelő activity_fingerprint_demo nevű elrendezéssel.
A készülék ujjlenyomat-hitelesítésének beállítása
Az ujjlenyomat-hitelesítés csak azokon az eszközökön érhető el, amelyek érintésérzékelőt tartalmaznak, és amelyeken megtették a megfelelő konfigurációs lépéseket az eszköz biztosítására és legalább egy ujjlenyomat beiratkozására. Az ujjlenyomat-hitelesítés teszteléséhez szükséges emulátor-munkamenet konfigurálásának lépéseit az Android Studio 2 AVD emulátor használata és konfigurálása című fejezetben találja.
Az ujjlenyomat-hitelesítés konfigurálása fizikai eszközön a Beállítások alkalmazás megnyitásával és a Biztonság opció kiválasztásával kezdődik. A Biztonsági beállítások képernyőn belül válassza az Ujjlenyomat opciót. A megjelenő információs képernyőn kattintson a Folytatás gombra az Ujjlenyomat beállítási képernyőre való továbblépéshez. Az ujjlenyomatos biztonság engedélyezése előtt be kell állítani egy tartalék képernyőfeloldási módszert (például PIN-kódot). Kattintson a Képernyőzár beállítása gombra, ha a zárolási képernyő még nincs biztosítva, és kövesse a PIN-kód, minta vagy jelszó biztonságának beállításához szükséges lépéseket.
A zárolási képernyő biztosításával lépjen az ujjlenyomat-felismerő képernyőre, és érintse meg az érzékelőt, amikor erre felszólítják (62-1. ábra), szükség esetén ismételje meg a folyamatot további ujjlenyomatok hozzáadásához.
62-1. ábra
Az ujjlenyomat-engedély hozzáadása a manifeszt fájlhoz
Az ujjlenyomat-hitelesítéshez az alkalmazásnak a USE_FINGERPRINT engedélyt kell kérnie a projekt manifeszt fájljában. Az Android Studio Project eszközablakában keresse meg és szerkessze az alkalmazás -> manifests -> AndroidManifest.xml fájlját, hogy hozzáadja az engedélykérést az alábbiak szerint:
Az ujjlenyomat ikon letöltése
A Google biztosít egy szabványos ikont (62-2. ábra), amelyet meg kell jeleníteni, amikor az alkalmazás hitelesítést kér a felhasználótól.
62-2. ábra
Az ikon másolata letölthető a következő URL-címről:
Nyissa meg az operációs rendszer fájlrendszer-navigátorát, válassza ki az újonnan letöltött képet, és nyomja meg a Ctrl-C (Mac OS X esetén a Cmd-C) billentyűt a fájl másolásához. Térjen vissza az Android Studio programba, kattintson a jobb gombbal az app -> res -> drawable mappára, és válassza a Beillesztés menüpontot a képfájl másolatának a projekthez való hozzáadásához. Amikor megjelenik a Másolás párbeszédpanel, kattintson az OK gombra az alapértelmezett beállítások használatához.
A felhasználói felület tervezése
A példa minél egyszerűbbé tétele érdekében a felhasználói felületen belül csak egy TextView és egy ImageView lesz az egyetlen elem. Keresse meg és válassza ki az activity_fingerprint_demo.xml elrendezési erőforrásfájlt, hogy betöltse azt a Designer eszközbe. A betöltés után törölje a minta TextView objektumát, húzzon egy ImageView objektumot a panelről, és helyezze azt az elrendezési vászon közepére.
A Properties panelen keresse meg az src attribútumot, kattintson a megfelelő szövegmezőbe, majd a 62-3. ábrán kiemelt gombra az erőforrások párbeszédpanel megjelenítéséhez:
62-3. ábra
A párbeszédpanel bal oldali paneljén válassza a Drawable opciót. A főpanelen belül a 62 4. ábrán látható módon írja be a keresőmezőbe az ic_fp-t az ujjlenyomat ikon megkereséséhez. Válassza ki az ikont a párbeszédpanelen, és kattintson az OK gombra, hogy hozzárendelje az ImageView objektumhoz.
62-4. ábra
Keresze meg a Nagy szöveg objektumot a palettáról, és húzza el úgy, hogy az ImageView objektum alatt helyezkedjen el. Kattintson duplán az objektumra, és módosítsa a szöveget úgy, hogy “Touch Sensor” (Érintésérzékelő) legyen rajta. Használja az izzó ikont a karakterlánc kivonásához a touch_sensor nevű erőforrásba.
A fenti lépések elvégzése után az elrendezésnek meg kell egyeznie a 62-5. ábrán láthatóval:
62-5. ábra
A Keyguard és Fingerprint Manager szolgáltatások elérése
Az ujjlenyomat-hitelesítés két rendszerszolgáltatást használ a KeyguardManager és a FingerprintManager formájában. Szerkesszük meg a FingerprintDemoActivity.java fájlban található onCreate metódust, hogy megkapjuk a két szolgáltatásra való hivatkozásokat az alábbiak szerint:
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); }}
A biztonsági beállítások ellenőrzése
A fejezet korábbi részében lépéseket tettünk a zárolási képernyő konfigurálására és az ujjlenyomatok regisztrálására azon az eszközön vagy emulátoron, amelyen az alkalmazást tesztelni fogjuk. Fontos azonban, hogy védekező kódot építsünk be az alkalmazásba, hogy megbizonyosodjunk arról, hogy ezek a követelmények teljesülnek, mielőtt megpróbálnánk ujjlenyomat-hitelesítést kérni. Ezeket a lépéseket a FingerprintDemoActivity.java fájlban található onCreate metóduson belül kell végrehajtani, a Keyguard és a Fingerprint manager szolgáltatások felhasználásával. Megjegyzendő, hogy kódot adtunk hozzá annak ellenőrzésére is, hogy a USE_FINGERPRINT engedélyt konfiguráltuk-e az alkalmazáshoz:
A fenti kódváltoztatások a Keyguard menedzser használatával kezdődnek annak ellenőrzésére, hogy a képernyő feloldásának tartalék módszere konfigurálva van-e (más szóval egy PIN-kód vagy más hitelesítési módszer használható az ujjlenyomat-hitelesítés helyett a képernyő feloldásához). Abban az esetben, ha a képernyőzár nem biztosított, a kód jelenti a problémát a felhasználónak, és visszatér a módszerből.
Az ujjlenyomatkezelő ezután annak ellenőrzésére szolgál, hogy legalább egy ujjlenyomat regisztrálva van-e a készüléken, és ismét jelenti a problémát, és szükség esetén visszatér a módszerből.
Az Android Keystore és a KeyGenerator elérése
Az ujjlenyomat-hitelesítési folyamat része egy titkosítási kulcs generálása, amelyet az Android Keystore rendszer segítségével biztonságosan tárolnak az eszközön. A kulcs generálása és tárolása előtt az alkalmazásnak először hozzáférést kell szereznie a Keystore-hoz. A FingerprintDemoActivity.java fájlban most egy új, generateKey nevű metódus kerül implementálásra a kulcsgenerálási és tárolási feladatok elvégzésére. Kezdetben csak a Keystore eléréséhez szükséges kód lesz hozzáadva az alábbiak szerint:
A Keystore-ra való hivatkozás a Keystore osztály getInstance metódusának meghívásával és a szabványos Android keystore tároló (“AndroidKeyStore”) azonosítójának átadásával érhető el. A bemutató következő lépése a kulcs generálása lesz a KeyGenerator szolgáltatás segítségével. A kulcs generálása előtt kódot kell hozzáadni a KeyGenerator egy példányára való hivatkozás megszerzéséhez, argumentumként átadva a generálandó kulcs típusát és a Keystore tároló nevét, amelybe a kulcsot el kell menteni:
A kulcs generálása
Most, hogy rendelkezünk az Android Keystore tárolóra való hivatkozással és egy KeyGenerator példánnyal, a következő lépés a kulcs generálása, amelyet a titkosítási folyamathoz használt rejtjel létrehozásához fogunk használni. A FingerprintDemoActivity.java fájlban maradva adjuk hozzá ezt az új kódot az alábbiak szerint:
A fenti változtatások némi magyarázatot igényelnek. Számos további modul importálása után a kód deklarál egy string változót, amely a kulcs Keystore konténerben történő tárolásakor használt nevet (ebben az esetben “example_key”) képviseli.
A következő lépés a keystore konténer betöltése és a KeyGenerator inicializálása. Ez az inicializálási folyamat a KeyGenParameterSpec.Builder osztályt használja a generálandó kulcs típusának megadásához. Ez magában foglalja a kulcs nevére való hivatkozást, a kulcs konfigurálását úgy, hogy az mind titkosításra, mind visszafejtésre használható legyen, valamint a különböző titkosítási paraméterek beállítását. A setUserAuthenticationRequired metódushívás úgy konfigurálja a kulcsot, hogy a felhasználónak a kulcs minden használatát ujjlenyomat-hitelesítéssel kelljen engedélyeznie. A KeyGenerator konfigurálása után a kulcs generálása a példány generateKey metódusának meghívásával történik.
A Cipher inicializálása
A kulcs generálása után a következő lépés a titkosítás inicializálása, amely a titkosított FingerprintManager.CryptoObject példány létrehozására szolgál. Ezt a CryptoObjectet viszont az ujjlenyomat-hitelesítési folyamat során fogjuk használni. A Cipher konfigurálása magában foglalja egy Cipher példány beszerzését és inicializálását a Keystore tárolóban tárolt kulccsal. Adjunk hozzá egy új, cipherInit nevű metódust a FingerprintDemoActivity.java fájlhoz, amely elvégzi ezeket a feladatokat:
A Cipher osztály getInstance metódusát hívjuk meg egy Cipher példány megszerzéséhez, amelyet ezt követően konfigurálunk az ujjlenyomat-hitelesítéshez szükséges tulajdonságokkal. Ezután a korábban generált kulcsot kivonjuk a Keystore tárolóból, és a Cipher példány inicializálásához használjuk. A hibák kezelése ennek megfelelően történik, és a titkosító inicializálási folyamat sikeressége vagy sikertelensége alapján igaz vagy hamis eredményt kapunk vissza.
A munka mostanra befejeződött mind a generateKey, mind a cipherInit metódusokon. A következő lépés az onCreate metódus módosítása, hogy meghívja ezeket a metódusokat, és sikeres rejtjel inicializálás esetén létrehozzon egy CryptoObject példányt.
CryptoObject példány létrehozása
A FingerprintDemoActivity-n belül megmaradt.java fájlban módosítsuk az onCreate metódust, hogy meghívja a két újonnan létrehozott metódust, és a következőképpen hozzuk létre a CryptoObjectet:
A projekt utolsó feladata egy új osztály implementálása a tényleges ujjlenyomat-hitelesítés kezelésére.
Implementing the Fingerprint Authentication Handler Class
A fejezetben eddig a munka nagy része az ujjlenyomat-hitelesítés előkészítésével foglalkozott a kulcs, a titkosítás és a kripto-objektum tekintetében. A tényleges hitelesítés a FingerprintManager példány authenticate metódusának meghívásával történik. Ez a metódushívás azonban a hitelesítés sikerétől vagy sikertelenségétől függően számos visszahívási esemény egyikét váltja ki. Mind az authenticate metódushívást, mind a visszahíváskezelő metódusokat egy olyan osztályban kell implementálni, amely a FingerprintManager.AuthenticationCallback osztályt bővíti. Egy ilyen osztályt kell most hozzáadni a projekthez.
Navigáljon az Android Studio Project eszközablakában az app -> java -> com.ebookfrenzy.fingerprintdemo bejegyzéshez, és kattintson rá a jobb gombbal. A megjelenő menüből válassza az Új -> Java osztály opciót az Új osztály létrehozása párbeszédpanel megjelenítéséhez. Nevezze el az osztályt FingerprintHandler-nek, és kattintson az OK gombra az osztály létrehozásához.
Szerkessze az új osztályfájlt úgy, hogy az kiterjeszti a FingerprintManager-t.AuthenticationCallback, importáljon néhány további modult, és implementáljon egy konstruktor metódust, amely lehetővé teszi az alkalmazás kontextusának átadását az osztály példányának létrehozásakor (a kontextust a visszahívási metódusok fogják használni a felhasználó hitelesítési állapotáról szóló értesítéshez):
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; }}
A következőkben egy olyan metódust kell hozzáadni, amely az ujjlenyomat-hitelesítés elindításához hívható. Meghívásakor ennek a metódusnak át kell adni a FingerprintManager és a CryptoObject példányokat. Nevezzük el ezt a metódust startAuth-nak, és valósítsuk meg a FingerprintHandlerben.java osztályfájlt az alábbiak szerint (vegye figyelembe, hogy a kódot hozzáadtuk az ujjlenyomat-engedély megadásának ismételt ellenőrzéséhez is):
Ezután adjuk hozzá a callback kezelő metódusokat, amelyek mindegyike úgy van implementálva, hogy az ujjlenyomat-hitelesítés eredményét jelző toast üzenetet jelenítsen meg:
A projekt tesztelése előtti utolsó feladat az onCreate metódus módosítása, hogy az létrehozza a FingerprintHandler osztály új példányát, és meghívja a startAuth metódust. Szerkesszük meg a FingerprintDemoActivity.java fájlt, és módosítsuk az onCreate metódus végét úgy, hogy az a következőképpen szóljon:
A projekt tesztelése
A projekt elkészültével futtassa az alkalmazást egy fizikai Android-eszközön vagy emulátoros munkamenetben. A futtatás után vagy érintse meg az ujjlenyomat-érzékelőt, vagy használja a kiterjesztett vezérlőpanelt az emulátoron belül az Android Studio 2 AVD emulátor használata és konfigurálása című fejezetben leírtak szerint az ujjlenyomat-érintés szimulálására. Feltételezve, hogy regisztrált ujjlenyomatot észlel, a 62-6. ábrán látható módon megjelenik a sikeres hitelesítést jelző pirítós üzenet:
62-6. ábra
Állítsa le a futó alkalmazást, és indítsa újra, ezúttal egy nem regisztrált ujjlenyomatot használva a hitelesítési kísérlethez. Ezúttal egy pirítós üzenetnek kell megjelennie, amely jelzi, hogy a hitelesítés sikertelen volt.
Összefoglaló
Az ujjlenyomat-hitelesítés az Androidon belül egy többlépcsős folyamat, amely kezdetben bonyolultnak tűnhet. Az egyes lépésekre lebontva azonban a folyamat áttekinthetőbbé válik. Az ujjlenyomat-hitelesítés a FingerprintManager osztály funkcióival kombinált kulcsok, kódok és kulcstárolás használatát foglalja magában. Ez a fejezet bevezetést nyújtott ezekbe a lépésekbe, és egy olyan példaprojekt létrehozását dolgozta fel, amely az ujjlenyomat-hitelesítés Androidon belüli gyakorlati megvalósítását hivatott bemutatni.