de Kathy Dinh

Cum se implementează autentificarea biometrică sigură pe dispozitivele mobile

Cum se implementeaza autentificarea biometrica sigura pe dispozitivele mobile

O căutare rapidă pentru autentificarea biometrică React Native vă va oferi mai multe tutoriale. Acesta a fost primul lucru pe care l-am făcut când a fost nevoie de o astfel de caracteristică într-unul din proiectele mele. În funcție de nivelul de risc acceptabil pentru aplicația dvs., una dintre aceste soluții ar putea fi potrivită. Pentru o aplicație cu risc ridicat ca a noastră, nu ar trece testele de securitate.

Dacă doriți să adăugați o autentificare biometrică sigură la aa Aplicația React Native iOS, esti in locul potrivit.

Ce este în neregulă cu react-native-touchid?

Majoritatea implementărilor folosesc react-native-touchid pachet. La linia 65 în TouchID.m fișier, autentifica metoda apelează următoarea metodă LAContext atunci când se încearcă autentificarea TouchID / FaceID:

evaluatePolicy:localizedReason:reply:^(BOOL success, NSError *error)

Metoda se bazează pe o verificare de autentificare locală dacă amprenta furnizată se potrivește cu cea înregistrată pe dispozitiv. Când trece verificarea, se returnează un boolean de succes și utilizatorul s-a autentificat cu succes cu TouchID / FaceID.

Au existat rapoarte despre posibilitatea de a ocoli autentificarea locală prin trimiterea unui semnal de succes către API-urile Apple pe dispozitive iOS jailbroken sau non-jailbroken. Astfel, autentificarea biometrică prin autentificarea locală este vulnerabilă la falsificarea de către un atacator care ar putea interfera cu verificarea în timpul rulării.

Care este modalitatea sigură de a implementa autentificarea biometrică?

Pentru a implementa autentificarea biometrică într-o aplicație iOS, există două moduri – fie prin API-urile locale de autentificare Apple, fie prin intermediul controlul accesului la serviciile Keychain furnizate nativ de sistemul de bază.

Autentificarea cu autentificare locală este mai simplă, dar în general nu este recomandată pentru aplicațiile critice. Așa cum a fost descris în secțiunea anterioară, autentificarea locală este un API de nivel înalt al cărui comportament poate fi suprascris, adică un atacator ar putea falsifica o autentificare reușită schimbând răspunsul API-ului.

Este recunoscut cea mai bună practică de utilizare a serviciilor Keychain pentru implementarea autentificării biometrice în aplicații cu risc ridicat. Keychain Services impune controlul accesului la conținutul său stocat utilizând funcționalitatea oferită de iOS și Enclavă sigură. Procesul se execută la nivelul hardware și al sistemului de operare și astfel minimizează expunerea la stratul de aplicație mai puțin de încredere. Riscurile de securitate există atunci când utilizatorul se află pe un dispozitiv jailbroken sau infectat cu malware, dar aceste amenințări pot fi atenuate de tehnologia de gestionare a dispozitivelor mobile (MDM).

Cum implementăm autentificarea biometrică cu Keychain Services?

Pentru a accesa serviciile Keychain din aplicația noastră React Native, vom folosi pachetul react-native-keychain. Exemplul de cod este în TypeScript, care ar trebui să fie ușor convertit în JavaScript.

Primul, instalare react-native-keychain și declarația de tip a acestuia ca dependență de proiect:

npm i -S react-native-keychain
npm i -S @types/react-native-keychain

Apoi, trebuie conectați biblioteca întrucât depinde de componenta nativă. Există două moduri de legare a bibliotecilor într-o aplicație React Native: conectarea automată și conectarea manuală. Am întâmpinat multe erori cu CocoaPods în timp ce efectuau conectarea automată. Conectarea manuală funcționează, dar implică mulți pași.

Am descoperit că biblioteca este legată corect fără erori dacă rulați link react-native după îndepărtarea temporară Podfile în dosarul iOS. Pentru a vă salva bătaia de cap, să urmăm o astfel de abordare hibridă. Presupunând că codul dvs. este sub controlul versiunii pentru a putea reveni în siguranță orice modificări, ștergeți Podfile, atunci rulați comanda de conectare:

react-native link react-native-keychain

Acum, anulați ștergerea Podfile. Pentru iOS 10 va trebui să activați Keychain Sharing drept în Capabilities secțiunea din ținta dvs. de construire.

Cum se implementeaza autentificarea biometrica sigura pe dispozitivele mobile

Adăugați următoarea pereche de valori cheie la Info.plist:

<key>NSFaceIDUsageDescription</key><string>Enabling Face ID allows you quick and secure access to your account.</string>

Apoi, reconstruiți-vă proiectul cu:

react-native run-ios

În cazul în care întâmpinați dificultăți la instalarea react-native-keychain, consultați acest lucru GitHub README.

