Výukový program ověřování otiskem prstu v systému Android

Ověřování otiskem prstu využívá dotykový snímač zabudovaný v mnoha zařízeních se systémem Android k identifikaci uživatele a k zajištění přístupu k zařízení i k funkcím aplikace, jako jsou například možnosti plateb v aplikaci. Implementace ověřování otisků prstů je vícekrokový proces, který se může zpočátku zdát zdrcující. Po rozdělení na jednotlivé kroky je však proces mnohem méně složitý. V základu je ověřování otisků prstů především záležitostí šifrování zahrnující klíč, šifru k provedení šifrování a správce otisků prstů, který zpracovává proces ověřování.

Tato kapitola poskytuje jak přehled ověřování otisků prstů, tak podrobný návod krok za krokem, který ukazuje praktický přístup k implementaci.

Obsah

Přehled ověřování otisků prstů

Při implementaci ověřování otisků prstů v aplikaci pro Android existuje v podstatě 10 kroků. Tyto kroky lze shrnout následovně:

1. Vyžádejte si oprávnění k ověřování otisků prstů v souboru Manifest projektu.

2. Ověřte, zda je zamykací obrazovka zařízení, na kterém je aplikace spuštěna, chráněna kódem PIN, vzorem nebo heslem (otisky prstů lze registrovat pouze na zařízeních, na kterých byla zamykací obrazovka zabezpečena).

3. Ověřte, zda byl na zařízení zaregistrován alespoň jeden otisk prstu.

4. Vytvořte instanci třídy FingerprintManager.

5. Ověřte, zda je na zařízení zaregistrován alespoň jeden otisk prstu.

6. Vytvořte instanci třídy FingerprintManager.

7. Ověřte, zda je na zařízení zaregistrován alespoň jeden otisk prstu. Pomocí instance třídy Keystore získejte přístup ke kontejneru Android Keystore. Jedná se o oblast pro bezpečné ukládání kryptografických klíčů v zařízeních se systémem Android.

6. Pomocí třídy KeyGenerator vygenerujte šifrovací klíč a uložte jej do kontejneru Keystore.

7. Vytvořte šifrovací klíč a uložte jej do kontejneru Keystore. Inicializujte instanci třídy Cipher pomocí klíče vygenerovaného v kroku 5.

8. Pomocí instance třídy Cipher vytvořte objekt CryptoObject a přiřaďte jej instanci třídy FingerprintManager vytvořené v kroku 4.

9. Zavoláme metodu authenticate instance FingerprintManager.

10. Implementujte metody pro zpracování zpětných volání vyvolaných procesem ověřování. 11. Zajistěte přístup k chráněnému obsahu nebo funkcím po dokončení úspěšného ověření.

Každý z výše uvedených kroků bude podrobněji popsán v průběhu výuky uvedené ve zbytku této kapitoly.

report this ad

Vytvoření projektu ověřování otisků prstů

Tento příklad začněte spuštěním prostředí Android Studio a vytvořením nového projektu, přičemž do pole Application name zadejte FingerprintDemo a ebookfrenzy.com jako nastavení Company Domain a poté klikněte na tlačítko Next.

Na obrazovce form factors povolte možnost Phone and Tablet a nastavte minimální nastavení SDK na hodnotu API 23: Android 6.0 (Marshmallow). Pokračujte přes obrazovky nastavení a vyžádejte si vytvoření prázdné aktivity s názvem FingerprintDemoActivity s odpovídajícím rozložením s názvem activity_fingerprint_demo.

Konfigurace ověřování otisků prstů zařízení

Ověřování otisků prstů je k dispozici pouze na zařízeních, která obsahují dotykový snímač a na kterých byly provedeny příslušné konfigurační kroky pro zabezpečení zařízení a registraci alespoň jednoho otisku prstu. Kroky pro konfiguraci relace emulátoru pro testování ověřování otisků prstů naleznete v kapitole s názvem Použití a konfigurace emulátoru Android Studio 2 AVD.

