Отпечаток пальца HIDL

На устройствах со сканером отпечатков пальцев пользователи могут зарегистрировать один или несколько отпечатков пальцев и использовать их для разблокировки устройства и выполнения других задач. Android использует язык определения интерфейса аппаратного обеспечения отпечатков пальцев (HIDL) для подключения к библиотеке конкретного производителя и аппаратному обеспечению для распознавания отпечатков пальцев (например, к сканеру отпечатков пальцев).

Для реализации Fingerprint HIDL необходимо интегрировать IBiometricsFingerprint.hal в библиотеку, специфичную для конкретного поставщика.

сопоставление отпечатков пальцев

Датчик отпечатков пальцев устройства обычно находится в режиме ожидания. Однако в ответ на запрос authenticate или enroll датчик отпечатков пальцев реагирует на прикосновение (экран также может активироваться, когда пользователь касается датчика отпечатков пальцев). Общий алгоритм сопоставления отпечатков пальцев включает следующие шаги:

  1. Пользователь прикладывает палец к датчику отпечатков пальцев.
  2. Специфическая для поставщика библиотека определяет, есть ли совпадение отпечатков пальцев в текущем наборе зарегистрированных шаблонов отпечатков пальцев.
  3. Результаты сопоставления передаются в FingerprintService .

Данный алгоритм предполагает, что отпечаток пальца уже зарегистрирован на устройстве, то есть библиотека, специфичная для производителя, зарегистрировала шаблон для отпечатка пальца. Более подробную информацию см. в разделе «Аутентификация» .

Архитектура

HAL-модуль для распознавания отпечатков пальцев взаимодействует со следующими компонентами.

  • BiometricManager взаимодействует напрямую с приложением в рамках процесса приложения. Каждое приложение имеет экземпляр IBiometricsFingerprint.hal
  • FingerprintService работает в системном процессе, который обеспечивает связь с HAL-интерфейсом для распознавания отпечатков пальцев.
  • Fingerprint HAL — это реализация интерфейса IBiometricsFingerprint HIDL на языке C/C++. Она содержит библиотеку, специфичную для конкретного производителя, которая взаимодействует с оборудованием, специфичным для устройства.
  • Компоненты Keystore API и KeyMint (ранее Keymaster) обеспечивают аппаратную криптографию для безопасного хранения ключей в защищенной среде, такой как доверенная среда выполнения (TEE).
Поток данных для аутентификации по отпечатку пальца
Рисунок 1. Высокоуровневая схема потока данных для аутентификации по отпечатку пальца.

В реализации HAL, разработанной конкретным производителем, должен использоваться протокол связи, требуемый TEE. Необработанные изображения и обработанные характеристики отпечатков пальцев не должны передаваться в ненадежную память. Все такие биометрические данные должны храниться в защищенном оборудовании, таком как TEE. Получение root-прав не должно приводить к компрометации биометрических данных.

FingerprintService и fingerprintd выполняют вызовы через HAL Fingerprint к библиотеке конкретного поставщика для регистрации отпечатков пальцев и выполнения других операций.

Взаимодействие с отпечатками пальцев
Рисунок 2. Взаимодействие демона отпечатков пальцев с библиотекой отпечатков пальцев, специфичной для конкретного производителя.

Руководящие принципы внедрения

Следующие рекомендации по использованию HAL для распознавания отпечатков пальцев разработаны для обеспечения защиты данных от утечки и их удаления при отключении пользователя от устройства:

  • Исходные данные отпечатков пальцев или их производные (например, шаблоны) никогда не должны быть доступны извне драйвера датчика или TEE. Если оборудование поддерживает TEE, доступ к оборудованию должен быть ограничен TEE и защищен политикой SELinux. Канал последовательного периферийного интерфейса (SPI) должен быть доступен только для TEE, и для всех файлов устройства должна быть явно задана политика SELinux.
  • Получение, регистрация и распознавание отпечатков пальцев должны происходить внутри TEE.
  • В файловой системе может храниться только зашифрованная форма данных отпечатка пальца, даже если сама файловая система зашифрована.
  • Шаблоны отпечатков пальцев должны быть подписаны закрытым ключом, специфичным для каждого устройства. Для расширенного стандарта шифрования (AES) шаблон должен быть подписан как минимум абсолютным путем к файлу в файловой системе, группой и идентификатором отпечатка пальца таким образом, чтобы файлы шаблона были неработоспособны на другом устройстве или для кого-либо, кроме пользователя, зарегистрировавшего их на том же устройстве. Например, копирование данных отпечатков пальцев другого пользователя на том же устройстве или с другого устройства не должно работать.
  • Реализация должна либо использовать путь к файлу в файловой системе, предоставляемый функцией setActiveGroup() , либо обеспечить способ удаления всех данных шаблона пользователя при удалении пользователя. Настоятельно рекомендуется хранить файлы шаблонов отпечатков пальцев в зашифрованном виде по указанному пути. Если это невозможно из-за требований к объему хранилища TEE, разработчик должен добавить механизмы для обеспечения удаления данных при удалении пользователя.

Методы снятия отпечатков пальцев

Интерфейс Fingerprint HIDL содержит следующие основные методы в файле IBiometricsFingerprint.hal .

Метод Описание
enroll() Переключает конечный автомат HAL на запуск сбора и хранения шаблона отпечатка пальца. После завершения регистрации или по истечении времени ожидания конечный автомат HAL возвращается в состояние ожидания.
preEnroll() Генерирует уникальный токен, указывающий на начало регистрации отпечатка пальца. Предоставляет токен функции enroll , чтобы убедиться в наличии предварительной аутентификации, например, с использованием пароля. Для предотвращения подделки токен сохраняется после подтверждения учетных данных устройства. Токен необходимо проверить во время регистрации, чтобы убедиться в его действительности.
getAuthenticatorId() Возвращает токен, связанный с текущим набором отпечатков пальцев.
cancel() Отменяет ожидающие операции регистрации или аутентификации. Конечный автомат HAL возвращается в состояние ожидания.
enumerate() Синхронный вызов для перечисления всех известных шаблонов отпечатков пальцев.
remove() Удаляет шаблон отпечатка пальца.
setActiveGroup() Ограничивает операцию HAL набором отпечатков, принадлежащих к указанной группе, идентифицируемой идентификатором группы (GID).
authenticate() Проводит аутентификацию операции, связанной с отпечатком пальца (идентифицируемой по идентификатору операции).
setNotify() Регистрирует пользовательскую функцию, которая получает уведомления от HAL. Если конечный автомат HAL находится в состоянии занятости, функция блокируется до тех пор, пока HAL не выйдет из этого состояния.
postEnroll() Завершает операцию регистрации и аннулирует запрос, сгенерированный функцией preEnroll() . Эту функцию необходимо вызывать в конце сеанса регистрации нескольких пальцев, чтобы указать, что добавление новых пальцев невозможно.

Для получения более подробной информации по этим вопросам обратитесь к комментариям в файле IBiometricsFingerprint.hal .