Fingerprint HIDL

ในอุปกรณ์ที่มีเซ็นเซอร์ลายนิ้วมือ ผู้ใช้สามารถลงทะเบียนลายนิ้วมืออย่างน้อย 1 รายการและใช้ลายนิ้วมือเหล่านั้นเพื่อปลดล็อกอุปกรณ์และทำงานอื่นๆ ได้ Android ใช้ Fingerprint Hardware Interface Definition Language (HIDL) เพื่อเชื่อมต่อกับไลบรารีเฉพาะของผู้ให้บริการและฮาร์ดแวร์ลายนิ้วมือ (เช่น เซ็นเซอร์ลายนิ้วมือ)

หากต้องการใช้ HIDL ลายนิ้วมือ คุณต้องใช้ IBiometricsFingerprint.hal ในไลบรารีเฉพาะของผู้ให้บริการ

การจับคู่ลายนิ้วมือ

โดยทั่วไปแล้วเซ็นเซอร์ลายนิ้วมือของอุปกรณ์จะอยู่ในสถานะว่าง อย่างไรก็ตาม เมื่อตอบสนองต่อ การเรียกใช้ authenticate หรือ enroll เซ็นเซอร์ลายนิ้วมือจะรอการแตะ (หน้าจออาจตื่นขึ้นเมื่อผู้ใช้ แตะเซ็นเซอร์ลายนิ้วมือด้วย) ขั้นตอนการทำงานระดับสูงของการจับคู่ลายนิ้วมือ มีดังนี้

  1. ผู้ใช้วางนิ้วบนเซ็นเซอร์ลายนิ้วมือ
  2. ไลบรารีเฉพาะของผู้ให้บริการจะพิจารณาว่ามีลายนิ้วมือที่ตรงกันใน ชุดเทมเพลตลายนิ้วมือที่ลงทะเบียนไว้ในปัจจุบันหรือไม่
  3. ระบบจะส่งผลลัพธ์ที่ตรงกันไปยัง FingerprintService

ขั้นตอนการทำงานนี้ถือว่ามีการลงทะเบียนลายนิ้วมือในอุปกรณ์แล้ว นั่นคือ ไลบรารีเฉพาะของผู้ให้บริการได้ลงทะเบียนเทมเพลตสำหรับลายนิ้วมือ ดูรายละเอียดเพิ่มเติมได้ที่การตรวจสอบสิทธิ์

สถาปัตยกรรม

HAL ลายนิ้วมือจะโต้ตอบกับคอมโพเนนต์ต่อไปนี้

  • BiometricManager โต้ตอบกับแอปโดยตรงในกระบวนการของแอป แต่ละแอปมีอินสแตนซ์ของ IBiometricsFingerprint.hal
  • FingerprintService ทำงานใน กระบวนการของระบบ ซึ่งจัดการการสื่อสารกับ HAL ลายนิ้วมือ
  • HAL ลายนิ้วมือเป็นการใช้งาน C/C++ ของ อินเทอร์เฟซ IBiometricsFingerprint HIDL ซึ่งมีไลบรารีเฉพาะผู้ให้บริการ ที่สื่อสารกับฮาร์ดแวร์เฉพาะอุปกรณ์
  • คอมโพเนนต์ Keystore API และ KeyMint (เดิมชื่อ Keymaster) มีฟีเจอร์ต่อไปนี้ การเข้ารหัสที่ได้รับการสนับสนุนจากฮาร์ดแวร์สำหรับการจัดเก็บคีย์อย่างปลอดภัยในสภาพแวดล้อมที่ปลอดภัย เช่น สภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE)
โฟลว์ข้อมูลสำหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ
รูปที่ 1 โฟลว์ข้อมูลระดับสูงสำหรับการตรวจสอบสิทธิ์ ด้วยลายนิ้วมือ

การใช้งาน HAL ที่เฉพาะเจาะจงของผู้ให้บริการต้องใช้โปรโตคอลการสื่อสาร ที่ TEE ต้องการ ห้ามส่งรูปภาพจริงและฟีเจอร์ลายนิ้วมือที่ประมวลผลแล้วในหน่วยความจำที่ไม่น่าเชื่อถือ ข้อมูลไบโอเมตริกดังกล่าวทั้งหมดต้องจัดเก็บ ไว้ในฮาร์ดแวร์ที่ปลอดภัย เช่น TEE การรูทต้องไม่ ทำให้ข้อมูลไบโอเมตริกเสี่ยงต่อการถูกขโมย

