אימות פנים HIDL

סקירה כללית

אימות הפנים מאפשר למשתמשים לבטל את הנעילה של המכשיר פשוט על ידי התבוננות בחלק הקדמי שלו. ב-Android 10 נוספה תמיכה בסטאק חדש לאימות פנים, שיכול לעבד באופן מאובטח את התמונות מהמצלמה, לשמור על האבטחה והפרטיות במהלך אימות הפנים בחומרה נתמכת. ב-Android 10 יש גם דרך קלה להטמעות תואמות אבטחה שמאפשרות שילוב של אפליקציות לעסקאות, כמו בנקאות אונליין או שירותים אחרים.

סטאק אימות הפנים של Android הוא הטמעה חדשה ב-Android 10. בהטמעה החדשה מופיעים הממשקים IBiometricsFace.hal,‏ IBiometricsFaceClientCallback.hal ו-types.hal.

ארכיטקטורה

ממשק ה-API של BiometricPrompt כולל את כל סוגי האימות הביומטרי, כולל אימות פנים, אצבע איריס. ה-HAL של Face פועל בשילוב עם הרכיבים הבאים.

סטאק ביומטריה

איור 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 בספרייה ספציפית לספק.

הודעות שגיאה

הודעות השגיאה נשלחות באמצעות קריאה חוזרת (callback), והן מחזירות את מכונת המצבים למצב 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() שלמעלה. אם מזהה הפנים לא תקין, ההטמעה חייבת להחזיר את הערך ILLEGAL_ARGUMENT
getAuthenticatorId() הפונקציה מחזירה מזהה שמשויך לקבוצת הפנים הנוכחית. המזהה הזה חייב להשתנות בכל פעם שמתווסף פנים

תרשים מצב

לפי המסגרת, faced צריך לפעול בהתאם לתרשים המצבים הבא.

תרשים מצב

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