Аутентификация по лицу HIDL

Обзор

Аутентификация по лицу позволяет пользователям разблокировать устройство, просто взглянув на его переднюю панель. В Android 10 реализована поддержка нового стека аутентификации по лицу, который может безопасно обрабатывать кадры с камеры, обеспечивая безопасность и конфиденциальность во время аутентификации по лицу на поддерживаемом оборудовании. Android 10 также предоставляет простой способ для реализации, соответствующей требованиям безопасности, для интеграции приложений для транзакций, таких как онлайн-банкинг или другие сервисы.

Стек аутентификации по лицу Android — это новая реализация в Android 10. Новая реализация представляет интерфейсы IBiometricsFace.hal , IBiometricsFaceClientCallback.hal и types.hal .

Архитектура

API BiometricPrompt включает в себя все виды биометрической аутентификации, включая распознавание лица, отпечатков пальцев и радужной оболочки глаза. Face HAL взаимодействует со следующими компонентами.

Биометрический стек

Рисунок 1. Биометрический стек.

FaceManager

FaceManager — это закрытый интерфейс, поддерживающий соединение с FaceService . Он используется Keyguard для доступа к аутентификации по лицу с помощью пользовательского интерфейса. Приложения не имеют доступа к FaceManager и должны использовать вместо него BiometricPrompt .

FaceService

Это реализация фреймворка, управляющая доступом к аппаратному обеспечению аутентификации по лицу. Она содержит базовые конечные автоматы регистрации и аутентификации, а также различные вспомогательные функции (например, перечисление). В целях обеспечения стабильности и безопасности запуск кода поставщика в этом процессе запрещён. Доступ ко всему коду поставщика осуществляется через интерфейс Face 1.0 HIDL .

столкнулся

Это исполняемый файл Linux, реализующий интерфейс Face 1.0 HIDL, используемый FaceService . Он регистрируется как IBiometricsFace@1.0, чтобы FaceService мог его найти.

Выполнение

Лицо HIDL

Для реализации Face HIDL необходимо реализовать все методы IBiometricsFace.hal в библиотеке, специфичной для поставщика.

Сообщения об ошибках

Сообщения об ошибках отправляются функцией обратного вызова и возвращают конечный автомат в состояние ожидания после отправки. Большинство сообщений имеют соответствующую строку, информирующую пользователя об ошибке, но не все ошибки имеют такую ​​строку. Подробнее о сообщениях об ошибках см. в types.hal . Все сообщения об ошибках представляют собой конечное состояние, то есть фреймворк предполагает, что HAL возвращается в состояние ожидания после отправки сообщения об ошибке.

Сообщения о приобретении

Сообщения о получении данных доставляются во время регистрации или аутентификации и призваны помочь пользователю успешно пройти регистрацию или аутентификацию. Каждому порядковому номеру соответствует сообщение из файла FaceAuthenticationManager.java . Можно добавлять сообщения, специфичные для поставщика, при условии предоставления соответствующих строк справки. Сообщения о получении данных сами по себе не являются конечными состояниями; ожидается, что HAL отправит столько сообщений, сколько необходимо для завершения текущей регистрации или аутентификации. Если сообщение о получении данных приводит к конечному состоянию, в котором невозможно продолжить процесс, то HAL должен отправить сообщение об ошибке, например, если изображение слишком темное и остается слишком темным для продолжения процесса. В этом случае разумно отправить UNABLE_TO_PROCESS после нескольких попыток, но безуспешно.

Аппаратное обеспечение

Чтобы устройства соответствовали строгим биометрическим требованиям Android 10, они должны быть оснащены безопасным аппаратным обеспечением для обеспечения целостности данных о лице и окончательного сравнения результатов аутентификации. В документе определения совместимости Android (CDD) описан требуемый уровень безопасности и приемлемый уровень принятия подделок (SAR). Для безопасной обработки и распознавания требуется доверенная среда выполнения (TEE). Кроме того, для предотвращения атак с использованием инъекций при аутентификации по лицу требуется безопасное аппаратное обеспечение камеры. Например, соответствующие страницы памяти для данных изображений могут быть привилегированными и помечены как доступные только для чтения, чтобы их могло обновлять только оборудование камеры. В идеале доступ к ним не должен иметь ни один процесс, кроме TEE и оборудования.

Поскольку аппаратное обеспечение для аутентификации по лицу значительно различается, необходимо разрабатывать специализированные драйверы для реализации аутентификации по лицу, зависящие от архитектуры конкретного устройства. В связи с этим, эталонной реализации для faced не существует.

Методы

Все перечисленные ниже методы являются асинхронными и должны немедленно возвращать управление фреймворку. Невыполнение этого требования приводит к замедлению работы системы и возможному сбросу сторожевого таймера. Рекомендуется использовать очередь сообщений с несколькими потоками, чтобы избежать блокировки вызывающего объекта. Все запросы GET должны по возможности кэшировать информацию, чтобы вызывающий объект блокировался как можно меньше времени.

Метод Описание
setCallback() Вызывается FaceService для пересылки всех сообщений обратно к себе.
setActiveUser() Устанавливает активного пользователя, к которому будут применяться все последующие операции HAL. Аутентификация всегда выполняется для этого пользователя до следующего вызова этого метода.
revokeChallenge() Завершает безопасную транзакцию, отменяя вызов, созданный generateChallenge() .
enroll() Регистрирует лицо пользователя.
cancel() Отменяет текущую операцию (например, регистрацию, аутентификацию, удаление или перечисление) и возвращает faced в состояние ожидания.
enumerate() Перечисляет все шаблоны лиц, связанные с активным пользователем.
remove() Удаляет шаблон лица или все шаблоны лица, связанные с активным пользователем.
authenticate() Аутентифицирует активного пользователя.
userActivity() Этот метод следует использовать только когда HAL находится в состоянии аутентификации или ожидания. Использование этого метода, когда HAL не находится ни в одном из этих состояний, возвращает OPERATION_NOT_SUPPORTED . Вызов этого метода во время аутентификации HAL может увеличить время, необходимое системе для поиска лица.
resetLockout() Если отклонено слишком много лиц, faced должен перейти в состояние блокировки ( LOCKOUT или LOCKOUT_PERMANENT ). В этом случае необходимо отправить фреймворку оставшееся время, чтобы он мог отобразить его пользователю. Как и в случае с setFeature() , этому методу требуется активный аппаратный токен аутентификации (HAT) для безопасного сброса внутреннего состояния. Сбрасывает блокировку только для текущего пользователя.

Все три оставшихся метода являются синхронными и должны блокироваться на минимальное время, чтобы избежать остановки фреймворка.

Метод Описание
generateChallenge() Генерирует уникальный и криптографически безопасный случайный токен, используемый для обозначения начала безопасной транзакции.
setFeature() Включает или отключает функцию для текущего пользователя. В целях безопасности требуется, чтобы HAT проверил PIN-код/графический ключ/пароль пользователя на соответствие вышеуказанному требованию.
getFeature() Возвращает текущее состояние включения функции, заданное значением по умолчанию или вызовом setFeature() выше. Если идентификатор лица недействителен, реализация должна вернуть ILLEGAL_ARGUMENT
getAuthenticatorId() Возвращает идентификатор, связанный с текущим набором лиц. Этот идентификатор должен меняться при каждом добавлении лица.

диаграмма состояний

Фреймворк ожидает, faced будет следовать диаграмме состояний, представленной ниже.

Диаграмма состояний

Рисунок 2. Поток состояний аутентификации по лицу.