Konfiguraci ověřování otisků prstů na fyzickém zařízení začněte otevřením aplikace Nastavení a výběrem možnosti Zabezpečení. Na obrazovce Nastavení zabezpečení vyberte možnost Otisk prstu. Na výsledné informační obrazovce klikněte na tlačítko Pokračovat a přejděte na obrazovku nastavení otisku prstu. Před zapnutím zabezpečení otiskem prstu musí být nakonfigurována záložní metoda odemykání obrazovky (například číslo PIN). Pokud zamykací obrazovka ještě není zabezpečena, klikněte na tlačítko Set Up Screen Lock (Nastavit zámek obrazovky) a podle pokynů nakonfigurujte zabezpečení pomocí kódu PIN, vzoru nebo hesla.

Po zabezpečení zamykací obrazovky přejděte na obrazovku detekce otisků prstů a po výzvě se dotkněte snímače (obrázek 62-1) a v případě potřeby zopakujte postup pro přidání dalších otisků prstů.

Obrázek 62-1

Přidání oprávnění k otiskům prstů do souboru manifestu

Ověřování otisků prstů vyžaduje, aby aplikace požádala o oprávnění USE_FINGERPRINT v souboru manifestu projektu. V okně nástroje Android Studio Project vyhledejte a upravte soubor aplikace -> manifesty -> AndroidManifest.xml a přidejte požadavek na oprávnění následujícím způsobem:

Stažení ikony otisku prstu

Google poskytuje standardní ikonu (obrázek 62-2), která se musí zobrazit vždy, když aplikace požaduje ověření uživatele.

Obrázek 62-2

Kopii této ikony lze stáhnout z následující adresy URL:

Otevřete navigátor souborového systému operačního systému, vyberte nově stažený obrázek a stisknutím klávesy Ctrl-C (Cmd-C v systému Mac OS X) soubor zkopírujte. Vraťte se do aplikace Android Studio, klikněte pravým tlačítkem myši na složku aplikace -> res -> drawable a výběrem možnosti nabídky Vložit přidejte kopii souboru obrázku do projektu. Když se zobrazí dialogové okno Kopírovat, klepněte na tlačítko OK a použijte výchozí nastavení.

Navržení uživatelského rozhraní

V zájmu co největší jednoduchosti příkladu budou jedinými prvky v rámci uživatelského rozhraní TextView a ImageView. Vyhledejte a vyberte soubor zdrojů rozvržení activity_fingerprint_demo.xml a načtěte jej do nástroje Designer. Po načtení odstraňte ukázkový objekt TextView, přetáhněte z panelu objekt ImageView a umístěte jej do středu plátna rozvržení.

Na panelu Vlastnosti vyhledejte atribut src, klikněte do příslušného textového pole a následně tlačítkem zvýrazněným na obrázku 62-3 zobrazte dialogové okno Zdroje:

Obrázek 62-3

Na levém panelu dialogového okna vyberte možnost Drawable. V rámci hlavního panelu zadejte do vyhledávacího pole ic_fp, jak je znázorněno na obrázku 62 4, a vyhledejte ikonu otisku prstu. V dialogovém okně ikonu vyberte a klepnutím na tlačítko OK ji přiřaďte objektu ImageView.

Obrázek 62-4

V paletě vyhledejte objekt Velký text a přetáhněte jej tak, aby byl umístěn pod objektem ImageView. Dvakrát klikněte na objekt a změňte text tak, aby zněl „Dotykový senzor“. Pomocí ikony žárovky extrahujte řetězec do prostředku s názvem touch_sensor.

Po dokončení výše uvedených kroků by rozložení mělo odpovídat rozložení na obrázku 62-5:

Obrázek 62-5

Přístup ke službám Keyguard a Fingerprint Manager

Ověřování otisků prstů využívá dvě systémové služby v podobě KeyguardManager a FingerprintManager. Upravte metodu onCreate umístěnou v souboru FingerprintDemoActivity.java a získejte odkazy na tyto dvě služby následujícím způsobem:

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

Kontrola nastavení zabezpečení

