Android ใช้แนวคิดคีย์การเข้ารหัสที่มีการตรวจสอบสิทธิ์ของผู้ใช้ ซึ่งต้องใช้คอมโพเนนต์ต่อไปนี้
- ผู้ให้บริการและพื้นที่เก็บข้อมูลคีย์การเข้ารหัส จัดเก็บคีย์การเข้ารหัสและจัดเตรียมรูทีนการเข้ารหัสมาตรฐานเพิ่มเติมจากคีย์เหล่านั้น Android รองรับคีย์สโตร์ที่รองรับฮาร์ดแวร์และ Keymaster สำหรับบริการการเข้ารหัส รวมถึงการเข้ารหัสที่รองรับฮาร์ดแวร์สำหรับพื้นที่เก็บข้อมูลคีย์ ซึ่งอาจรวมถึงสภาพแวดล้อมการประมวลผลที่เชื่อถือได้ (TEE) หรือองค์ประกอบที่ปลอดภัย (SE) เช่น Strongbox
- โปรแกรมตรวจสอบสิทธิ์ของผู้ใช้ ยืนยันการแสดงข้อมูลของผู้ใช้และ/หรือการตรวจสอบสิทธิ์ที่สำเร็จ Android รองรับGatekeeper สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน และลายนิ้วมือสำหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ อุปกรณ์ที่มาพร้อมกับ Android 9 ขึ้นไปสามารถใช้
BiometricPrompt
เป็นจุดผสานรวมเดียวสำหรับลายนิ้วมือและข้อมูลไบโอเมตริกเพิ่มเติม คอมโพเนนต์เหล่านี้จะสื่อสารสถานะการตรวจสอบสิทธิ์กับบริการคีย์สโตร์ผ่านช่องทางที่ตรวจสอบสิทธิ์ (ระบบ Android Keystore ที่ระดับเฟรมเวิร์กยังรองรับบริการ Keystore ด้วย)
คอมโพเนนต์ Gatekeeper, ลายนิ้วมือ และข้อมูลไบโอเมตริกจะทำงานร่วมกับคีย์สโตร์และคอมโพเนนต์อื่นๆ เพื่อรองรับการใช้โทเค็นการตรวจสอบสิทธิ์ (AuthTokens) ที่สนับสนุนฮาร์ดแวร์
การลงทะเบียน
เมื่อบูตอุปกรณ์เป็นครั้งแรกหลังจากรีเซ็ตเป็นค่าเริ่มต้น โปรแกรมตรวจสอบสิทธิ์ทั้งหมดจะพร้อมรับการลงทะเบียนข้อมูลเข้าสู่ระบบจากผู้ใช้ ผู้ใช้ต้องลงทะเบียน PIN/รูปแบบ/รหัสผ่านกับ Gatekeeper ในตอนแรก การลงทะเบียนครั้งแรกนี้จะสร้างรหัสความปลอดภัย (SID) 64 บิตของผู้ใช้ซึ่งสร้างขึ้นแบบสุ่มเพื่อใช้เป็นตัวระบุผู้ใช้และเป็นโทเค็นการเชื่อมโยงสำหรับข้อมูลการเข้ารหัสของผู้ใช้ SID ของผู้ใช้นี้เชื่อมโยงกับรหัสผ่านของผู้ใช้ด้วยการเข้ารหัส การรับรองที่สำเร็จใน Gatekeeper จะส่งผลให้มี AuthToken ที่มี SID ของผู้ใช้สำหรับรหัสผ่านนั้น
ผู้ใช้ที่ต้องการเปลี่ยนข้อมูลเข้าสู่ระบบต้องแสดงข้อมูลเข้าสู่ระบบที่มีอยู่ หากยืนยันข้อมูลเข้าสู่ระบบที่มีอยู่เรียบร้อยแล้ว ระบบจะโอน SID ของผู้ใช้ที่เชื่อมโยงกับข้อมูลเข้าสู่ระบบที่มีอยู่ไปยังข้อมูลเข้าสู่ระบบใหม่ ซึ่งจะช่วยให้ผู้ใช้เข้าถึงคีย์ได้ต่อไปหลังจากเปลี่ยนข้อมูลเข้าสู่ระบบ หากผู้ใช้ไม่ได้แสดงข้อมูลเข้าสู่ระบบที่มีอยู่ ระบบจะลงทะเบียนข้อมูลเข้าสู่ระบบใหม่ด้วยรหัสผู้ใช้ SID แบบสุ่มทั้งหมด ผู้ใช้จะเข้าถึงอุปกรณ์ได้ แต่คีย์ที่สร้างภายใต้ SID ของผู้ใช้เดิมจะหายไปอย่างถาวร ซึ่งเรียกว่าการลงทะเบียนที่ไม่น่าเชื่อถือ
ภายใต้สถานการณ์ปกติ เฟรมเวิร์ก Android ไม่อนุญาตให้ลงทะเบียนที่ไม่เชื่อถือ ดังนั้นผู้ใช้ส่วนใหญ่จะไม่เห็นฟังก์ชันนี้ อย่างไรก็ตาม การรีเซ็ตรหัสผ่านโดยผู้ดูแลระบบอุปกรณ์หรือผู้โจมตีอาจทําให้ปัญหานี้เกิดขึ้น
การตรวจสอบสิทธิ์
หลังจากตั้งค่าข้อมูลเข้าสู่ระบบและได้รับ SID ของผู้ใช้แล้ว ผู้ใช้จะเริ่มการตรวจสอบสิทธิ์ได้ ซึ่งจะเริ่มขึ้นเมื่อผู้ใช้ระบุ PIN, รูปแบบ, รหัสผ่าน หรือลายนิ้วมือ คอมโพเนนต์ TEE ทั้งหมดใช้คีย์ลับร่วมกันเพื่อตรวจสอบสิทธิ์ข้อความของกันและกัน

