Visão geral
A autenticação facial permite que os usuários desbloqueiem o dispositivo simplesmente olhando para a parte frontal dele. O Android 10 oferece suporte a uma nova pilha de autenticação facial que pode processar de forma segura os frames da câmera, preservando a segurança e a privacidade durante a autenticação facial no hardware compatível. O Android 10 também oferece uma maneira fácil para que implementações seguras permitam a integração de aplicativos para transações, como internet banking ou outros serviços.
A pilha de autenticação facial do Android é uma nova implementação no Android
10. A nova implementação apresenta as interfaces IBiometricsFace.hal, IBiometricsFaceClientCallback.hal e types.hal.
Arquitetura
A API BiometricPrompt inclui toda a autenticação biométrica, incluindo rosto, dedo e íris. O HAL de rosto interage com os seguintes componentes:
Figura 1. Pilha biométrica.
FaceManager
FaceManager é uma interface particular que mantém uma
conexão com FaceService. Usado pelo Keyguard para
acessar a autenticação facial com uma interface personalizada. Os apps não têm acesso ao FaceManager e precisam usar BiometricPrompt.
FaceService
Essa é a implementação do framework que gerencia o acesso ao hardware de autenticação facial. Ele contém máquinas de estado básicas de inscrição e autenticação, além de vários outros helpers (por exemplo, enumeração). Devido a problemas de estabilidade e segurança, nenhum código de fornecedor pode ser executado nesse processo. Todo o código do fornecedor é acessado pela interface HIDL Face 1.0.
enfrentou
É um executável do Linux que implementa a interface HIDL do Face 1.0 usada
pelo FaceService. Ele se registra como IBiometricsFace@1.0 para que o FaceService
possa encontrá-lo.
Implementação
HIDL de rosto
Para implementar o HIDL de rosto, é preciso implementar todos os métodos de IBiometricsFace.hal
em uma biblioteca específica do fornecedor.
Mensagens de erro
As mensagens de erro são enviadas por um callback e retornam a máquina de estados ao estado idle depois de serem enviadas. A maioria das mensagens tem uma
string correspondente voltada ao usuário para informar sobre o erro, mas nem todos os
erros têm essa string. Para mais informações sobre mensagens de erro, consulte
types.hal.
Todas as mensagens de erro representam um estado terminal, ou seja, a estrutura pressupõe que a HAL retorna a um estado ocioso após enviar uma mensagem de erro.
Mensagens de aquisição
As mensagens de aquisição são enviadas durante a inscrição ou autenticação e
orientam o usuário para uma inscrição ou autenticação bem-sucedida.
Cada ordinal tem uma mensagem associada do arquivo FaceAuthenticationManager.java. Mensagens específicas do fornecedor podem ser adicionadas desde que as strings de ajuda correspondentes sejam fornecidas. As mensagens de aquisição não são estados finais por si só. Espera-se que a HAL envie quantas forem necessárias para concluir a inscrição ou autenticação atual. Se uma mensagem de aquisição
resultar em um estado terminal em que não é possível fazer progresso, a HAL deverá
seguir as mensagens de aquisição com uma mensagem de erro, por exemplo, quando a
imagem está muito escura e permanece assim para que o progresso seja feito. Nesse caso, é razoável enviar UNABLE_TO_PROCESS depois de várias tentativas sem sucesso.
Hardware
Para que os dispositivos atendam aos requisitos de biometria avançada do Android 10, eles precisam ter hardware seguro para garantir a integridade dos dados faciais e a comparação final de autenticação. O Documento de definição de compatibilidade (CDD) do Android descreve o nível de segurança exigido e a taxa de aceitação de falsificação (SAR, na sigla em inglês) aceitável. Um ambiente de execução confiável (TEE) é necessário para o processamento e o reconhecimento seguros. Além disso, é necessário hardware de câmera seguro para evitar ataques de injeção na autenticação facial. Por exemplo, as páginas de memória associadas aos dados de imagem podem ser privilegiadas e marcadas como somente leitura para que apenas o hardware da câmera possa atualizá-las. O ideal é que nenhum processo tenha acesso, exceto o TEE e o hardware.
Como o hardware de autenticação facial varia consideravelmente, é necessário
desenvolver drivers específicos para ativar a autenticação facial, dependendo da
arquitetura específica do dispositivo. Assim, não há uma implementação de referência para faced.
Métodos
Os métodos a seguir são assíncronos e precisam retornar imediatamente ao framework. Se isso não acontecer, o sistema ficará lento e poderá haver redefinições do Watchdog. Recomendamos ter uma fila de mensagens com várias linhas de execução para evitar o bloqueio do caller. Todas as solicitações GET devem armazenar informações em cache sempre que possível para que o chamador seja bloqueado por um período mínimo.
| Método | Descrição |
|---|---|
setCallback() |
Chamado por FaceService para encaminhar todas as mensagens de volta para si mesmo. |
setActiveUser() |
Define o usuário ativo, a que todas as operações HAL subsequentes são aplicadas. A autenticação é sempre para esse usuário até que esse método seja chamado novamente. |
revokeChallenge() |
Finaliza a transação segura invalidando o desafio gerado
pelo generateChallenge(). |
enroll() |
Registra o rosto de um usuário. |
cancel() |
Cancela a operação atual (por exemplo, registrar, autenticar,
remover ou enumerar) e retorna faced ao estado inativo. |
enumerate() |
Enumera todos os modelos de rosto associados ao usuário ativo. |
remove() |
Remove um modelo de rosto ou todos os modelos de rosto associados ao usuário ativo. |
authenticate() |
Autentica o usuário ativo. |
userActivity() |
Esse método só deve ser usado quando a HAL estiver no estado de autenticação ou
em espera. Usar esse método quando a HAL não está em um desses
estados retorna OPERATION_NOT_SUPPORTED. Chamar esse método enquanto a HAL já está autenticando pode aumentar o tempo que o sistema leva para procurar um rosto. |
resetLockout() |
Quando muitas faces são rejeitadas, o faced precisa entrar em um estado de bloqueio (LOCKOUT ou LOCKOUT_PERMANENT). Quando isso
acontece, é necessário enviar o tempo restante para o framework para que ele possa
exibir para o usuário. Assim como setFeature(), esse método exige um
token de autenticação de hardware (HAT, na sigla em inglês) ativo para redefinir o estado interno com segurança. Redefine o bloqueio apenas para o usuário atual. |
Os três métodos restantes são síncronos e devem bloquear pelo tempo mínimo para evitar a paralisação da estrutura.
| Método | Descrição |
|---|---|
generateChallenge() |
Gera um token aleatório exclusivo e criptograficamente seguro usado para indicar o início de uma transação segura. |
setFeature() |
Ativa ou desativa um recurso para o usuário atual. Por motivos de segurança, isso exige um HAT para verificar o PIN/padrão/senha do usuário em relação ao desafio acima. |
getFeature() |
Recupera o estado de ativação atual do recurso, conforme determinado pelo
padrão ou uma chamada para setFeature() acima. Se o Face ID for inválido, a
implementação precisará retornar ILLEGAL_ARGUMENT |
getAuthenticatorId() |
Retorna um identificador associado ao conjunto de rostos atual. Esse identificador precisa mudar sempre que um rosto é adicionado |
Diagrama de estado
O framework espera que faced siga o diagrama de estado abaixo.
Figura 2. Fluxo de estado da autenticação facial.