ลายนิ้วมือ HIDL

บนอุปกรณ์ที่มีเซ็นเซอร์ลายนิ้วมือ ผู้ใช้สามารถลงทะเบียนลายนิ้วมือได้ตั้งแต่หนึ่งลายนิ้วมือขึ้นไป และใช้ลายนิ้วมือเหล่านั้นเพื่อปลดล็อกอุปกรณ์และทำงานอื่นๆ Android ใช้ Fingerprint Hardware Interface Definition Language (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) อย่างน้อยที่สุด เทมเพลตต้องลงนามด้วยพาธระบบไฟล์ กลุ่ม และ 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

,

บนอุปกรณ์ที่มีเซ็นเซอร์ลายนิ้วมือ ผู้ใช้สามารถลงทะเบียนลายนิ้วมือได้ตั้งแต่หนึ่งลายนิ้วมือขึ้นไป และใช้ลายนิ้วมือเหล่านั้นเพื่อปลดล็อกอุปกรณ์และทำงานอื่นๆ Android ใช้ Fingerprint Hardware Interface Definition Language (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) อย่างน้อยที่สุด เทมเพลตต้องลงนามด้วยพาธระบบไฟล์ กลุ่ม และ 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