บนอุปกรณ์ที่มีเซ็นเซอร์ลายนิ้วมือ ผู้ใช้สามารถลงทะเบียนลายนิ้วมือได้ตั้งแต่หนึ่งลายนิ้วมือขึ้นไป และใช้ลายนิ้วมือเหล่านั้นเพื่อปลดล็อกอุปกรณ์และทำงานอื่นๆ Android ใช้ Fingerprint Hardware Interface Definition Language (HIDL) เพื่อเชื่อมต่อกับไลบรารีเฉพาะผู้จำหน่ายและฮาร์ดแวร์ลายนิ้วมือ (เช่น เซ็นเซอร์ลายนิ้วมือ)
ในการใช้ลายนิ้วมือ HIDL คุณต้องใช้ IBiometricsFingerprint.hal
ในไลบรารีเฉพาะผู้จำหน่าย
การจับคู่ลายนิ้วมือ
เซ็นเซอร์ลายนิ้วมือของอุปกรณ์โดยทั่วไปไม่ได้ใช้งาน อย่างไรก็ตาม ในการตอบสนองต่อการโทรเพื่อ authenticate
หรือ enroll
เซ็นเซอร์ลายนิ้วมือจะรับฟังการสัมผัส (หน้าจออาจตื่นขึ้นเมื่อผู้ใช้สัมผัสเซ็นเซอร์ลายนิ้วมือ) ขั้นตอนการจับคู่ลายนิ้วมือระดับสูงประกอบด้วยขั้นตอนต่อไปนี้:
- ผู้ใช้วางนิ้วบนเซ็นเซอร์ลายนิ้วมือ
- ไลบรารีเฉพาะของผู้จำหน่ายจะกำหนดว่ามีลายนิ้วมือที่ตรงกันในชุดแม่แบบลายนิ้วมือที่ลงทะเบียนไว้ในปัจจุบันหรือไม่
- ผลการจับคู่จะถูกส่งต่อไปยัง
FingerprintService
ขั้นตอนนี้จะถือว่าลายนิ้วมือได้รับการลงทะเบียนบนอุปกรณ์แล้ว กล่าวคือ ไลบรารีเฉพาะผู้จำหน่ายได้ลงทะเบียนเทมเพลตสำหรับลายนิ้วมือแล้ว สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ การ ตรวจสอบสิทธิ์
สถาปัตยกรรม
ลายนิ้วมือ HAL โต้ตอบกับส่วนประกอบต่อไปนี้
-
BiometricManager
โต้ตอบโดยตรงกับแอพในกระบวนการแอพ แต่ละแอพมีอินสแตนซ์ของIBiometricsFingerprint.hal
-
FingerprintService
ทำงานในกระบวนการของระบบ ซึ่งจัดการการสื่อสารด้วยลายนิ้วมือ HAL - ลายนิ้วมือ HAL คือการใช้งาน C/C++ ของอินเทอร์เฟซ IBiometricsFingerprint HIDL ประกอบด้วยไลบรารีเฉพาะผู้จำหน่ายที่สื่อสารกับฮาร์ดแวร์เฉพาะอุปกรณ์
- ส่วนประกอบ 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
- เฉพาะรูปแบบที่เข้ารหัสของข้อมูลลายนิ้วมือเท่านั้นที่สามารถจัดเก็บบนระบบไฟล์ได้ แม้ว่าระบบไฟล์จะมีการเข้ารหัสก็ตาม
- เทมเพลตลายนิ้วมือต้องลงนามด้วยคีย์ส่วนตัวเฉพาะอุปกรณ์ สำหรับ Advanced Encryption Standard (AES) อย่างน้อยที่สุด เทมเพลตต้องลงนามด้วยพาธระบบไฟล์ กลุ่ม และ finger ID แบบสัมบูรณ์ เพื่อให้ไฟล์เทมเพลตใช้งานไม่ได้ในอุปกรณ์อื่นหรือสำหรับใครก็ตามที่ไม่ใช่ผู้ใช้ที่ลงทะเบียนบน อุปกรณ์เดียวกัน ตัวอย่างเช่น การคัดลอกข้อมูลลายนิ้วมือจากผู้ใช้อื่นในอุปกรณ์เดียวกันหรือจากอุปกรณ์อื่นจะต้องไม่ทำงาน
- การนำไปใช้งานต้องใช้พาธของระบบไฟล์ที่ฟังก์ชัน
setActiveGroup()
ให้มา หรือจัดเตรียมวิธีการลบข้อมูลเทมเพลตของผู้ใช้ทั้งหมดเมื่อผู้ใช้ถูกลบออก ขอแนะนำอย่างยิ่งให้จัดเก็บไฟล์เทมเพลตลายนิ้วมือเป็นการเข้ารหัสและจัดเก็บไว้ในเส้นทางที่ให้ไว้ หากสิ่งนี้เป็นไปไม่ได้เนื่องจากข้อกำหนดการจัดเก็บ TEE ผู้ดำเนินการต้องเพิ่ม hook เพื่อให้แน่ใจว่ามีการลบข้อมูลเมื่อผู้ใช้ถูกลบออก
วิธีลายนิ้วมือ
อินเทอร์เฟซ HIDL ลายนิ้วมือประกอบด้วยวิธีการหลักต่อไปนี้ใน IBiometricsFingerprint.hal
วิธี | คำอธิบาย |
---|---|
enroll() | สลับเครื่องสถานะ HAL เพื่อเริ่มการรวบรวมและการจัดเก็บแม่แบบลายนิ้วมือ เมื่อการลงทะเบียนเสร็จสมบูรณ์ หรือหลังจากหมดเวลา เครื่องสถานะ HAL จะกลับสู่สถานะว่าง |
preEnroll() | สร้างโทเค็นที่ไม่ซ้ำกันเพื่อระบุการเริ่มต้นการลงทะเบียนลายนิ้วมือ มอบโทเค็นให้กับฟังก์ชันการ enroll เพื่อให้แน่ใจว่ามีการตรวจสอบสิทธิ์ก่อนหน้า เช่น การใช้รหัสผ่าน เพื่อป้องกันการปลอมแปลง โทเค็นจะถูกห่อหลังจากยืนยันข้อมูลรับรองอุปกรณ์แล้ว ต้องตรวจสอบโทเค็นระหว่างการลงทะเบียนเพื่อยืนยันว่ายังใช้ได้อยู่ |
getAuthenticatorId() | ส่งคืนโทเค็นที่เกี่ยวข้องกับชุดลายนิ้วมือปัจจุบัน |
cancel() | ยกเลิกการลงทะเบียนที่รอดำเนินการหรือตรวจสอบสิทธิ์ เครื่องสถานะ HAL จะกลับสู่สถานะว่าง |
enumerate() | การโทรแบบซิงโครนัสเพื่อระบุเทมเพลตลายนิ้วมือที่รู้จักทั้งหมด |
remove() | ลบแม่แบบลายนิ้วมือ |
setActiveGroup() | จำกัดการดำเนินการ HAL สำหรับชุดลายนิ้วมือที่เป็นของกลุ่มที่ระบุ ซึ่งระบุโดยตัวระบุกลุ่ม (GID) |
authenticate() | ตรวจสอบการทำงานที่เกี่ยวข้องกับลายนิ้วมือ (ระบุโดย ID การดำเนินการ) |
setNotify() | ลงทะเบียนฟังก์ชันผู้ใช้ที่ได้รับการแจ้งเตือนจาก HAL หากเครื่องสถานะ HAL อยู่ในสถานะไม่ว่าง ฟังก์ชันจะถูกบล็อกจนกว่า HAL จะออกจากสถานะไม่ว่าง |
postEnroll() | เสร็จสิ้นการลงทะเบียนและทำให้ความท้าทายที่สร้าง preEnroll() เป็นโมฆะ ต้องเรียกสิ่งนี้เมื่อสิ้นสุดเซสชันการลงทะเบียนแบบหลายนิ้วเพื่อระบุว่าไม่สามารถเพิ่มนิ้วได้อีก |
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ โปรดดูความคิดเห็นใน IBiometricsFingerprint.hal