Sormenjälkitodennus käyttää moniin Android-laitteisiin sisäänrakennettua kosketustunnistinta käyttäjän tunnistamiseen ja mahdollistaa pääsyn sekä laitteen että sovelluksen toimintoihin, kuten sovelluksen sisäisiin maksuvaihtoehtoihin. Sormenjälkitunnistuksen toteuttaminen on monivaiheinen prosessi, joka voi aluksi vaikuttaa ylivoimaiselta. Kun prosessi kuitenkin pilkotaan yksittäisiin vaiheisiin, siitä tulee paljon yksinkertaisempi. Periaatteessa sormenjälkitodennuksessa on kyse pääasiassa salauksesta, johon liittyy avain, salaus, jolla salaus suoritetaan, ja sormenjäljenhallinta, jolla todennusprosessi hoidetaan.
Tässä luvussa annetaan sekä yleiskatsaus sormenjälkitodennukseen että yksityiskohtainen, vaiheittainen opetusohjelma, jossa esitellään käytännönläheinen lähestymistapa toteutukseen.
Yleiskatsaus sormenjälkitunnistautumiseen
Sormenjälkitunnistautumisen toteuttaminen Android-sovelluksessa koostuu periaatteessa kymmenestä vaiheesta. Nämä vaiheet voidaan tiivistää seuraavasti:
1. Pyydä sormenjälkitodennusoikeutta projektin Manifest-tiedostossa.
2. Varmista, että sen laitteen lukitusnäyttö, jossa sovellus on käynnissä, on suojattu PIN-koodilla, kuviolla tai salasanalla (sormenjälkiä voidaan rekisteröidä vain laitteisiin, joissa lukitusnäyttö on suojattu).
3. Varmista, että laitteeseen on rekisteröity vähintään yksi sormenjälki.
4. Luo FingerprintManager-luokan instanssi.
5. Luo FingerprintManager-luokan instanssi. Käytä Keystore-instanssia saadaksesi pääsyn Androidin Keystore-säiliöön. Tämä on säilytysalue, jota käytetään salausavainten turvalliseen tallentamiseen Android-laitteissa.
6. Luo salausavain KeyGenerator-luokan avulla ja tallenna se Keystore-säiliöön.
7. Luo salausavain KeyGenerator-luokan avulla. Alusta Cipher-luokan instanssi käyttäen vaiheessa 5 luotua avainta.
8. Luo Cipher-instanssin avulla CryptoObject ja määritä se vaiheessa 4 luotuun FingerprintManager-instanssiin.
9. Käytä Cipher-instanssia CryptoObjectin luomiseen ja määritä se vaiheessa 4 luotuun FingerprintManager-instanssiin.
. Kutsu FingerprintManager-instanssin authenticate-metodia.
10. Toteuta metodit, joilla käsitellään todennusprosessin käynnistämiä takaisinkutsuja. Tarjoa pääsy suojattuun sisältöön tai toiminnallisuuteen onnistuneen todennuksen päätyttyä.
Jokaista edellä mainittua vaihetta käsitellään yksityiskohtaisemmin tämän luvun loppuosassa esitetyssä opetusohjelmassa.
Sormenjälkitunnistusprojektin luominen
Aloita tämä esimerkki käynnistämällä Android Studio -ympäristö ja luomalla uusi projekti, kirjoittamalla FingerprintDemo kenttään Application name ja ebookfrenzy.com Yrityksen toimialue -asetukseksi ennen kuin napsautat Seuraava-painiketta.
Aktivoi Muotoilutekijät-näytössä Puhelin ja tabletti -vaihtoehto ja aseta SDK:n vähimmäisasetukseksi API 23: Android 6.0 (Marshmallow). Jatka asetusnäyttöjen läpi ja pyydä luomaan tyhjä aktiviteetti nimeltä FingerprintDemoActivity ja sitä vastaava asettelu nimeltä activity_fingerprint_demo.
Laitteen sormenjälkitunnistuksen määrittäminen
Sormenjälkitunnistus on käytettävissä vain laitteissa, joissa on kosketustunnistin ja joissa on suoritettu asianmukaiset määritystoimenpiteet laitteen suojaamiseksi ja vähintään yhden sormenjäljen rekisteröimiseksi. Ohjeita emulaattori-istunnon määrittämiseen sormenjälkitodennuksen testaamista varten on luvussa Android Studio 2 AVD-emulaattorin käyttö ja määrittäminen.
Sormenjälkitodennuksen määrittäminen fyysisessä laitteessa aloitetaan avaamalla Asetukset-sovellus ja valitsemalla Suojaus-vaihtoehto. Valitse Suojausasetukset-näytössä Sormenjälki-vaihtoehto. Napsauta tuloksena olevassa tietonäytössä Jatka-painiketta siirtyäksesi sormenjäljen asetusnäyttöön. Ennen kuin sormenjälkiturva voidaan ottaa käyttöön, näytön lukituksen varmuuskopiointimenetelmä (kuten PIN-numero) on määritettävä. Napsauta Setup Screen Lock (Näytön lukituksen määrittäminen) -painiketta, jos lukitusnäyttöä ei ole vielä suojattu, ja noudata vaiheita määrittääksesi joko PIN-koodi-, kuvio- tai salasanaturvallisuuden.
Kun lukitusnäyttö on suojattu, siirry sormenjäljen tunnistusnäyttöön ja kosketa anturia, kun sinua kehotetaan tekemään niin (Kuva 62-1), ja toista prosessi lisätäksesi tarvittaessa lisää sormenjälkiä.
Kuva 62-1
Sormenjälkitunnistusoikeuden lisääminen manifestitiedostoon
Sormenjälkitunnistus edellyttää, että sovellus pyytää projektin manifestitiedostossa USE_FINGERPRINT-oikeuden. Etsi ja muokkaa Android Studio Project -työkaluikkunassa sovelluksen -> manifests -> AndroidManifest.xml-tiedostoa lisätäksesi käyttöoikeuspyynnön seuraavasti:
Sormenjälkikuvakkeen lataaminen
Google tarjoaa vakiomuotoisen kuvakkeen (Kuva 62-2), joka on näytettävä aina, kun sovellus pyytää käyttäjältä todennusta.
Kuvio 62-2
Kopion tästä kuvakkeesta voi ladata seuraavasta URL-osoitteesta:
Avaa käyttöjärjestelmäsi tiedostojärjestelmän navigaattori, valitse äsken ladattu kuva ja kopioi tiedosto painamalla näppäinyhdistelmää Ctrl-C (Mac OS X:ssä Cmd-C). Palaa Android Studioon, napsauta hiiren kakkospainikkeella app -> res -> drawable -kansiota ja valitse Paste (Liitä) -valikkovaihtoehto lisätäksesi kuvatiedoston kopion projektiin. Kun Kopioi-valintaikkuna tulee näkyviin, napsauta OK-painiketta käyttääksesi oletusasetuksia.
Käyttöliittymän suunnittelu
Käyttökohteen suunnittelussa
Käyttökohteen ainoat elementit käyttöliittymässä ovat TextView ja ImageView. Etsi ja valitse activity_fingerprint_demo.xml-asetteluresurssitiedosto ja lataa se Designer-työkaluun. Kun se on ladattu, poista esimerkin TextView-objekti, vedä ja pudota ImageView-objekti paneelista ja sijoita se layout-kankaan keskelle.
Ominaisuudet-paneelissa etsi src-attribuutti, napsauta vastaavaa tekstikenttää ja sen jälkeen kuvassa 62-3 korostettua painiketta, jolloin resurssit-valintaikkuna tulee näkyviin:
Kuva 62-3
Valintaikkunan vasemmanpuoleisesta paneelista valitse Piirtokelpoinen-vaihtoehto. Kirjoita pääpaneelissa ic_fp hakukenttään kuvan 62 4 mukaisesti, jotta löydät sormenjälkikuvakkeen. Valitse kuvake valintaikkunasta ja määritä se ImageView-objektiin napsauttamalla OK-painiketta.
Kuva 62-4
Paikanna Large Text -objekti paletista ja vedä ja pudota se niin, että se sijoittuu ImageView-objektin alle. Kaksoisnapsauta objektia ja muuta tekstiä niin, että siinä lukee ”Touch Sensor”. Pura merkkijono lamppukuvakkeen avulla resurssiin nimeltä touch_sensor.
Kun edellä mainitut vaiheet on suoritettu, asettelun pitäisi olla kuvan 62-5 mukainen:
Kuva 62-5
Käyttöönotto Keyguard- ja FingerprintManager-palveluihin
Sormenjälkitunnistus käyttää kahta järjestelmäpalvelua KeyguardManagerin ja FingerprintManagerin muodossa. Muokkaa FingerprintDemoActivity.java-tiedostossa sijaitsevaa onCreate-metodia saadaksesi viittaukset näihin kahteen palveluun seuraavasti:
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); }}
Turva-asetusten tarkistaminen
Edellisessä luvussa otettiin askeleita lukitusnäytön konfiguroimiseksi ja sormenjälkien rekisteröimiseksi laitteessa tai emulaattorissa, jolla sovellusta aiotaan testata. On kuitenkin tärkeää sisällyttää sovellukseen puolustuskoodia, jolla varmistetaan, että nämä vaatimukset on täytetty, ennen kuin yritetään hakea sormenjälkitodennusta. Nämä vaiheet suoritetaan FingerprintDemoActivity.java-tiedostossa sijaitsevassa onCreate-metodissa, jossa käytetään Keyguard- ja Fingerprint manager -palveluja. Huomaa, että on myös lisätty koodia, jolla tarkistetaan, että USE_FINGERPRINT-oikeus on määritetty sovellukselle:
Yllä olevat koodimuutokset aloitetaan käyttämällä Keyguard-hallintapalvelua tarkistamaan, että näytön lukituksen avaamisen varamenetelmä on määritetty (toisin sanoen PIN-koodia tai muuta todennusmenetelmää voidaan käyttää sormenjälkitodennuksen vaihtoehtona näytön lukituksen avaamiseen). Jos lukitusnäyttöä ei ole varmistettu, koodi ilmoittaa ongelmasta käyttäjälle ja palaa menetelmästä.
Sormenjälkihallintaa käytetään tämän jälkeen tarkistamaan, että laitteeseen on rekisteröity vähintään yksi sormenjälki, ja jälleen kerran ilmoitetaan ongelmasta ja palataan tarvittaessa menetelmästä.
Accessing the Android Keystore and KeyGenerator
Osana sormenjälkitunnistusprosessia luodaan salausavain, joka tallennetaan laitteeseen turvallisesti Android Keystore -järjestelmän avulla. Ennen kuin avain voidaan luoda ja tallentaa, sovelluksen on ensin saatava pääsy Keystore-järjestelmään. FingerprintDemoActivity.java-tiedostossa toteutetaan nyt uusi metodi nimeltä generateKey, jolla suoritetaan avaimen luominen ja tallentaminen. Aluksi lisätään vain koodi, jolla Keystoreen päästään käsiksi seuraavasti:
Viittaus Keystoreen saadaan kutsumalla Keystore-luokan getInstance-metodia ja välittämällä sen kautta Androidin vakiomuotoisen keystore-säiliön tunniste (”AndroidKeyStore”). Ohjeen seuraava vaihe on luoda avain KeyGenerator-palvelun avulla. Ennen tämän avaimen tuottamista on lisättävä koodia, jolla saadaan viittaus KeyGeneratorin instanssiin, jolloin argumentteina kulkee läpi tuotettavan avaimen tyyppi ja sen Keystore-säiliön nimi, johon avain tallennetaan:
Avaimen tuottaminen
Nyt kun meillä on viittaus Androidin Keystore-säiliöön ja KeyGenerator-instanssi, seuraava vaihe on tuottaa avain, jota käytetään salausprosessin salausmuodon luomiseen. Jäämme FingerprintDemoActivity.java-tiedostoon ja lisää tämä uusi koodi seuraavasti:
Yllä olevat muutokset vaativat hieman selitystä. Useiden lisämoduulien tuonnin jälkeen koodi julistaa merkkijonomuuttujan, joka edustaa nimeä (tässä tapauksessa ”example_key”), jota käytetään, kun avain tallennetaan Keystore-säiliöön.
Seuraavaksi Keystore-säiliö ladataan ja KeyGenerator alustetaan. Tässä alustuksessa käytetään KeyGenParameterSpec.Builder-luokkaa, jolla määritetään luotavan avaimen tyyppi. Tähän sisältyy avaimen nimeen viittaaminen, avaimen määrittäminen siten, että sitä voidaan käyttää sekä salaukseen että salauksen purkamiseen, ja erilaisten salausparametrien asettaminen. SetUserAuthenticationRequired-menetelmäkutsu määrittää avaimen siten, että käyttäjän on hyväksyttävä jokainen avaimen käyttö sormenjälkitodennuksella. Kun KeyGenerator on konfiguroitu, sitä käytetään avaimen tuottamiseen instanssin generateKey-metodin kutsun avulla.
Salakirjoituksen alustaminen
Nyt kun avain on luotu, seuraava vaihe on alustaa salakirjoitus, jota käytetään salatun FingerprintManager.CryptoObject-instanssin luomiseen. Tätä CryptoObjectia käytetään puolestaan sormenjälkitunnistusprosessin aikana. Salaimen konfigurointiin kuuluu salaimen instanssin hankkiminen ja sen alustaminen Keystore-säiliöön tallennetulla avaimella. Lisää FingerprintDemoActivity.java-tiedostoon uusi metodi nimeltä cipherInit suorittamaan nämä tehtävät:
Cipher-luokan getInstance-metodia kutsutaan Cipher-instanssin hankkimiseksi, joka sen jälkeen konfiguroidaan sormenjälkitodennuksessa tarvittavilla ominaisuuksilla. Tämän jälkeen aiemmin luotu avain poimitaan Keystore-säiliöstä ja sitä käytetään Cipher-instanssin alustamiseen. Virheitä käsitellään vastaavasti ja palautetaan true- tai false-tulos, joka perustuu salakirjoituksen alustamisprosessin onnistumiseen tai epäonnistumiseen.
Työ on nyt valmis sekä generateKey- että cipherInit-metodien osalta. Seuraavaksi muokataan onCreate-metodia niin, että se kutsuu näitä metodeja ja onnistuneen salakirjoituksen alustuksen tapauksessa luo CryptoObject-instanssin.
CryptoObject-instanssin luominen
Jää jäljelle FingerprintDemoActivityn sisällä.java-tiedostoon, muokataan onCreate-metodia kutsumaan kahta äskettäin luotua metodia ja luodaan CryptoObject seuraavasti:
Projektin viimeisenä tehtävänä on toteuttaa uusi luokka, joka käsittelee varsinaista sormenjälkitunnistautumista.
Sormenjälkitunnistautumisen käsittelijäluokan toteutus
Tässä luvussa suurin osa työstä on tähän asti koskenut sormenjälkitunnistautumisen valmistelemista avaimen, salakirjoittajan ja krypto-objektin osalta. Varsinainen todennus käynnistetään kutsumalla FingerprintManager-instanssin authenticate-metodia. Tämä metodikutsu laukaisee kuitenkin yhden monista takaisinkutsutapahtumista riippuen todentamisen onnistumisesta tai epäonnistumisesta. Sekä authenticate-metodikutsu että callback-käsittelijämenetelmät on toteutettava luokassa, joka laajentaa FingerprintManager.AuthenticationCallback-luokkaa. Tällainen luokka on nyt lisättävä projektiin.
Navigoi Android Studio Project -työkaluikkunassa app -> java -> com.ebookfrenzy.fingerprintdemo -merkintään ja napsauta sitä hiiren oikealla painikkeella. Valitse avautuvasta valikosta New -> Java Class (Uusi -> Java-luokka) -vaihtoehto, jolloin Create New Class (Luo uusi luokka) -valintaikkuna tulee näkyviin. Nimeä luokka FingerprintHandler ja luo luokka napsauttamalla OK-painiketta.
Muokkaa uutta luokkatiedostoa niin, että se laajentaa FingerprintManageria.AuthenticationCallback, tuo joitakin lisämoduuleja ja toteuttaa konstruktorimetodin, jonka avulla sovelluskonteksti voidaan välittää, kun luokan instanssi luodaan (kontekstia käytetään takaisinkutsumenetelmissä, joilla käyttäjälle ilmoitetaan todennuksen tila):
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; }}
Seuraavaksi on lisättävä metodi, jota voidaan kutsua sormenjälkitodennuksen käynnistämiseksi. Kun tätä metodia kutsutaan, sille on annettava FingerprintManager- ja CryptoObject-instanssit. Nimeä metodi startAuth ja toteuta se FingerprintHandlerissa.java-luokkatiedostossa seuraavasti (huomaa, että on lisätty myös koodia, jolla tarkistetaan vielä kerran, että sormenjälkitunnistusoikeus on myönnetty):
Seuraavaksi lisätään callback-käsittelijämetodit, joista kukin on toteutettu näyttämään toast-viesti, joka kertoo sormenjälkitunnistuksen tuloksen:
Viimeisenä tehtävänä ennen projektin testaamista on muuttaa onCreate-metodia siten, että se luo uuden FingerprintHandler-luokan instanssin ja kutsuu startAuth-metodia. Muokkaa FingerprintDemoActivity.java-tiedostoa ja muuta onCreate-metodin loppua siten, että se kuuluu seuraavasti:
Projektin testaaminen
Kun projekti on nyt valmis, suorita sovellus fyysisellä Android-laitteella tai emulaattori-istunnossa. Kun sovellus on käynnissä, kosketa sormenjälkitunnistinta tai käytä emulaattorin laajennettua ohjauspaneelia simuloidaksesi sormenjälkikosketusta, kuten luvussa Android Studio 2 AVD-emulaattorin käyttö ja konfigurointi on kuvattu. Olettaen, että rekisteröity sormenjälki havaitaan, näkyviin tulee toast-viesti, joka ilmoittaa onnistuneesta todennuksesta kuvan 62-6 mukaisesti:
Kuva 62-6
Pysäytä käynnissä oleva sovellus ja käynnistä se uudelleen, tällä kertaa käyttämällä rekisteröimätöntä sormenjälkeä todennuksen yrittämiseen. Tällä kertaa pitäisi ilmestyä toast-viesti, jossa ilmoitetaan, että todennus epäonnistui.
Yhteenveto
Sormenjälkitodennus Androidissa on monivaiheinen prosessi, joka voi aluksi vaikuttaa monimutkaiselta. Kun prosessi kuitenkin pilkotaan yksittäisiin vaiheisiin, siitä tulee selkeämpi. Sormenjälkitodennukseen liittyy avainten, salakirjoitusten ja avaintallennuksen käyttö yhdistettynä FingerprintManager-luokan ominaisuuksiin. Tässä luvussa on esitelty nämä vaiheet ja käyty läpi esimerkkisovellusprojekti, jonka tarkoituksena on näyttää sormenjälkitunnistuksen käytännön toteutus Androidissa.