얼굴 인증 HIDL

개요

얼굴 인증을 사용하면 기기 전면을 바라보는 것으로 기기를 잠금 해제할 수 있습니다. Android 10은 카메라 프레임을 안전하게 처리할 수 있는 새로운 얼굴 인증 스택을 추가적으로 지원하여 지원되는 하드웨어에서 얼굴 인증 시 보안을 유지하고 개인 정보를 보호합니다. 또한 온라인 뱅킹 또는 기타 서비스와 같은 트랜잭션에 애플리케이션을 통합할 수 있는 간편한 보안 준수 구현 방법을 제공합니다.

Android 얼굴 인증 스택은 Android 10의 새로운 구현입니다. 새 구현에서는 IBiometricsFace.hal, IBiometricsFaceClientCallback.hal, types.hal 인터페이스가 도입되었습니다.

아키텍처

BiometricPrompt API에는 얼굴, 지문, 홍채를 비롯한 모든 생체 인식 인증이 포함됩니다. Face HAL은 다음 구성요소와 상호 작용합니다.

생체 인식 스택
그림 1. 생체 인식 스택

FaceManager

FaceManagerFaceService와 연결을 유지하는 비공개 인터페이스입니다. Keyguard에서 맞춤 UI로 얼굴 인증에 액세스하는 데 사용합니다. 앱에서는 FaceManager에 액세스할 수 없으며 대신 BiometricPrompt를 사용해야 합니다.

FaceService

얼굴 인증 하드웨어의 액세스 권한을 관리하는 프레임워크 구현입니다. 여기에는 기본 등록 및 인증 상태 시스템과 다양한 기타 도우미(예: 열거형)가 포함됩니다. 안정성 및 보안 문제로 인해 이 프로세스에서 공급업체 코드를 실행할 수 없습니다. 모든 공급업체 코드는 Face 1.0 HIDL 인터페이스를 통해 액세스됩니다.

faced

FaceService에서 사용하는 Face 1.0 HIDL 인터페이스를 구현하는 Linux 실행 파일입니다. FaceService에서 찾을 수 있도록 IBiometricsFace@1.0으로 자체 등록됩니다.

구현

Face HIDL

Face HIDL을 구현하려면 공급업체별 라이브러리에서 모든 IBiometricsFace.hal 메서드를 구현해야 합니다.

오류 메시지

오류 메시지는 콜백에 의해 전송되며 전송된 후에 상태 시스템을 유휴 상태로 되돌립니다. 대부분의 메시지에는 사용자에게 오류를 알리는 사용자 표시 문자열이 있지만 모든 오류에 사용자 표시 문자열이 있는 것은 아닙니다. 오류 메시지에 관한 자세한 내용은 types.hal을 참조하세요. 모든 오류 메시지는 최종적인 상태를 나타내며 이는 프레임워크가 오류 메시지를 보낸 후 HAL이 유휴 상태로 돌아간다고 가정함을 의미합니다.

획득 메시지

획득 메시지는 등록 또는 인증 중에 전달되며 사용자가 등록 또는 인증에 성공하도록 안내하기 위한 것입니다. 서수마다 FaceAuthenticationManager.java 파일의 연결된 메시지가 있습니다. 공급업체별 메시지는 해당 도움말 문자열이 제공되면 추가할 수 있습니다. 획득 메시지가 그 자체로 최종적인 상태인 것은 아닙니다. HAL은 현재 등록 또는 인증을 완료하는 데 필요한 만큼 메시지를 전송합니다. 획득 메시지로 인해 진행할 수 없는 최종적인 상태(예: 이미지가 진행하기에 너무 어둡고 계속 어두운 상태인 경우)가 되면 HAL은 획득 메시지 다음에 오류 메시지를 표시해야 합니다. 이 경우 UNABLE_TO_PROCESS를 전송하기에 앞서 여러 번 시도한 후 더 이상 진행이 불가능하다는 점을 확인해야 합니다.

하드웨어

