Autentificarea prin amprentă digitală utilizează senzorul tactil încorporat în multe dispozitive Android pentru a identifica utilizatorul și a oferi acces atât la dispozitiv, cât și la funcționalitatea aplicației, cum ar fi opțiunile de plată în aplicație. Implementarea autentificării prin amprentă digitală este un proces în mai mulți pași care, la început, poate părea copleșitor. Cu toate acestea, atunci când este împărțit în etape individuale, procesul devine mult mai puțin complex. În termeni de bază, autentificarea amprentelor digitale este în primul rând o chestiune de criptare care implică o cheie, un cifru pentru a efectua criptarea și un manager de amprente digitale pentru a gestiona procesul de autentificare.
Acest capitol oferă atât o prezentare generală a autentificării amprentelor digitale, cât și un tutorial detaliat, pas cu pas, care demonstrează o abordare practică a implementării.
O privire de ansamblu asupra autentificării prin amprentă digitală
Există în esență 10 pași pentru implementarea autentificării prin amprentă digitală în cadrul unei aplicații Android. Acești pași pot fi rezumați după cum urmează:
1. Cereți permisiunea de autentificare a amprentelor digitale în cadrul fișierului Manifest al proiectului.
2. Verificați dacă ecranul de blocare al dispozitivului pe care rulează aplicația este protejat de un PIN, un model sau o parolă (amprentele digitale pot fi înregistrate numai pe dispozitive pe care ecranul de blocare a fost securizat).
3. Verificați dacă cel puțin o amprentă digitală a fost înregistrată pe dispozitiv.
4. Creați o instanță a clasei FingerprintManager.
5. Utilizați o instanță Keystore pentru a obține acces la containerul Android Keystore. Aceasta este o zonă de stocare utilizată pentru stocarea securizată a cheilor criptografice pe dispozitivele Android.
6. Generați o cheie de criptare utilizând clasa KeyGenerator și stocați-o în containerul Keystore.
7. Inițializați o instanță a clasei Cipher folosind cheia generată la pasul 5.
8. Utilizați instanța Cipher pentru a crea un CryptoObject și atribuiți-l instanței FingerprintManager creată la pasul 4.
9. Apelați metoda de autentificare a instanței FingerprintManager.
10. Implementați metode pentru a gestiona callback-urile declanșate de procesul de autentificare. Oferiți acces la conținutul sau la funcționalitatea protejată la finalizarea unei autentificări reușite.
Care dintre etapele de mai sus va fi abordată mai detaliat pe parcursul tutorialului prezentat în restul acestui capitol.
Crearea proiectului de autentificare a amprentelor digitale
Începeți acest exemplu lansând mediul Android Studio și creând un nou proiect, introducând FingerprintDemo în câmpul Application name și ebookfrenzy.com ca setare Company Domain (Domeniu companie) înainte de a face clic pe butonul Next (Următorul).
În ecranul form factors (Factori de formă), activați opțiunea Phone and Tablet (Telefon și tabletă) și setați setarea minimă SDK la API 23: Android 6.0 (Marshmallow). Continuați prin ecranele de configurare, solicitând crearea unei activități goale numite FingerprintDemoActivity cu un aspect corespunzător numit activity_fingerprint_demo.
Configurarea autentificării amprentei digitale a dispozitivului
Autentificarea amprentei digitale este disponibilă numai pe dispozitivele care conțin un senzor tactil și pe care au fost parcurse etapele de configurare corespunzătoare pentru a securiza dispozitivul și a înrola cel puțin o amprentă digitală. Pentru pașii de configurare a unei sesiuni de emulator pentru a testa autentificarea prin amprentă digitală, consultați capitolul intitulat Utilizarea și configurarea emulatorului AVD Android Studio 2.
Pentru a configura autentificarea prin amprentă digitală pe un dispozitiv fizic, începeți prin a deschide aplicația Settings (Setări) și a selecta opțiunea Security (Securitate). În cadrul ecranului Security settings (Setări de securitate), selectați opțiunea Fingerprint (Amprentă digitală). În ecranul de informații rezultat, faceți clic pe butonul Continue (Continuare) pentru a trece la ecranul de configurare a amprentei digitale. Înainte de a activa securitatea prin amprentă digitală, trebuie să fie configurată o metodă de rezervă de deblocare a ecranului (cum ar fi un număr PIN). Faceți clic pe butonul Set Up Screen Lock (Configurare blocare ecran) dacă ecranul de blocare nu este deja securizat și urmați pașii pentru a configura securitatea prin PIN, model sau parolă.
După ce ecranul de blocare este securizat, treceți la ecranul de detectare a amprentelor digitale și atingeți senzorul atunci când vi se solicită acest lucru (Figura 62-1), repetând procesul pentru a adăuga amprente digitale suplimentare, dacă este necesar.
Figura 62-1
Aducerea permisiunii pentru amprente în fișierul manifest
Autentificarea prin amprente necesită ca aplicația să solicite permisiunea USE_FINGERPRINT în cadrul fișierului manifest al proiectului. În cadrul ferestrei instrumentului Android Studio Project localizați și editați fișierul app -> manifests -> AndroidManifest.xml pentru a adăuga solicitarea permisiunii după cum urmează:
Încărcarea pictogramei amprentei digitale
Google furnizează o pictogramă standard (figura 62-2) care trebuie afișată ori de câte ori o aplicație solicită autentificarea de la un utilizator.
Figura 62-2
O copie a acestei pictograme poate fi descărcată de la următorul URL:
Deschideți navigatorul sistemului de fișiere pentru sistemul dumneavoastră de operare, selectați imaginea nou descărcată și apăsați Ctrl-C (Cmd-C pe Mac OS X) pentru a copia fișierul. Reveniți în Android Studio, faceți clic dreapta pe folderul app -> res -> drawable și selectați opțiunea de meniu Paste (Lipire) pentru a adăuga o copie a fișierului imagine în proiect. Când apare caseta de dialog Copy, faceți clic pe butonul OK pentru a utiliza setările implicite.
Designing the User Interface
În scopul de a păstra exemplul cât mai simplu posibil, singurele elemente din cadrul interfeței cu utilizatorul vor fi un TextView și un ImageView. Localizați și selectați fișierul de resurse de aspect activity_fingerprint_demo.xml pentru a-l încărca în instrumentul Designer. După ce a fost încărcat, ștergeți obiectul TextView de exemplu, trageți și fixați un obiect ImageView din panou și poziționați-l în centrul tabloului de aspect.
În cadrul panoului Properties, localizați atributul src, faceți clic în câmpul de text corespunzător, urmat de butonul evidențiat în figura 62-3 pentru a afișa caseta de dialog Resources:
Figura 62-3
Din panoul din stânga al casetei de dialog selectați opțiunea Drawable. În cadrul panoului principal, introduceți ic_fp în caseta de căutare, așa cum este ilustrat în figura 62 4, pentru a localiza pictograma amprentă. Selectați pictograma din fereastra de dialog și faceți clic pe OK pentru a o atribui obiectului ImageView.
Figura 62-4
Localizați obiectul Large Text din paletă și trageți-l și fixați-l astfel încât să fie poziționat sub obiectul ImageView. Faceți dublu clic pe obiect și modificați textul astfel încât să se citească „Touch Sensor”. Utilizați pictograma bec pentru a extrage șirul într-o resursă numită touch_sensor.
La finalizarea pașilor de mai sus, aspectul ar trebui să corespundă cu cel prezentat în figura 62-5:
Figura 62-5
Accesarea serviciilor Keyguard și Fingerprint Manager
Autentificarea prin amprentă digitală utilizează două servicii de sistem sub forma KeyguardManager și FingerprintManager. Modificați metoda onCreate localizată în fișierul FingerprintDemoActivity.java pentru a obține referințe la aceste două servicii, după cum urmează:
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); }}
Verificarea setărilor de securitate
Anterior, în acest capitol, au fost parcurși pașii pentru configurarea ecranului de blocare și înregistrarea amprentelor digitale pe dispozitivul sau emulatorul pe care urmează să fie testată aplicația. Cu toate acestea, este important să includeți codul defensiv în aplicație pentru a vă asigura că aceste cerințe au fost îndeplinite înainte de a încerca să solicitați autentificarea prin amprente. Acești pași vor fi realizați în cadrul metodei onCreate care se află în fișierul FingerprintDemoActivity.java, utilizând serviciile Keyguard și Fingerprint manager. Rețineți că a fost adăugat, de asemenea, cod pentru a verifica dacă permisiunea USE_FINGERPRINT a fost configurată pentru aplicație:
Modificările de cod de mai sus încep prin utilizarea managerului Keyguard pentru a verifica dacă a fost configurată o metodă de rezervă de deblocare a ecranului (cu alte cuvinte, un PIN sau o altă metodă de autentificare poate fi utilizată ca alternativă la autentificarea prin amprentă digitală pentru a debloca ecranul). În cazul în care ecranul de blocare nu este securizat, codul raportează problema utilizatorului și revine de la metodă.
Managerul de amprente digitale este apoi utilizat pentru a verifica dacă cel puțin o amprentă digitală a fost înregistrată pe dispozitiv, raportând din nou problema și revenind de la metodă dacă este necesar.
Accesul la Android Keystore și la KeyGenerator
O parte a procesului de autentificare a amprentelor digitale implică generarea unei chei de criptare care este apoi stocată în siguranță pe dispozitiv folosind sistemul Android Keystore. Înainte ca această cheie să poată fi generată și stocată, aplicația trebuie mai întâi să obțină acces la Keystore. În fișierul FingerprintDemoActivity.java va fi implementată acum o nouă metodă denumită generateKey pentru a efectua sarcinile de generare și stocare a cheii. Inițial, se va adăuga doar codul de acces la Keystore, după cum urmează:
O referință la Keystore se obține prin apelarea metodei getInstance a clasei Keystore și prin trecerea identificatorului containerului standard Android keystore („AndroidKeyStore”). Următoarea etapă a tutorialului va consta în generarea unei chei cu ajutorul serviciului KeyGenerator. Înainte de a genera această cheie, trebuie adăugat cod pentru a obține o referință la o instanță a serviciului KeyGenerator, trecând ca argumente tipul de cheie care urmează să fie generată și numele containerului Keystore în care urmează să fie salvată cheia:
Generarea cheii
Acum că avem o referință la containerul Android Keystore și o instanță KeyGenerator, următorul pas este generarea cheii care va fi utilizată pentru a crea un cifru pentru procesul de criptare. Rămânând în fișierul FingerprintDemoActivity.java, adăugați acest cod nou după cum urmează:
Modificările de mai sus necesită câteva explicații. După importarea unui număr de module suplimentare, codul declară o variabilă de tip șir de caractere reprezentând numele (în acest caz „exemplu_cheie”) care va fi folosit la stocarea cheii în containerul Keystore.
În continuare, containerul keystore este încărcat și KeyGenerator este inițializat. Acest proces de inițializare se folosește de clasa KeyGenParameterSpec.Builder pentru a specifica tipul de cheie care se generează. Aceasta include referința la numele cheii, configurarea cheii astfel încât să poată fi utilizată atât pentru criptare, cât și pentru decriptare și setarea diverșilor parametri de criptare. Apelarea metodei setUserAuthenticationRequired configurează cheia astfel încât utilizatorul să fie obligat să autorizeze fiecare utilizare a cheii cu o autentificare prin amprentă digitală. Odată ce KeyGenerator a fost configurat, acesta este utilizat pentru a genera cheia printr-un apel la metoda generateKey a instanței.
Inițializarea cifrului
Acum că a fost generată cheia, următorul pas este inițializarea cifrului care va fi utilizat pentru a crea instanța criptată FingerprintManager.CryptoObject. Acest CryptoObject va fi, la rândul său, utilizat în timpul procesului de autentificare a amprentelor digitale. Configurarea cifrului presupune obținerea unei instanțe Cipher și inițializarea acesteia cu cheia stocată în containerul Keystore. Adăugați o nouă metodă numită cipherInit în fișierul FingerprintDemoActivity.java pentru a efectua aceste sarcini:
Metoda getInstance a clasei Cipher este apelată pentru a obține o instanță Cipher care este ulterior configurată cu proprietățile necesare pentru autentificarea amprentelor digitale. Cheia generată anterior este apoi extrasă din containerul Keystore și utilizată pentru a inițializa instanța Cipher. Erorile sunt tratate în mod corespunzător, iar un rezultat adevărat sau fals este returnat pe baza succesului sau nu al procesului de inițializare a cifrului.
Lucrarea este acum finalizată atât pentru metodele generateKey, cât și pentru cipherInit. Următorul pas este să modificăm metoda onCreate pentru a apela aceste metode și, în cazul unei inițializări reușite a cifrului, să creăm o instanță CryptoObject.
Crearea instanței CryptoObject
Rămâne în cadrul FingerprintDemoActivity.java, modificați metoda onCreate pentru a apela cele două metode nou create și generați CryptoObject după cum urmează:
Tara finală a proiectului este de a implementa o nouă clasă care să gestioneze autentificarea efectivă a amprentelor digitale.
Implementarea clasei Fingerprint Authentication Handler Class
Până acum, în acest capitol, cea mai mare parte a muncii a implicat pregătirea pentru autentificarea amprentelor digitale în ceea ce privește cheia, cifrul și obiectul cripto. Autentificarea propriu-zisă este declanșată prin intermediul unui apel la metoda authenticate a instanței FingerprintManager. Cu toate acestea, apelul la această metodă va declanșa unul dintre o serie de evenimente callback în funcție de succesul sau eșecul autentificării. Atât apelul la metoda de autentificare, cât și metodele de gestionare a apelurilor de răspuns trebuie să fie implementate într-o clasă care extinde clasa FingerprintManager.AuthenticationCallback. O astfel de clasă trebuie acum adăugată în proiect.
Navigați la intrarea app -> java -> com.ebookfrenzy.fingerprintdemo din cadrul ferestrei instrumentului Android Studio Project și faceți clic dreapta pe ea. Din meniul rezultat, selectați opțiunea New -> Java Class pentru a afișa caseta de dialog Create New Class. Numiți clasa FingerprintHandler și faceți clic pe butonul OK pentru a crea clasa.
Editați noul fișier de clasă astfel încât să extindă FingerprintManager.AuthenticationCallback, să importe câteva module suplimentare și să implementeze o metodă de constructor care va permite trecerea contextului aplicației atunci când este creată o instanță a clasei (contextul va fi utilizat în metodele de callback pentru a notifica utilizatorul cu privire la starea autentificării):
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 continuare trebuie adăugată o metodă care poate fi apelată pentru a iniția autentificarea amprentei digitale. Atunci când este apelată, acestei metode vor trebui să i se transmită instanțele FingerprintManager și CryptoObject. Numiți această metodă startAuth și implementați-o în FingerprintHandler.java după cum urmează (rețineți că a fost adăugat, de asemenea, cod pentru a verifica încă o dată dacă a fost acordată permisiunea pentru amprenta digitală):
În continuare, adăugați metodele handler callback, fiecare dintre acestea fiind implementată pentru a afișa un mesaj de tip toast care să indice rezultatul autentificării amprentei digitale:
Următoarea sarcină înainte de testarea proiectului este să modificați metoda onCreate astfel încât să creeze o nouă instanță a clasei FingerprintHandler și să apeleze metoda startAuth. Editați fișierul FingerprintDemoActivity.java și modificați sfârșitul metodei onCreate astfel încât să fie redat după cum urmează:
Testarea proiectului
Cu proiectul acum finalizat, rulați aplicația pe un dispozitiv Android fizic sau pe o sesiune de emulator. Odată rulat, fie atingeți senzorul de amprentă, fie utilizați panoul de control extins din cadrul emulatorului pentru a simula o atingere cu amprenta digitală, așa cum se arată în capitolul intitulat Utilizarea și configurarea emulatorului AVD Android Studio 2. Presupunând că este detectată o amprentă digitală înregistrată, va apărea un mesaj de toast care indică o autentificare reușită, așa cum se arată în figura 62-6:
Figura 62-6
Încetați aplicația în curs de execuție și relansați-o, de data aceasta folosind o amprentă digitală neînregistrată pentru a încerca autentificarea. De data aceasta ar trebui să apară un mesaj de toast care să indice faptul că autentificarea a eșuat.
Rezumat
Autentificarea prin amprentă digitală în cadrul Android este un proces în mai mulți pași care poate părea inițial complex. Cu toate acestea, atunci când este împărțit în pași individuali, procesul devine mai clar. Autentificarea amprentelor digitale implică utilizarea cheilor, a cifrului și a stocării cheilor, combinate cu caracteristicile clasei FingerprintManager. Acest capitol a oferit o introducere în aceste etape și a lucrat la crearea unui proiect de aplicație de exemplu menit să arate implementarea practică a autentificării amprentelor digitale în cadrul Android.
.