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

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

หลักเกณฑ์การใช้งาน
หลักเกณฑ์ 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