ลายนิ้วมือ HIDL

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

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

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

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

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

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

สถาปัตยกรรม

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

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

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

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

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

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

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

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

วิธีการปลดล็อกด้วยลายนิ้วมือ

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