Dříve v této kapitole byly provedeny kroky ke konfiguraci zamykací obrazovky a registraci otisků prstů na zařízení nebo emulátoru, na kterém bude aplikace testována. Je však důležité, abyste do aplikace zahrnuli obranný kód a ujistili se, že tyto požadavky byly splněny, než se pokusíte o ověření otisků prstů. Tyto kroky budou provedeny v rámci metody onCreate sídlící v souboru FingerprintDemoActivity.java s využitím služeb Keyguard a Fingerprint manager. Všimněte si, že byl také přidán kód pro ověření, zda bylo pro aplikaci nakonfigurováno oprávnění USE_FINGERPRINT:

Výše uvedené změny kódu začínají použitím služby Keyguard manager pro ověření, zda byla nakonfigurována záložní metoda odemykání obrazovky (jinými slovy, k odemknutí obrazovky lze jako alternativu k ověření otiskem prstu použít PIN nebo jinou metodu ověření). V případě, že zamykací obrazovka není zabezpečena, kód ohlásí problém uživateli a vrátí se z metody.

Správce otisků prstů se poté použije k ověření, zda byl v zařízení zaregistrován alespoň jeden otisk prstu, opět ohlásí problém a v případě potřeby se vrátí z metody.

Přístup k úložišti klíčů a generátoru klíčů systému Android

Součástí procesu ověřování otisků prstů je vygenerování šifrovacího klíče, který je poté bezpečně uložen v zařízení pomocí systému Android Keystore. Před vygenerováním a uložením klíče musí aplikace nejprve získat přístup k systému Keystore. V souboru FingerprintDemoActivity.java bude nyní implementována nová metoda s názvem generateKey, která bude provádět úkoly generování a ukládání klíče. Zpočátku bude přidán pouze kód pro přístup k úložišti klíčů takto:

Odkaz na úložiště klíčů se získá voláním metody getInstance třídy Keystore a předáním identifikátoru standardního kontejneru úložiště klíčů systému Android („AndroidKeyStore“). Dalším krokem v návodu bude vygenerování klíče pomocí služby KeyGenerator. Před generováním tohoto klíče je třeba přidat kód, který získá odkaz na instanci služby KeyGenerator a jako argumenty předá typ klíče, který má být vygenerován, a název kontejneru Keystore, do kterého má být klíč uložen:

Generování klíče

Teď, když máme odkaz na kontejner Android Keystore a instanci služby KeyGenerator, je dalším krokem vygenerování klíče, který bude použit k vytvoření šifry pro proces šifrování. Zbývá v souboru FingerprintDemoActivity.java přidat tento nový kód takto:

Výše uvedené změny vyžadují určité vysvětlení. Po importu řady dalších modulů kód deklaruje řetězcovou proměnnou představující název (v tomto případě „example_key“), který bude použit při ukládání klíče do kontejneru Keystore.

Následuje načtení kontejneru Keystore a inicializace KeyGeneratoru. Tento inicializační proces využívá třídu KeyGenParameterSpec.Builder k určení typu generovaného klíče. To zahrnuje odkaz na název klíče, konfiguraci klíče tak, aby mohl být použit pro šifrování i dešifrování, a nastavení různých parametrů šifrování. Volání metody setUserAuthenticationRequired konfiguruje klíč tak, že uživatel musí každé použití klíče autorizovat pomocí ověření otisku prstu. Jakmile je KeyGenerator nakonfigurován, použije se ke generování klíče prostřednictvím volání metody generateKey instance.

Inicializace šifry

Teď, když byl klíč vygenerován, je dalším krokem inicializace šifry, která bude použita k vytvoření šifrované instance FingerprintManager.CryptoObject. Tento CryptoObject bude následně použit během procesu ověřování otisků prstů. Konfigurace šifry zahrnuje získání instance šifry a její inicializaci klíčem uloženým v kontejneru Keystore. Do souboru FingerprintDemoActivity.java přidejte novou metodu s názvem cipherInit, která bude tyto úkoly provádět:

Metoda getInstance třídy Cipher je volána za účelem získání instance Cipher, která je následně nakonfigurována s vlastnostmi potřebnými pro ověřování otisků prstů. Dříve vygenerovaný klíč je poté extrahován z kontejneru Keystore a použit k inicializaci instance Cipher. Chyby jsou odpovídajícím způsobem ošetřeny a na základě úspěšnosti či neúspěšnosti procesu inicializace šifry je vrácen výsledek true nebo false.

