ลายนิ้วมือ HIDL

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

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

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

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

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

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

สถาปัตยกรรม

ลายนิ้วมือ HAL โต้ตอบกับส่วนประกอบต่อไปนี้

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

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

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

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

แนวทางการนำไปปฏิบัติ

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

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

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

อินเทอร์เฟซลายนิ้วมือ 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