Fingerprint HIDL

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

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

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

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

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

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

สถาปัตยกรรม

Fingerprint HAL โต้ตอบกับคอมโพเนนต์ต่อไปนี้

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

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

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

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

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

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

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