סקירה כללית
אימות הפנים מאפשר למשתמשים לבטל את הנעילה של המכשיר פשוט על ידי התבוננות בחלק הקדמי שלו. ב-Android 10 הוספנו תמיכה בסטאק חדש של אימות פנים שיכול לעבד פריימים של מצלמות באופן מאובטח, תוך שמירה על האבטחה והפרטיות במהלך אימות הפנים בחומרה נתמכת. ב-Android 10 יש גם דרך קלה להטמעות תואמות אבטחה שמאפשרות שילוב של אפליקציות לעסקאות, כמו בנקאות אונליין או שירותים אחרים.
סטאק אימות הפנים של Android הוא הטמעה חדשה ב-Android 10. בהטמעה החדשה מופיעים הממשקים IBiometricsFace.hal
, IBiometricsFaceClientCallback.hal
ו-types.hal
.
ארכיטקטורה
ממשק ה-API של BiometricPrompt כולל את כל סוגי האימות הביומטרי, כולל אימות פנים, אצבע איריס. ה-HAL של Face פועל בשילוב עם הרכיבים הבאים.
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, צריך להטמיע את כל ה-methods של IBiometricsFace.hal
בספרייה ספציפית לספק.
הודעות שגיאה
הודעות השגיאה נשלחות באמצעות קריאה חוזרת (callback) ומחזירות את המכונה של המצב למצב idle אחרי שנשלחו. לרוב ההודעות יש מחרוזת תואמת שמוצגת למשתמש כדי להודיע לו על השגיאה, אבל לא לכל השגיאות יש מחרוזת כזו. למידע נוסף על הודעות שגיאה, ראו types.hal
.
כל הודעות השגיאה מייצגות מצב סופי. כלומר, ה-framework מניח שה-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
צריך לפעול בהתאם לתרשים המצבים הבא.