Аутентификация по отпечатку пальца Android использует сенсорный датчик смартфона для аутентификации пользователя. Android Marshmallow представила набор API, который упрощает использование сенсорного датчика. До Android Marshmallow метод доступа к сенсорному сенсору не был стандартным.
Есть несколько преимуществ использования аутентификации по отпечаткам пальцев Android:
- Быстрый и простой в использовании
- Безопасный: отпечаток пальца однозначно идентифицирует вас
- Онлайн транзакции безопаснее
Есть несколько шагов, которые вы должны выполнить, прежде чем использовать аутентификацию по отпечатку пальца Android, и в начале это может показаться очень сложным, но это руководство поможет вам шаг за шагом.
Конечным результатом является приложение для Android, которое использует аутентификацию по отпечатку пальца, как показано ниже:
Начало работы с аутентификацией по отпечатку пальца Android
Как уже было сказано, для включения аутентификации по отпечатку пальца необходимо выполнить несколько шагов:
- Убедитесь, что экран блокировки безопасен, или, другими словами, он защищен PIN-кодом, паролем или шаблоном
- Убедитесь, что на смартфоне зарегистрирован хотя бы один отпечаток
- Получить доступ к хранилищу ключей Android для хранения ключа, используемого для шифрования / дешифрования объекта
- Генерация ключа шифрования и шифра
- Запустите процесс аутентификации
- Реализуйте класс обратного вызова для обработки событий аутентификации
Это все !! .. Мы выполним эти шаги.
 Перед началом работы важно запросить разрешение на использование сенсорного датчика и аутентификацию по отпечатку пальца.  Итак, в Manifest.xml мы добавляем: 