기기가 Android 10의 강력한 생체 인식 요구사항을 준수하려면 얼굴 데이터의 무결성과 궁극적인 인증 비교를 위해 보안 하드웨어가 있어야 합니다. Android 호환성 정의 문서(CDD)에서는 필수 보안 수준과 허용되는 Spoof Accept Rate(SAR)를 설명합니다. 안전한 처리 및 인식을 위해서는 신뢰할 수 있는 실행 환경(TEE)이 필요합니다. 또한 보안 카메라 하드웨어는 얼굴 인증에 대한 삽입 공격을 방지하기 위해 필요합니다. 예를 들어 이미지 데이터의 관련 메모리 페이지를 카메라 하드웨어에서만 업데이트할 수 있도록 읽기 전용으로 표시할 수 있습니다. TEE와 하드웨어를 제외하고는 어떤 프로세스도 액세스할 수 없는 것이 이상적입니다.

얼굴 인증 하드웨어는 매우 다양하기 때문에 특정 기기 아키텍처에 따라 얼굴 인증을 사용하려면 하드웨어별 드라이버를 개발해야 합니다. 그런 경우 faced 관련 참조 구현은 없습니다.

메서드

다음 메서드는 모두 비동기식이며 프레임워크로 즉시 반환되어야 합니다. 그렇지 않으면 시스템이 느려지고 Watchdog가 재설정될 수 있습니다. 호출자를 차단하지 않으려면 스레드가 여러 개인 메시지 대기열을 사용하는 것이 좋습니다. 모든 GET 요청은 가능한 경우 정보를 캐시하여 호출자가 최소 시간 동안 차단되도록 해야 합니다

메서드 설명
setCallback() 모든 메시지를 다시 스스로에게 전달하기 위해 FaceService에서 호출합니다.
setActiveUser() 모든 후속 HAL 작업이 적용되는 활성 사용자를 설정합니다. 이 메서드가 다시 호출될 때까지는 인증이 항상 이 사용자에게 유효합니다.
revokeChallenge() generateChallenge()에서 생성한 문제를 무효화하여 보안 트랜잭션을 완료합니다.
enroll() 사용자의 얼굴을 등록합니다.
cancel() 현재 작업(예: 등록, 인증, 삭제 또는 열거)을 취소하고 유휴 상태로 faced를 반환합니다.
enumerate() 활성 사용자와 관련된 모든 얼굴 템플릿을 열거합니다.
remove() 활성 사용자와 관련된 얼굴 템플릿 또는 모든 얼굴 템플릿을 제거합니다.
authenticate() 활성 사용자를 인증합니다.
userActivity() 이 메서드는 HAL이 인증 중 또는 대기 상태일 때만 사용해야 합니다. HAL이 이러한 상태가 아닌 경우에 이 메서드를 사용하면 OPERATION_NOT_SUPPORTED가 반환됩니다. HAL이 이미 인증하는 중일 때 이 메서드를 호출하면 시스템이 얼굴을 찾는 시간이 늘어날 수 있습니다.
resetLockout() 얼굴이 너무 많이 거부되는 경우 잠금 상태(LOCKOUT 또는 LOCKOUT_PERMANENT)를 해제하는 데 faced가 필요합니다. 이 경우 사용자에게 남은 시간이 표시되도록 남은 시간을 프레임워크에 전송해야 합니다. setFeature()와 마찬가지로 이 메서드를 사용하려면 활성 상태의 하드웨어 인증 토큰(HAT)을 사용하여 내부 상태를 안전하게 재설정해야 합니다. 현재 사용자에 한해서만 잠금을 재설정합니다.

나머지 세 가지 메서드는 모두 동기식이며 프레임워크를 지연시키지 않도록 최소한의 시간 동안 차단해야 합니다.

메서드 설명
generateChallenge() 안전한 트랜잭션의 시작을 나타내는 데 사용되는 고유하고 암호화 방식으로 안전한 임의의 토큰을 생성합니다.
setFeature() 현재 사용자의 기능을 사용 설정 또는 사용 중지합니다. 보안상의 이유로 HAT는 위의 문제에 사용자의 PIN/패턴/비밀번호를 확인해야 합니다.
getFeature() 기본값 또는 위 setFeature() 호출에 따라 기능의 현재 지원 상태를 검색합니다. 얼굴 ID가 잘못된 경우 구현 시 ILLEGAL_ARGUMENT가 반환되어야 합니다.
getAuthenticatorId() 현재 얼굴 세트와 관련된 식별자를 반환합니다. 이 식별자는 얼굴이 추가될 때마다 필수로 변경해야 합니다.

상태 다이어그램

프레임워크에서는 faced가 아래 상태 다이어그램을 따라야 합니다.

상태 다이어그램
그림 2. 얼굴 인증 상태 흐름