טביעת אצבע HIDL

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

כדי להטמיע את Fingerprint HIDL, צריך להטמיע את IBiometricsFingerprint.hal בספרייה ספציפית לספק.

התאמת טביעות אצבע

חיישן טביעות האצבע של המכשיר בדרך כלל לא פעיל. עם זאת, בתגובה לקריאה ל-authenticate או ל-enroll, חיישן טביעות האצבע מחכה לנגיעה (יכול להיות שהמסך יתעורר גם כשהמשתמש נוגע בחיישן טביעות האצבע). התהליך הכללי של התאמת טביעות אצבע כולל את השלבים הבאים:

  1. המשתמש מניח אצבע על חיישן טביעות האצבע.
  2. הספרייה הספציפית לספק קובעת אם יש התאמה של טביעת אצבע בקבוצה הנוכחית של תבניות טביעות האצבע הרשמות.
  3. התוצאות התואמות מועברות אל FingerprintService.

התהליך הזה מבוסס על ההנחה שכבר רשומה טביעת אצבע במכשיר, כלומר שהספרייה הספציפית לספק רשמה תבנית של טביעת האצבע. למידע נוסף, ראו אימות.

ארכיטקטורה

ה-HAL של טביעת האצבע יוצר אינטראקציה עם הרכיבים הבאים.

  • BiometricManager מתקשר ישירות עם אפליקציה בתהליך של אפליקציה. לכל אפליקציה יש מכונה של IBiometricsFingerprint.hal
  • FingerprintService פועל בתהליך המערכת, שמטפל בתקשורת עם HAL של טביעת האצבע.
  • Fingerprint HAL הוא הטמעה של ממשק IBiometricsFingerprint HIDL ב-C/C++. הוא מכיל את הספרייה הספציפית לספק שמתקשרת עם החומרה הספציפית למכשיר.
  • הרכיבים Keystore API ו-Keymaster מספקים הצפנה מגובה חומרה לאחסון מאובטח של מפתחות בסביבה מאובטחת, כמו Trusted Execution Environment‏ (TEE).
תהליך העברת הנתונים באימות באמצעות טביעת אצבע
איור 1. תעבורת נתונים ברמה גבוהה לאימות בטביעת אצבע

הטמעה של HAL ספציפית לספק חייבת להשתמש בפרוטוקול התקשורת שנדרש ל-TEE. אסור להעביר תמונות גולמיות ותכונות של טביעות אצבע שעברו עיבוד בזיכרון לא מהימן. כל הנתונים הביומטריים האלה צריכים להיות מאוחסנים בחומרה מאובטחת, כמו TEE. אסור שאפשר יהיה לפגוע בנתונים הביומטריים באמצעות גישה למכשיר שעבר תהליך רוט (Root).

FingerprintService ו-fingerprintd מבצעים קריאות דרך Fingerprint HAL לספרייה הספציפית לספק כדי לרשום טביעות אצבע ולבצע פעולות אחרות.

אינטראקציה עם fingerprintd
איור 2. אינטראקציה של הדימון של טביעות האצבע עם הספרייה הספציפית לספק של טביעות האצבע

הנחיות להטמעה