| 1 | <uses-permissionandroid:name="android.permission.USE_FINGERPRINT"/> | 
Теперь пришло время создать наш основной класс активности, который обрабатывает весь процесс аутентификации.
Проверьте безопасный экран блокировки в Android
Первый шаг — проверка экрана безопасной блокировки. Это может быть сделано KeyguardManager и FingerprintManager. Мы получаем экземпляр этих двух менеджеров, используя getSystemService:
| 1 2 3 4 5 6 7 | // Keyguard ManagerKeyguardManager keyguardManager = (KeyguardManager)                  getSystemService(KEYGUARD_SERVICE);// Fingerprint ManagerfingerprintManager = (FingerprintManager)                  getSystemService(FINGERPRINT_SERVICE); | 
Теперь наше приложение аутентификации может проверить, выполнены ли все условия безопасности:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | privatebooleancheckFinger() {  // Keyguard Manager  KeyguardManager keyguardManager = (KeyguardManager)           getSystemService(KEYGUARD_SERVICE);  // Fingerprint Manager  fingerprintManager = (FingerprintManager)          getSystemService(FINGERPRINT_SERVICE);  try{   // Check if the fingerprint sensor is present   if(!fingerprintManager.isHardwareDetected()) {     // Update the UI with a message     message.setText("Fingerprint authentication not supported");     returnfalse;   }   if(!fingerprintManager.hasEnrolledFingerprints()) {     message.setText("No fingerprint configured.");     returnfalse;   }   if(!keyguardManager.isKeyguardSecure()) {     message.setText("Secure lock screen not enabled");     returnfalse;   } } catch(SecurityException se) {   se.printStackTrace(); } returntrue;} | 
Обратите внимание, что приложение аутентификации проверяет, что, по крайней мере, один отпечаток пальца зарегистрирован, иначе процесс аутентификации не может начаться.
Изображение ниже показывает сообщение об ошибке, когда приложение не находит зарегистрированный отпечаток пальца.
Если все в порядке и все условия выполнены, приложение аутентификации генерирует ключ и получает доступ к магазину Android.
Доступ к Android keystore и генерация ключа
Следующим шагом является доступ к хранилищу ключей Android и создание ключа для шифрования данных. Приложение делает это в отдельном методе, который называется generateKey ().
| 1 2 | // Get the reference to the key storekeyStore = KeyStore.getInstance("AndroidKeyStore"); | 
тогда нужно получить ссылку на генератор ключей:
| 1 2 3 | // Key generator to generate the keykeyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,                  "AndroidKeyStore"); | 
и, наконец, мы должны инициализировать генератор ключей:
| 01 02 03 04 05 06 07 08 09 10 11 | keyGenerator.init( new  KeyGenParameterSpec.Builder(KEY_NAME,  KeyProperties.PURPOSE_ENCRYPT |  KeyProperties.PURPOSE_DECRYPT)  .setBlockModes(KeyProperties.BLOCK_MODE_CBC)  .setUserAuthenticationRequired(true)  .setEncryptionPaddings(    KeyProperties.ENCRYPTION_PADDING_PKCS7)  .build()); keyGenerator.generateKey(); | 
Обратите внимание, что мы указываем использование ключа: encrypt и decrypt и что для использования самого ключа требуется аутентификация. В конце приложение генерирует ключ (последняя строка).
Ниже полный метод:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | privatevoidgenerateKey() throwsFingerprintException {  try{    // Get the reference to the key store    keyStore = KeyStore.getInstance("AndroidKeyStore");    // Key generator to generate the key    keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,      "AndroidKeyStore");     keyStore.load(null);     keyGenerator.init( new       KeyGenParameterSpec.Builder(KEY_NAME,      KeyProperties.PURPOSE_ENCRYPT |      KeyProperties.PURPOSE_DECRYPT)     .setBlockModes(KeyProperties.BLOCK_MODE_CBC)     .setUserAuthenticationRequired(true)     .setEncryptionPaddings(        KeyProperties.ENCRYPTION_PADDING_PKCS7)    .build());    keyGenerator.generateKey();  }  catch(KeyStoreException   | NoSuchAlgorithmException   | NoSuchProviderException   | InvalidAlgorithmParameterException   | CertificateException   | IOException exc) {    exc.printStackTrace();    thrownewFingerprintException(exc); }} | 
Создать Android-шифр
Когда ключ готов, последним шагом является создание Android- шифра, который использует ключ, который мы сгенерировали ранее. Исходный код очень прост:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | privateCipher generateCipher() throwsFingerprintException {  try{    Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"     + KeyProperties.BLOCK_MODE_CBC + "/"     + KeyProperties.ENCRYPTION_PADDING_PKCS7);     SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME,             null);     cipher.init(Cipher.ENCRYPT_MODE, key);     returncipher;  }  catch(NoSuchAlgorithmException     | NoSuchPaddingException     | InvalidKeyException     | UnrecoverableKeyException     | KeyStoreException exc) {      exc.printStackTrace();      thrownewFingerprintException(exc);  }} | 
Создайте приложение для Android по отпечаткам пальцев
  Настало время собрать все эти методы и создать приложение для аутентификации по отпечаткам пальцев Android.  Это приложение очень простое и имеет MainClass который вызывает методы, показанные выше, и запускает процесс аутентификации. 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | @OverrideprotectedvoidonCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  message = (TextView) findViewById(R.id.fingerStatus);  Button btn = (Button) findViewById(R.id.authBtn);  finalFingerprintHandler fph = newFingerprintHandler(message);  if(!checkFinger()) {    btn.setEnabled(false);  }  else{    // We are ready to set up the cipher and the key   try{     generateKey();     Cipher cipher = generateCipher();     cryptoObject =      newFingerprintManager.CryptoObject(cipher);  }  catch(FingerprintException fpe) {   // Handle exception   btn.setEnabled(false);  } } btn.setOnClickListener(newView.OnClickListener() {   @Override   publicvoidonClick(View view) {    message.setText("Swipe your finger");    fph.doAuth(fingerprintManager, cryptoObject);   }  });} | 
  Есть несколько вещей, на которые стоит обратить внимание.  Прежде всего, приложение Android создает CryptoObject который используется в процессе аутентификации.  Кроме того, приложение показывает кнопку, и когда пользователь нажимает на нее, начинается процесс аутентификации.  Кнопка отключена, если начальные условия, описанные выше, не выполнены.  Самая важная вещь, на которую стоит обратить внимание, — это новый класс FingerprintHandler .  Этот класс является классом обратного вызова, который получает события процесса аутентификации.  Кроме того, этот класс запускает процесс аутентификации с помощью метода doAuth. 
Обратный вызов аутентификации по отпечатку пальца Android
Последний шаг — создание класса обратного вызова, чтобы мы могли получать уведомления о событиях и знать, когда аутентификация прошла успешно или что-то пошло не так. Этот класс расширяет FingerprintManager .AuthenticationCallback .
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | publicclassFingerprintHandler extendsFingerprintManager.AuthenticationCallback {  privateTextView tv;  publicFingerprintHandler(TextView tv) {    this.tv = tv;  }  @Override  publicvoidonAuthenticationError(interrorCode, CharSequence errString) {    super.onAuthenticationError(errorCode, errString);    tv.setText("Auth error");  }  @Override  publicvoidonAuthenticationHelp(inthelpCode, CharSequence helpString) {    super.onAuthenticationHelp(helpCode, helpString);  }  @Override  publicvoidonAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {    super.onAuthenticationSucceeded(result);    tv.setText("auth ok");    tv.setTextColor(tv.getContext().getResources().                getColor(android.R.color.holo_green_light));  }  @Override  publicvoidonAuthenticationFailed() {    super.onAuthenticationFailed();  }  publicvoiddoAuth(FingerprintManager manager,                      FingerprintManager.CryptoObject obj) {   CancellationSignal signal = newCancellationSignal();   try{    manager.authenticate(obj, signal, 0, this, null);   }   catch(SecurityException sce) {} }} | 
Есть несколько важных способов заметить. Прежде всего, doAuth, который запускает процесс аутентификации. Этот метод имеет CryptoObject, сигнал отмены и прослушиватель обратного вызова (этот класс). Изображение ниже показывает приложение в действии:
В этом случае пользователь проходит аутентификацию с использованием аутентификации по отпечатку пальца Android .
Как протестировать приложение в эмуляторе Android
Для тестирования приложения можно использовать реальное устройство с сенсорным сенсором. В любом случае, приложение можно протестировать и в эмуляторе. Перед тем, как начать использовать приложение, вам необходимо настроить доступ к меню «Безопасность» по отпечатку пальца. Когда система запрашивает отпечаток пальца, вы должны использовать команду adb для эмуляции касания пальцем:
| 1 | adb -e emu finger touchid(like 1,2, ecc.) | 
Наконец, когда настройка завершена, вы получите сообщение, показанное ниже:
Надеемся, что в конце этого поста вы узнали об API-интерфейсе для Android-отпечатков пальцев и о том, как разработать пример приложения для Android-приложений.
| Ссылка: | Учебное пособие по идентификации отпечатков пальцев на Android от нашего партнера JCG Франческо Аццолы в блоге Surviving с Android . | 



