Обзор
Аутентификация по лицу позволяет пользователям разблокировать устройство, просто взглянув на его переднюю панель. В 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. Поток состояний аутентификации по лицу.