FingerprintService และ fingerprintd จะโทรผ่าน Fingerprint HAL ไปยังไลบรารีเฉพาะของผู้ให้บริการเพื่อลงทะเบียนลายนิ้วมือและดำเนินการอื่นๆ

การโต้ตอบกับ fingerprintd
รูปที่ 2 การโต้ตอบของ Daemon ลายนิ้วมือ กับไลบรารีเฉพาะของผู้ให้บริการลายนิ้วมือ

หลักเกณฑ์การใช้งาน

หลักเกณฑ์ HAL ลายนิ้วมือต่อไปนี้ออกแบบมาเพื่อให้มั่นใจว่า ข้อมูลลายนิ้วมือจะไม่รั่วไหลและจะนำออก เมื่อมีการนำผู้ใช้ออกจากอุปกรณ์

  • ข้อมูลลายนิ้วมือดิบหรือข้อมูลที่ได้จากลายนิ้วมือ (เช่น เทมเพลต) ต้องไม่สามารถเข้าถึงได้จากภายนอกไดรเวอร์เซ็นเซอร์หรือ TEE หากฮาร์ดแวร์รองรับ TEE ต้องจำกัดการเข้าถึงฮาร์ดแวร์เฉพาะใน TEE และได้รับการคุ้มครองภายใต้นโยบาย SELinux ช่องทาง Serial Peripheral Interface (SPI) ต้องเข้าถึงได้เฉพาะ TEE และต้องมีนโยบาย SELinux ที่ชัดเจนในไฟล์อุปกรณ์ทั้งหมด
  • การรับ การลงทะเบียน และการจดจำลายนิ้วมือต้องเกิดขึ้นภายใน TEE
  • ระบบไฟล์จัดเก็บได้เพียงข้อมูลลายนิ้วมือในรูปแบบที่เข้ารหัสเท่านั้น แม้ว่าระบบไฟล์จะเข้ารหัสไว้แล้วก็ตาม
  • เทมเพลตลายนิ้วมือต้องได้รับการลงนามด้วยคีย์ส่วนตัวที่เฉพาะเจาะจงสำหรับอุปกรณ์ สำหรับมาตรฐานการเข้ารหัสขั้นสูง (AES) เทมเพลตต้องได้รับการลงนามอย่างน้อย ด้วยเส้นทางระบบไฟล์แบบสัมบูรณ์ กลุ่ม และรหัสลายนิ้วมือ เพื่อให้ไฟล์เทมเพลต ใช้งานไม่ได้ในอุปกรณ์อื่นหรือสำหรับบุคคลอื่นที่ไม่ใช่ผู้ใช้ที่ ลงทะเบียนในอุปกรณ์เดียวกัน เช่น การคัดลอกข้อมูลลายนิ้วมือจาก ผู้ใช้อีกรายบนอุปกรณ์เดียวกันหรือจากอุปกรณ์อื่นจะต้องทำไม่ได้
  • การติดตั้งใช้งานต้องใช้เส้นทางระบบไฟล์ที่ฟังก์ชัน setActiveGroup() ระบุ หรือมีวิธีลบข้อมูลเทมเพลตทั้งหมดของผู้ใช้ เมื่อนำผู้ใช้ออก เราขอแนะนำเป็นอย่างยิ่งให้จัดเก็บไฟล์เทมเพลตลายนิ้วมือเป็นไฟล์ที่เข้ารหัสและจัดเก็บไว้ในเส้นทางที่ระบุ หากทำไม่ได้เนื่องจากข้อกำหนดในการจัดเก็บ TEE ผู้ใช้ต้องเพิ่ม Hook เพื่อให้แน่ใจว่าระบบจะนำข้อมูลออกเมื่อนำผู้ใช้ออก

วิธีการใช้ลายนิ้วมือ

อินเทอร์เฟซ 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