L’authentification par empreinte digitale utilise le capteur tactile intégré à de nombreux appareils Android pour identifier l’utilisateur et lui donner accès à la fois à l’appareil et aux fonctionnalités de l’application, comme les options de paiement in-app. La mise en œuvre de l’authentification par empreinte digitale est un processus en plusieurs étapes qui peut, au premier abord, sembler écrasant. Cependant, lorsqu’il est décomposé en étapes individuelles, le processus devient beaucoup moins complexe. En termes de base, l’authentification par empreinte digitale est principalement une question de cryptage impliquant une clé, un chiffre pour effectuer le cryptage et un gestionnaire d’empreintes digitales pour gérer le processus d’authentification.
Ce chapitre fournit à la fois un aperçu de l’authentification par empreinte digitale et un tutoriel détaillé, étape par étape, qui démontre une approche pratique de la mise en œuvre.
Un aperçu de l’authentification par empreinte digitale
Il y a essentiellement 10 étapes pour mettre en œuvre l’authentification par empreinte digitale dans une application Android. Ces étapes peuvent être résumées comme suit :
1. Demander l’autorisation d’authentification par empreinte digitale dans le fichier Manifest du projet.
2. Vérifier que l’écran de verrouillage de l’appareil sur lequel l’app est exécutée est protégé par un PIN, un motif ou un mot de passe (les empreintes digitales ne peuvent être enregistrées que sur les appareils sur lesquels l’écran de verrouillage a été sécurisé).
3. Vérifier qu’au moins une empreinte digitale a été enregistrée sur l’appareil.
4. Créer une instance de la classe FingerprintManager.
5. Utilisez une instance de Keystore pour avoir accès au conteneur Android Keystore. Il s’agit d’une zone de stockage utilisée pour le stockage sécurisé des clés cryptographiques sur les appareils Android.
6. Générer une clé de chiffrement à l’aide de la classe KeyGenerator et la stocker dans le conteneur Keystore.
7. Initialiser une instance de la classe Cipher en utilisant la clé générée à l’étape 5.
8. Utiliser l’instance Cipher pour créer un CryptoObject et l’affecter à l’instance FingerprintManager créée à l’étape 4.
9. Appelez la méthode authenticate de l’instance FingerprintManager.
10. Implémentez des méthodes pour gérer les callbacks déclenchés par le processus d’authentification. Fournir l’accès au contenu ou à la fonctionnalité protégée à la fin d’une authentification réussie.
Chaque étape ci-dessus sera couverte plus en détail tout au long du tutoriel décrit dans le reste de ce chapitre.
Création du projet d’authentification par empreinte digitale
Débutez cet exemple en lançant l’environnement Android Studio et en créant un nouveau projet, en entrant FingerprintDemo dans le champ Nom de l’application et ebookfrenzy.com comme paramètre de domaine de la société avant de cliquer sur le bouton Suivant.
Sur l’écran des facteurs de forme, activez l’option Téléphone et tablette et définissez le paramètre SDK minimum sur API 23 : Android 6.0 (Marshmallow). Continuez à travers les écrans de configuration, en demandant la création d’une activité vide nommée FingerprintDemoActivity avec une mise en page correspondante nommée activity_fingerprint_demo.
Configuration de l’authentification par empreinte digitale du périphérique
L’authentification par empreinte digitale est uniquement disponible sur les périphériques contenant un capteur tactile et sur lesquels les étapes de configuration appropriées ont été prises pour sécuriser le périphérique et enregistrer au moins une empreinte digitale. Pour connaître les étapes de configuration d’une session d’émulateur pour tester l’authentification par empreinte digitale, reportez-vous au chapitre intitulé Utilisation et configuration de l’émulateur Android Studio 2 AVD.
Pour configurer l’authentification par empreinte digitale sur un appareil physique, commencez par ouvrir l’app Paramètres et sélectionnez l’option Sécurité. Dans l’écran des paramètres de sécurité, sélectionnez l’option Empreinte digitale. Sur l’écran d’information qui en résulte, cliquez sur le bouton Continuer pour passer à l’écran de configuration des empreintes digitales. Avant d’activer la sécurité par empreinte digitale, une méthode de déverrouillage de l’écran de secours (telle qu’un numéro PIN) doit être configurée. Cliquez sur le bouton Configurer le verrouillage de l’écran si l’écran de verrouillage n’est pas déjà sécurisé et suivez les étapes pour configurer la sécurité par code PIN, motif ou mot de passe.
Avec l’écran de verrouillage sécurisé, passez à l’écran de détection d’empreintes digitales et touchez le capteur lorsque vous y êtes invité (Figure 62-1), en répétant le processus pour ajouter des empreintes digitales supplémentaires si nécessaire.
Figure 62-1
Ajouter la permission d’empreinte digitale au fichier manifeste
L’authentification par empreinte digitale nécessite que l’app demande la permission USE_FINGERPRINT dans le fichier manifeste du projet. Dans la fenêtre de l’outil Android Studio Project, localisez et éditez le fichier app -> manifests -> AndroidManifest.xml pour ajouter la demande de permission comme suit :
Downloading the Fingerprint Icon
Google fournit une icône standard (Figure 62-2) qui doit être affichée chaque fois qu’une app demande l’authentification d’un utilisateur.
Figure 62-2
Une copie de cette icône peut être téléchargée à partir de l’URL suivante :
Ouvrez le navigateur de système de fichiers de votre système d’exploitation, sélectionnez l’image nouvellement téléchargée et appuyez sur Ctrl-C (Cmd-C sur Mac OS X) pour copier le fichier. Retournez dans Android Studio, cliquez avec le bouton droit de la souris sur le dossier app -> res -> drawable et sélectionnez l’option de menu Paste pour ajouter une copie du fichier image au projet. Lorsque la boîte de dialogue Copier apparaît, cliquez sur le bouton OK pour utiliser les paramètres par défaut.
Conception de l’interface utilisateur
Dans le but de garder l’exemple aussi simple que possible, les seuls éléments de l’interface utilisateur seront un TextView et un ImageView. Localisez et sélectionnez le fichier de ressources de mise en page activity_fingerprint_demo.xml pour le charger dans l’outil Designer. Une fois chargé, supprimez l’objet TextView de l’échantillon, faites glisser et déposez un objet ImageView depuis le panneau et positionnez-le au centre du canevas de mise en page.
Dans le panneau Propriétés, localisez l’attribut src, cliquez dans le champ de texte correspondant suivi du bouton mis en évidence dans la Figure 62-3 pour afficher la boîte de dialogue Ressources :
Figure 62-3
Dans le panneau gauche de la boîte de dialogue, sélectionnez l’option Drawable. Dans le panneau principal, entrez ic_fp dans la zone de recherche comme illustré dans la Figure 62 4 pour localiser l’icône d’empreinte digitale. Sélectionnez l’icône dans la boîte de dialogue et cliquez sur OK pour l’affecter à l’objet ImageView.
Figure 62-4
Localisez l’objet Grand texte dans la palette et faites-le glisser pour qu’il soit positionné sous l’objet ImageView. Double-cliquez sur l’objet et modifiez le texte pour qu’il se lise « Capteur tactile ». Utilisez l’icône de l’ampoule pour extraire la chaîne vers une ressource nommée touch_sensor.
A l’issue des étapes ci-dessus, la disposition devrait correspondre à celle présentée dans la figure 62-5 :
Figure 62-5
Accéder aux services Keyguard et Fingerprint Manager
L’authentification par empreinte digitale fait appel à deux services système sous la forme du KeyguardManager et du FingerprintManager. Modifiez la méthode onCreate située dans le fichier FingerprintDemoActivity.java pour obtenir des références à ces deux services comme suit :
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); }}
Vérification des paramètres de sécurité
Dans ce chapitre, des mesures ont été prises pour configurer l’écran de verrouillage et enregistrer les empreintes digitales sur l’appareil ou l’émulateur sur lequel l’application va être testée. Il est toutefois important d’inclure un code défensif dans l’app pour s’assurer que ces exigences ont été satisfaites avant de tenter de demander l’authentification par empreinte digitale. Ces étapes seront effectuées dans la méthode onCreate résidant dans le fichier FingerprintDemoActivity.java, en utilisant les services Keyguard et Fingerprint manager. Notez que du code a également été ajouté pour vérifier que la permission USE_FINGERPRINT a été configurée pour l’app :
Les modifications de code ci-dessus commencent par utiliser le gestionnaire Keyguard pour vérifier qu’une méthode de déverrouillage de l’écran de secours a été configurée (en d’autres termes, un PIN ou une autre méthode d’authentification peut être utilisée comme alternative à l’authentification par empreinte digitale pour déverrouiller l’écran). Dans le cas où l’écran de verrouillage n’est pas sécurisé, le code signale le problème à l’utilisateur et revient de la méthode.
Le gestionnaire d’empreintes digitales est ensuite utilisé pour vérifier qu’au moins une empreinte digitale a été enregistrée sur l’appareil, signalant à nouveau le problème et revenant de la méthode si nécessaire.
Accès au Keystore Android et au KeyGenerator
Une partie du processus d’authentification par empreinte digitale implique la génération d’une clé de chiffrement qui est ensuite stockée de manière sécurisée sur l’appareil en utilisant le système Android Keystore. Avant de pouvoir générer et stocker la clé, l’app doit d’abord accéder au Keystore. Une nouvelle méthode nommée generateKey sera maintenant implémentée dans le fichier FingerprintDemoActivity.java pour effectuer les tâches de génération et de stockage de la clé. Dans un premier temps, seul le code permettant d’accéder au Keystore sera ajouté comme suit :
Une référence au Keystore est obtenue en appelant la méthode getInstance de la classe Keystore et en passant par l’identifiant du conteneur keystore standard d’Android (« AndroidKeyStore »). L’étape suivante du tutoriel consistera à générer une clé à l’aide du service KeyGenerator. Avant de générer cette clé, il faut ajouter du code pour obtenir une référence à une instance du KeyGenerator, en passant comme arguments le type de clé à générer et le nom du conteneur Keystore dans lequel la clé doit être sauvegardée :
Génération de la clé
Maintenant que nous avons une référence au conteneur Android Keystore et une instance de KeyGenerator, l’étape suivante est de générer la clé qui sera utilisée pour créer un chiffre pour le processus de cryptage. En restant dans le fichier FingerprintDemoActivity.java, ajoutez ce nouveau code comme suit :
Les changements ci-dessus nécessitent quelques explications. Après avoir importé un certain nombre de modules supplémentaires, le code déclare une variable de type chaîne représentant le nom (dans ce cas « exemple_key ») qui sera utilisé lors du stockage de la clé dans le conteneur Keystore.
Puis, le conteneur keystore est chargé et le KeyGenerator initialisé. Ce processus d’initialisation fait appel à la classe KeyGenParameterSpec.Builder pour spécifier le type de clé générée. Cela inclut le référencement du nom de la clé, la configuration de la clé de manière à ce qu’elle puisse être utilisée à la fois pour le chiffrement et le déchiffrement, et la définition de divers paramètres de chiffrement. L’appel à la méthode setUserAuthenticationRequired configure la clé de manière à ce que l’utilisateur doive autoriser chaque utilisation de la clé par une authentification par empreinte digitale. Une fois le KeyGenerator configuré, il est ensuite utilisé pour générer la clé via un appel à la méthode generateKey de l’instance.
Initialisation du Cipher
Maintenant que la clé a été générée, l’étape suivante consiste à initialiser le cipher qui sera utilisé pour créer l’instance cryptée FingerprintManager.CryptoObject. Ce CryptoObject sera, à son tour, utilisé pendant le processus d’authentification des empreintes digitales. La configuration du Cipher consiste à obtenir une instance de Cipher et à l’initialiser avec la clé stockée dans le conteneur Keystore. Ajoutez une nouvelle méthode nommée cipherInit au fichier FingerprintDemoActivity.java pour effectuer ces tâches :
La méthode getInstance de la classe Cipher est appelée pour obtenir une instance de Cipher qui est ensuite configurée avec les propriétés requises pour l’authentification des empreintes digitales. La clé précédemment générée est ensuite extraite du conteneur Keystore et utilisée pour initialiser l’instance Cipher. Les erreurs sont gérées en conséquence et un résultat vrai ou faux est renvoyé en fonction du succès ou non du processus d’initialisation du Cipher.
Le travail est maintenant terminé sur les deux méthodes generateKey et cipherInit. L’étape suivante consiste à modifier la méthode onCreate pour appeler ces méthodes et, en cas de réussite de l’initialisation du chiffrement, créer une instance CryptoObject.
Création de l’instance CryptoObject
Reste dans le fichier FingerprintDemoActivity.java, modifiez la méthode onCreate pour appeler les deux méthodes nouvellement créées et générer le CryptoObject comme suit :
La dernière tâche du projet consiste à implémenter une nouvelle classe pour gérer l’authentification réelle des empreintes digitales.
Implémentation de la classe de gestion de l’authentification des empreintes digitales
Jusqu’à présent, dans ce chapitre, la plupart du travail a consisté à préparer l’authentification des empreintes digitales en termes de clé, de chiffrement et d’objet cryptographique. L’authentification réelle est déclenchée via un appel à la méthode authenticate de l’instance FingerprintManager. Cet appel de méthode, cependant, déclenchera l’un des nombreux événements de rappel en fonction de la réussite ou de l’échec de l’authentification. L’appel à la méthode authenticate et les méthodes de gestion des rappels doivent être implémentés dans une classe qui étend la classe FingerprintManager.AuthenticationCallback. Une telle classe doit maintenant être ajoutée au projet.
Naviguez vers l’entrée app -> java -> com.ebookfrenzy.fingerprintdemo dans la fenêtre de l’outil Android Studio Project et cliquez dessus avec le bouton droit. Dans le menu résultant, sélectionnez l’option New -> Java Class pour afficher la boîte de dialogue Create New Class. Nommez la classe FingerprintHandler et cliquez sur le bouton OK pour créer la classe.
Modifiez le nouveau fichier de classe de sorte qu’il étende FingerprintManager.AuthenticationCallback, importe quelques modules supplémentaires et implémente une méthode de constructeur qui permettra de passer le contexte de l’application lorsqu’une instance de la classe est créée (le contexte sera utilisé dans les méthodes de rappel pour notifier à l’utilisateur l’état de l’authentification):
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; }}
Puis il faut ajouter une méthode qui peut être appelée pour initier l’authentification par empreinte digitale. Lorsqu’elle est appelée, cette méthode devra se voir passer les instances FingerprintManager et CryptoObject. Nommez cette méthode startAuth et implémentez-la dans le fichier de classe FingerprintHandler.java comme suit (notez que du code a également été ajouté pour vérifier une fois de plus que l’autorisation de l’empreinte digitale a été accordée):
Puis, ajoutez les méthodes du gestionnaire de rappel, chacune d’entre elles étant implémentée pour afficher un message toast indiquant le résultat de l’authentification de l’empreinte digitale:
La dernière tâche avant de tester le projet est de modifier la méthode onCreate afin qu’elle crée une nouvelle instance de la classe FingerprintHandler et appelle la méthode startAuth. Modifiez le fichier FingerprintDemoActivity.java et modifiez la fin de la méthode onCreate afin qu’elle se lise comme suit :
Tester le projet
Avec le projet maintenant terminé, exécutez l’application sur un appareil Android physique ou une session d’émulateur. Une fois en cours d’exécution, touchez le capteur d’empreintes digitales ou utilisez le panneau de commandes étendu dans l’émulateur pour simuler une touche d’empreinte digitale comme indiqué dans le chapitre intitulé Utilisation et configuration de l’émulateur Android Studio 2 AVD. En supposant qu’une empreinte digitale enregistrée est détectée, un message de toast apparaîtra pour indiquer une authentification réussie, comme indiqué dans la Figure 62-6 :
Figure 62-6
Arrêtez l’application en cours d’exécution et relancez-la, en utilisant cette fois une empreinte digitale non enregistrée pour tenter l’authentification. Cette fois, un message de toast devrait apparaître indiquant que l’authentification a échoué.
Summary
L’authentification par empreinte digitale au sein d’Android est un processus en plusieurs étapes qui peut sembler complexe au départ. Lorsqu’il est décomposé en étapes individuelles, cependant, le processus devient plus clair. L’authentification par empreinte digitale implique l’utilisation de clés, de chiffrements et de stockage de clés combinés aux fonctionnalités de la classe FingerprintManager. Ce chapitre a fourni une introduction à ces étapes et a travaillé à la création d’un projet d’application d’exemple destiné à montrer la mise en œuvre pratique de l’authentification par empreinte digitale dans Android.