סקירה כללית
אימות פנים מאפשר למשתמשים לבטל את הנעילה של המכשיר פשוט על ידי הסתכלות על החלק הקדמי של המכשיר. ב-Android 10 נוסף תמיכה במערך חדש של אימות פנים שיכול לעבד בצורה מאובטחת פריימים של מצלמה, תוך שמירה על אבטחה ופרטיות במהלך אימות הפנים בחומרה נתמכת. ב-Android 10 יש גם דרך קלה להטמעה של תאימות אבטחה כדי לאפשר שילוב של אפליקציות בעסקאות, כמו בנקאות באינטרנט או שירותים אחרים.
מערכת אימות הפנים ב-Android היא הטמעה חדשה ב-Android 10. ההטמעה החדשה כוללת את הממשקים IBiometricsFace.hal
, IBiometricsFaceClientCallback.hal
ו-types.hal
.
ארכיטקטורה
ממשק ה-API BiometricPrompt כולל את כל סוגי האימות הביומטרי, כולל פנים, טביעת אצבע וקשתית העין. הפנים של HAL מקיימות אינטראקציה עם הרכיבים הבאים.

איור 1. סטאק ביומטרי.
FaceManager
FaceManager
הוא ממשק פרטי ששומר על חיבור עם FaceService
. הוא משמש את Keyguard כדי לגשת לאימות פנים עם ממשק משתמש בהתאמה אישית. לאפליקציות אין גישה ל-FaceManager, והן צריכות להשתמש במקומו ב-BiometricPrompt
.
FaceService
זוהי הטמעה של מסגרת שמנהלת את הגישה לחומרה של אימות הפנים. היא מכילה מכונות מצב בסיסיות של שיוך ואימות, וגם כלים שונים אחרים (למשל, ספירה). מסיבות של יציבות ואבטחה, אסור להריץ קוד של ספק בתהליך הזה. הגישה לכל קוד הספק מתבצעת דרך ממשק Face 1.0 HIDL.
התמודדות
זהו קובץ הפעלה של Linux שמיישם את ממשק Face 1.0 HIDL שמשמש את FaceService
. הוא נרשם כ-IBiometricsFace@1.0 כדי ש-FaceService
יוכל למצוא אותו.
הטמעה
Face HIDL
כדי להטמיע את Face HIDL, צריך להטמיע את כל השיטות של IBiometricsFace.hal
בספרייה ספציפית לספק.
הודעות שגיאה
הודעות שגיאה נשלחות על ידי קריאה חוזרת ומחזירות את מכונת המצבים למצב idle אחרי שהן נשלחות. לרוב ההודעות יש מחרוזת תואמת שמוצגת למשתמש כדי לעדכן אותו לגבי השגיאה, אבל לא לכל השגיאות יש מחרוזת כזו. מידע נוסף על הודעות שגיאה זמין במאמר types.hal
.
כל הודעות השגיאה מייצגות מצב סופי, כלומר המסגרת מניחה ש-HAL חוזר למצב סרק אחרי שליחת הודעת שגיאה.
הודעות על צירוף משתמשים
הודעות לגבי רכישה מועברות במהלך ההרשמה או האימות, ומטרתן להנחות את המשתמש להשלמת ההרשמה או האימות.
לכל מספר סידורי יש הודעה משויכת מקובץ FaceAuthenticationManager.java
. אפשר להוסיף הודעות ספציפיות לספק כל עוד מספקים את מחרוזות העזרה המתאימות. הודעות צירוף משתמשים הן לא מצבים סופיים בפני עצמם. המערכת מצפה ש-HAL ישלח כמה שיותר הודעות כאלה שנדרשות כדי להשלים את ההרשמה או האימות הנוכחיים. אם הודעת רכישה
מובילה למצב סופי שבו אי אפשר להתקדם, שכבת ה-HAL צריכה
לשלוח אחרי הודעות הרכישה הודעת שגיאה. לדוגמה, אם התמונה
כהה מדי ונשארת כהה מדי כך שאי אפשר להתקדם. במקרה כזה, אפשר לשלוח UNABLE_TO_PROCESS
אחרי כמה ניסיונות שלא הניבו התקדמות.
חומרה
כדי שמכשירים יעמדו בדרישות של ביומטריה חזקה ב-Android 10, הם צריכים לכלול חומרה מאובטחת שתבטיח את התקינות של נתוני הפנים ואת ההשוואה הסופית של האימות. מסמך ההגדרה של התאימות ל-Android (CDD) מפרט את רמת האבטחה הנדרשת ואת שיעור הקבלה המקסימלי של זיוף (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() |
אם נדחות יותר מדי פנים, צריך להשתמש ב-faced כדי להיכנס למצב נעילה (LOCKOUT או LOCKOUT_PERMANENT ). במצב כזה, צריך לשלוח את הזמן שנותר למסגרת כדי שהיא תוכל להציג אותו למשתמש. בדומה לשיטה setFeature() , השיטה הזו דורשת אסימון אימות חומרה (HAT) פעיל כדי לאפס בצורה מאובטחת את המצב הפנימי. מאפס את הנעילה רק למשתמש הנוכחי. |
שלוש השיטות שנותרו הן סינכרוניות, והן צריכות לחסום את הפעולה למשך הזמן המינימלי כדי למנוע את עצירת המסגרת.
שיטה | תיאור |
---|---|
generateChallenge() |
יוצרת טוקן אקראי ייחודי ומאובטח מבחינה קריפטוגרפית, שמשמש לציון ההתחלה של עסקה מאובטחת. |
setFeature() |
הפעלה או השבתה של תכונה עבור המשתמש הנוכחי. מטעמי אבטחה, נדרשת בקשת HAT כדי לבדוק את קוד האימות, התבנית או הסיסמה של המשתמש מול האתגר שלמעלה. |
getFeature() |
מחזירה את מצב ההפעלה הנוכחי של התכונה, כפי שנקבע על ידי
ברירת המחדל או קריאה ל-setFeature() שלמעלה. אם ה-Face ID לא תקין, ההטמעה צריכה להחזיר ILLEGAL_ARGUMENT |
getAuthenticatorId() |
מחזירה מזהה שמשויך לקבוצת הפנים הנוכחית. המזהה הזה חייב להשתנות בכל פעם שמוסיפים פנים |
דיאגרמת מצבים
המסגרת מצפה ש-faced
יפעל לפי דיאגרמת המצבים שמופיעה בהמשך.

איור 2. תהליך האימות באמצעות זיהוי פנים.