Práce na metodách generateKey a cipherInit je nyní dokončena. Dalším krokem je úprava metody onCreate tak, aby tyto metody volala a v případě úspěšné inicializace šifry vytvořila instanci objektu CryptoObject.

Vytvoření instance objektu CryptoObject

Zbývá v rámci FingerprintDemoActivity.java upravte metodu onCreate tak, aby volala dvě nově vytvořené metody, a vygenerujte CryptoObject následujícím způsobem:

Závěrečným úkolem v projektu je implementace nové třídy pro obsluhu vlastní autentizace otisku prstu.

Implementace třídy Fingerprint Authentication Handler

V této kapitole se zatím většina práce týkala přípravy na autentizaci otisku prstu z hlediska klíče, šifry a kryptografického objektu. Vlastní autentizace se spouští voláním metody authenticate instance FingerprintManager. Volání této metody však vyvolá jednu z řady událostí zpětného volání v závislosti na úspěchu či neúspěchu autentizace. Volání metody authenticate i metody obsluhy zpětného volání musí být implementovány ve třídě, která rozšiřuje třídu FingerprintManager.AuthenticationCallback. Takovou třídu je nyní třeba přidat do projektu.

Přejděte na položku app -> java -> com.ebookfrenzy.fingerprintdemo v okně nástroje Android Studio Project a klikněte na ni pravým tlačítkem myši. Ve výsledné nabídce vyberte možnost New -> Java Class, čímž zobrazíte dialogové okno Create New Class. Třídu pojmenujte FingerprintHandler a kliknutím na tlačítko OK ji vytvořte.

Upravte soubor nové třídy tak, aby rozšiřoval FingerprintManager.AuthenticationCallback, importuje některé další moduly a implementuje metodu konstruktoru, která umožní předání kontextu aplikace při vytváření instance třídy (kontext bude použit v metodách zpětného volání pro oznámení stavu ověření uživateli):

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

Dále je třeba přidat metodu, kterou lze zavolat pro zahájení ověření otisku prstu. Při volání této metody bude třeba předat instance FingerprintManager a CryptoObject. Pojmenujte tuto metodu startAuth a implementujte ji do FingerprintHandleru.java takto (všimněte si, že byl také přidán kód, který opět kontroluje, zda bylo uděleno oprávnění k snímání otisků prstů):

Dále přidejte metody zpětného volání obsluhy, z nichž každá je implementována tak, aby zobrazovala zprávu toast s výsledkem ověření otisku prstu:

Závěrečným úkolem před testováním projektu je upravit metodu onCreate tak, aby vytvořila novou instanci třídy FingerprintHandler a zavolala metodu startAuth. Upravte soubor FingerprintDemoActivity.java a upravte konec metody onCreate tak, aby zněl následovně:

Testování projektu

Po dokončení projektu spusťte aplikaci na fyzickém zařízení Android nebo v emulátoru. Po spuštění se buď dotkněte snímače otisků prstů, nebo použijte rozšířený ovládací panel v emulátoru k simulaci dotyku otiskem prstu, jak je popsáno v kapitole s názvem Použití a konfigurace emulátoru Android Studio 2 AVD. Za předpokladu, že je detekován registrovaný otisk prstu, zobrazí se zpráva s přípitkem označující úspěšné ověření, jak ukazuje obrázek 62-6:

Obrázek 62-6

Zastavte spuštěnou aplikaci a znovu ji spusťte, tentokrát s použitím neregistrovaného otisku prstu k pokusu o ověření. Tentokrát by se měla objevit hláška s přípitkem, že se ověření nezdařilo.

Shrnutí

Ověřování otisků prstů v systému Android je vícekrokový proces, který se zpočátku může zdát složitý. Po rozdělení na jednotlivé kroky se však proces stává přehlednějším. Ověřování otisků prstů zahrnuje použití klíčů, šifer a ukládání klíčů v kombinaci s funkcemi třídy FingerprintManager. Tato kapitola poskytla úvod do těchto kroků a zpracovala vytvoření příkladového projektu aplikace, který má ukázat praktickou implementaci ověřování otisků prstů v systému Android.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.