ההנחיות הבאות ל-HAL של טביעות אצבע נועדו לוודא שלא תהיה דליפת נתונים של טביעות אצבע ושהנתונים יימחקו כשמשתמשים יוסרו מהמכשיר:

  • אסור שיהיו נתונים גולמיים של טביעות אצבע או נגזרות שלהם (למשל, תבניות) שיהיו נגישים מחוץ למנהל החיישן או ל-TEE. אם החומרה תומכת ב-TEE, צריך להגביל את הגישה לחומרה ל-TEE ולהגן עליה באמצעות מדיניות SELinux. רק ל-TEE צריכה להיות גישה לערוץ ה-Serial Peripheral Interface‏ (SPI), וצריך להיות כללי מדיניות SELinux מפורשים בכל קובצי המכשיר.
  • תהליך יצירת טביעות האצבע, ההרשמה והזיהוי צריך להתרחש בתוך ה-TEE.
  • אפשר לאחסן במערכת הקבצים רק את ההצפנה של נתוני טביעות האצבעות, אפילו אם מערכת הקבצים עצמה מוצפנת.
  • תבניות טביעות אצבע חייבות להיות חתומות במפתח פרטי ייחודי למכשיר. ב-Advanced Encryption Standard ‏ (AES), לכל הפחות צריך לחתום על התבנית עם הנתיב המוחלט של מערכת הקבצים, הקבוצה ומזהה האצבע, כך שקובצי התבנית לא יפעלו במכשיר אחר או אצל מישהו אחר מלבד המשתמש שרשם אותם באותו מכשיר. לדוגמה, העתקה של נתוני טביעות אצבעות ממשתמש אחר באותו מכשיר, או ממכשיר אחר, לא תפעל.
  • בהטמעות צריך להשתמש בנתיב למערכת הקבצים שסופק על ידי הפונקציה setActiveGroup(), או לספק דרך למחוק את כל נתוני התבניות של המשתמש כשהמשתמש מוסר. מומלץ מאוד לאחסן את קבצי התבניות של טביעות האצבע כקבצים מוצפנים, בנתיב שצוין. אם אי אפשר לעשות זאת בגלל דרישות האחסון של TEE, המטמיע צריך להוסיף ווקים כדי להבטיח שהנתונים יוסרו כשהמשתמש יוסר.

שיטות לזיהוי טביעות אצבע

ממשק Fingerprint HIDL מכיל את השיטות העיקריות הבאות ב-IBiometricsFingerprint.hal.

שיטה תיאור
enroll() מפעיל את מכונת המצב של HAL כדי להתחיל באיסוף ובאחסון של תבנית טביעת אצבע. כשהרשמה מסתיימת, או אחרי זמן קצוב, מכונת המצב של HAL חוזרת למצב מנוחה.
preEnroll() יצירת אסימון ייחודי כדי לציין את תחילת ההרשמה של טביעת האצבע. מעביר אסימון לפונקציה enroll כדי לוודא שהתבצע אימות מוקדם, למשל באמצעות סיסמה. כדי למנוע פגיעה בטוקן, הוא עובר אריזה אחרי אישור פרטי הכניסה של המכשיר. צריך לבדוק את האסימון במהלך ההרשמה כדי לוודא שהוא עדיין בתוקף.
getAuthenticatorId() הפונקציה מחזירה טוקן שמשויך לקבוצת טביעות האצבע הנוכחית.
cancel() ביטול פעולות של הרשמה או אימות בהמתנה. מכונת המצב של HAL מוחזרת למצב מנוחה.
enumerate() קריאה סינכרונית לספירה של כל התבניות הידועות של טביעות אצבע.
remove() מחיקה של תבנית טביעת אצבע.
setActiveGroup() הגבלת פעולת HAL לקבוצה של טביעות אצבע ששייכות לקבוצה מסוימת, שמזוהה באמצעות מזהה קבוצה (GID).
authenticate() אימות של פעולה שקשורה לטביעת אצבע (שמזוהה באמצעות מזהה פעולה).
setNotify() רישום של פונקציית משתמש שמקבלת התראות מ-HAL. אם מכונת המצב של HAL נמצאת במצב עסוק, הפונקציה תיחסם עד ש-HAL ייצא מהמצב הזה.
postEnroll() השלמת פעולת ההרשמה וביטול האתגר שנוצר על ידי preEnroll(). צריך להפעיל את הפונקציה הזו בסוף סשן של הרשמה לכמה אצבעות כדי לציין שלא ניתן להוסיף עוד אצבעות.

פרטים נוספים על הנושאים האלה זמינים בתגובות ב-IBiometricsFingerprint.hal.