Înainte de a cere utilizatorului să se autentifice cu TouchID / FaceID, este înțelept să verificați dacă dispozitivul iOS al utilizatorului acceptă o astfel de capacitate apelând getSupportedBiometryType:

1611391207 459 Cum se implementeaza autentificarea biometrica sigura pe dispozitivele mobile

După confirmarea faptului că autentificarea biometrică este acceptată, trebuie să salvați un conținut în breloc și să setați semnalizatoarele de control al accesului. Conținutul ar putea fi acreditări de utilizator sau un anumit jeton de acces. Intrarea brelocului este criptată și stocată într-un spațiu de stocare securizat. Pentru a stoca o valoare în breloc, apelați setGenericPassword :

1611391207 117 Cum se implementeaza autentificarea biometrica sigura pe dispozitivele mobile

Câteva puncte de remarcat aici:

  • Setare controlul accesului la oricare dintre acestea Keychain.ACCESS_CONTROL valorile enum BIOMETRY_ANY , BIOMETRY_CURRENT_SET , BIOMETRY_ANY_OR_DEVICE_PASSCODE , BIOMETRY_CURRENT_SET_OR_DEVICE_PASSCODE impune ca utilizatorul să se autentifice cu TouchID / FaceID ori de câte ori încercăm să recuperăm elementul breloc.
  • De asemenea, am stabilit accesibil la Keychain.ACCESSIBLE valoarea enum WHEN_PASSCODE_SET_THIS_DEVICE_ONLY . Aceasta este cea mai strictă constrângere accesibilă, care impune:
Your device must be unlocked for the secret to be accessible.
Your device must have a device passcode set.
If you turn off your device passcode, the secret is deleted.
The secret cannot be restored to a different device.
The secret is not included in iCloud backups.

În cele din urmă, declanșăm solicitarea de autentificare TouchID / FaceID încercând să accesăm valoarea brelocului stocată anterior cu getGenericPassword :

1611391208 6 Cum se implementeaza autentificarea biometrica sigura pe dispozitivele mobile

Deoarece ne-am salvat secretul cu controlul accesului anterior, accesarea elementului necesită ca utilizatorul să treacă autentificarea biometrică. Când autentificarea are succes, rezultatul returnează un obiect al cărui nume de utilizator este „numele-tău-secret”, parola este „valoarea-voastră secretă” și serviciu este „numele dvs. de serviciu”.

După 5 încercări eșuate de autentificare TouchID / FaceID la nivel de sistem, autentificarea biometrică este dezactivată peste tot pe dispozitiv. Utilizatorul trebuie să blocheze și să deblocheze dispozitivul cu o parolă pentru a reactiva TouchID / FaceID. De aceea, la linia 14 trebuie să verificăm tipul de biometrie acceptat și să gestionăm cazul în mod corespunzător, de exemplu, solicitând utilizatorului să se conecteze cu numele de utilizator / parola.

Avertismente

Deși autentificarea biometrică cu react-native-keychain este potrivită pentru aplicații critice, există câteva avertismente pe care aș dori să le aduc în atenție:

Există niciun cod de rezervă alternativ. Este posibil să primiți cerința de a permite utilizatorului să se autentifice cu codul de acces al dispozitivului. Uitându-vă la README al pachetului, ar trebui să găsiți Keychain.ACCESS_CONTROL chei enum DEVICE_PASSCODE , BIOMETRY_ANY_OR_DEVICE_PASSCODE , BIOMETRY_CURRENT_SET_OR_DEVICE_PASSCODE .

Din păcate, setarea unei valori de control al accesului la apelare setGenericPassword la oricare dintre aceste trei chei enum nu activează o alternativă „Introduceți parola”. Problema a fost raportată pe GitHub, dar nu a existat niciun răspuns în momentul publicării acestui articol.

S-ar putea să vă gândiți să implementați codul de rezervă pentru o altă bibliotecă. Rețineți că sistemul dvs. este numai la fel de sigur ca cea mai slabă verigă. Dacă implementarea de rezervă a codului de acces se execută la nivelul aplicației, aceasta este o țintă potențială pentru un atac de securitate și învinge scopul de a se baza pe Keychain Services pentru autentificare biometrică.

De asemenea, autentificarea cu react-native-keychain pe dispozitivele Android nu poate fi considerat sigur deoarece nu există o echivalență a serviciilor Keychain în Android.

Înfășurându-se

Vă mulțumesc că ați citit până aici. Sper că ți s-a părut util tutorialul. O îmbunătățire pe care poate doriți să o faceți este să întrebați utilizatorul dacă ar dori să opteze pentru autentificarea biometrică înainte de a o activa în aplicația dvs. De asemenea, puteți adăuga o setare pentru a permite utilizatorului să activeze sau să dezactiveze autentificarea TouchID / FaceID în pagina de setări a aplicației.

Referințe