- ผู้ใช้ระบุวิธีการตรวจสอบสิทธิ์และบริการที่เกี่ยวข้องจะส่งคําขอไปยังเดรัมที่เกี่ยวข้อง
- สำหรับ PIN, รูปแบบ หรือรหัสผ่าน
LockSettingsService
จะส่งคำขอไปยังgatekeeperd
- ขั้นตอนการตรวจสอบสิทธิ์ตามข้อมูลไบโอเมตริกจะขึ้นอยู่กับเวอร์ชัน Android
ในอุปกรณ์ที่ใช้ Android 8.x และต่ำกว่า
FingerprintService
จะส่งคำขอไปยังfingerprintd
) ในอุปกรณ์ที่ใช้ Android 9 ขึ้นไปBiometricPrompt
จะส่งคำขอไปยังเดมอนข้อมูลไบโอเมตริกที่เหมาะสม (เช่นfingerprintd
สำหรับลายนิ้วมือหรือfaced
สำหรับใบหน้า) โดยใช้คลาสBiometricManager
ที่เหมาะสม เช่นFingerprintManager
หรือFaceManager
การตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกจะเกิดขึ้นแบบไม่พร้อมกันหลังจากส่งคำขอแล้ว ไม่ว่าจะใช้เวอร์ชันใดก็ตาม
- สำหรับ PIN, รูปแบบ หรือรหัสผ่าน
- เดมอนจะส่งข้อมูลไปยังคู่หูซึ่งจะสร้าง AuthToken ดังนี้
- สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน
gatekeeperd
จะส่งแฮช PIN, รูปแบบ หรือรหัสผ่านไปยัง Gatekeeper ใน TEE หากการตรวจสอบสิทธิ์ใน TEE สำเร็จ Gatekeeper ใน TEE จะส่ง AuthToken ที่มี SID ของผู้ใช้ที่เกี่ยวข้อง (ลงนามด้วยคีย์ HMAC ของ AuthToken) ไปยังคู่หูในระบบปฏิบัติการ Android - สําหรับการตรวจสอบสิทธิ์ด้วยลายนิ้วมือ
fingerprintd
จะเฝ้าติดตามเหตุการณ์ลายนิ้วมือและส่งข้อมูลไปยังลายนิ้วมือใน TEE หากการตรวจสอบสิทธิ์ใน TEE สำเร็จ ลายนิ้วมือใน TEE จะส่ง AuthToken (ลงชื่อด้วยคีย์ HMAC ของ AuthToken) ไปยังคู่หูในระบบปฏิบัติการ Android - สําหรับการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกอื่นๆ นั้น โปรแกรมเดอมอนไบโอเมตริกที่เหมาะสมจะคอยฟังเหตุการณ์ไบโอเมตริกและส่งไปยังคอมโพเนนต์ TEE ที่เหมาะสม
- สำหรับการตรวจสอบสิทธิ์ด้วย PIN/รูปแบบ/รหัสผ่าน
- เดมอนจะได้รับ AuthToken ที่ลงชื่อแล้วและส่งไปยังบริการที่เก็บคีย์ผ่านส่วนขยายของอินเทอร์เฟซ Binder ของบริการที่เก็บคีย์
(
gatekeeperd
จะแจ้งให้บริการที่เก็บคีย์ทราบด้วยเมื่ออุปกรณ์ล็อกอีกครั้งและเมื่อรหัสผ่านของอุปกรณ์มีการเปลี่ยนแปลง) - บริการจัดการคีย์จะส่ง AuthToken ไปยัง Keymaster และยืนยันโดยใช้คีย์ที่แชร์กับ Gatekeeper และคอมโพเนนต์ TEE ข้อมูลไบโอเมตริกที่รองรับ Keymaster จะเชื่อถือการประทับเวลาในโทเค็นว่าเป็นเวลาตรวจสอบสิทธิ์ครั้งล่าสุด และพิจารณาการปล่อยคีย์ (เพื่ออนุญาตให้แอปใช้คีย์) โดยอิงตามการประทับเวลา
รูปแบบ AuthToken
รูปแบบ AuthToken มีคำอธิบายอยู่ใน hw_auth_token.h
เพื่อให้มั่นใจว่าจะมีการแชร์โทเค็นและเข้ากันได้กับภาษาและคอมโพเนนต์ต่างๆ
รูปแบบนี้เป็นโปรโตคอลการจัดรูปแบบข้อมูลแบบง่ายที่มีช่องขนาดคงที่
ช่อง | ประเภท | ต้องระบุ | คำอธิบาย |
---|---|---|---|
เวอร์ชัน AuthToken | 1 ไบต์ | ใช่ | แท็กกลุ่มสําหรับช่องทั้งหมดด้านล่าง |
ความท้าทาย | จํานวนเต็ม 64 บิตแบบไม่มีเครื่องหมาย | ไม่ | จำนวนเต็มแบบสุ่มเพื่อป้องกันการโจมตีด้วยการบันทึกและส่งซ้ำ โดยปกติแล้วจะเป็นรหัสของการดำเนินการทางวิทยาการเข้ารหัสที่ขอ ปัจจุบันใช้กับการให้สิทธิ์ลายนิ้วมือธุรกรรม หากมี AuthToken จะใช้งานได้กับการดำเนินการคริปโตที่มีภารกิจเดียวกันเท่านั้น |
SID ของผู้ใช้ | จํานวนเต็ม 64 บิตแบบไม่มีเครื่องหมาย | ใช่ | ตัวระบุผู้ใช้ที่ไม่ซ้ำกันซึ่งเชื่อมโยงกับคีย์ทั้งหมดที่เข้ารหัสไว้ซึ่งเชื่อมโยงกับการรับรองความถูกต้องของอุปกรณ์ โปรดดูรายละเอียดที่หัวข้อGatekeeper |
รหัสโปรแกรมตรวจสอบสิทธิ์ (ASID) | จำนวนเต็มแบบไม่ลงนาม 64 บิตตามลําดับเครือข่าย | ไม่ | ตัวระบุที่ใช้เพื่อเชื่อมโยงกับนโยบายโปรแกรมตรวจสอบสิทธิ์ที่เฉพาะเจาะจง โปรแกรมตรวจสอบสิทธิ์ทั้งหมดมีค่า ASID ของตนเองซึ่งสามารถเปลี่ยนแปลงได้ตามข้อกำหนดของตนเอง |
ประเภท Authenticator | จำนวนเต็มแบบไม่ลงนาม 32 บิตในลําดับเครือข่าย | ใช่ |
|
การประทับเวลา | จำนวนเต็มแบบไม่ลงนาม 64 บิตในลําดับเครือข่าย | ใช่ | เวลา (เป็นมิลลิวินาที) นับตั้งแต่การบูตระบบครั้งล่าสุด |
AuthToken HMAC (SHA-256) | Blob 256 บิต | ใช่ | MAC ที่ใช้คีย์ SHA-256 ของช่องทั้งหมดยกเว้นช่อง HMAC |
ขั้นตอนการเปิดเครื่องของอุปกรณ์
ทุกครั้งที่บูตอุปกรณ์ จะต้องสร้างคีย์ HMAC ของ AuthToken และแชร์กับคอมโพเนนต์ TEE ทั้งหมด (Gatekeeper, Keymaster และ Trustlet ข้อมูลไบโอเมตริกที่รองรับ) ดังนั้น ระบบจึงต้องสร้างคีย์ HMAC แบบสุ่มทุกครั้งที่อุปกรณ์รีบูตเพื่อเพิ่มการป้องกันการโจมตีแบบเล่นซ้ำ
โปรโตคอลสำหรับการแชร์คีย์ HMAC นี้กับคอมโพเนนต์ทั้งหมดเป็นฟีเจอร์การใช้งานที่ขึ้นอยู่กับแพลตฟอร์ม คีย์ต้องไม่มีทางที่เข้าถึงได้จากภายนอก TEE หากระบบปฏิบัติการ TEE ไม่มีกลไกการสื่อสารระหว่างกระบวนการ (IPC) ภายในและต้องโอนข้อมูลผ่านระบบปฏิบัติการที่ไม่น่าเชื่อถือ การโอนจะต้องทำผ่านโปรโตคอลการแลกเปลี่ยนคีย์ที่ปลอดภัย
ระบบปฏิบัติการ Trusty ที่ทำงานควบคู่ไปกับ Android เป็นตัวอย่างของ TEE แต่คุณใช้ TEE อื่นๆ แทนได้ Trusty ใช้ระบบ IPC ภายในเพื่อสื่อสารโดยตรงระหว่าง Keymaster กับ Gatekeeper หรือ Trustlet ข้อมูลไบโอเมตริกที่เหมาะสม คีย์ HMAC จะเก็บไว้ใน Keymaster เท่านั้น โดยระบบลายนิ้วมือและ Gatekeeper จะขอคีย์จาก Keymaster สำหรับการใช้งานแต่ละครั้ง และไม่เก็บค่าไว้หรือแคชค่า
เนื่องจาก TEE บางรายการไม่มีโครงสร้างพื้นฐาน IPC จึงไม่มีการติดต่อสื่อสารระหว่างแอปเพล็ตใน TEE นอกจากนี้ ยังช่วยให้บริการคีย์สโตร์ปฏิเสธคำขอที่น่าจะล้มเหลวได้อย่างรวดเร็ว เนื่องจากทราบตารางการตรวจสอบสิทธิ์ในระบบ ซึ่งจะช่วยประหยัดค่าใช้จ่ายที่อาจเกิดขึ้นจาก IPC ใน TEE