Android 7.0 จะทำงานในโหมดการบูตโดยตรงที่ปลอดภัย เมื่อเปิดเครื่องแล้วแต่ผู้ใช้ยังไม่ได้ปลดล็อก อุปกรณ์ ระบบมีพื้นที่เก็บข้อมูล 2 แห่งสำหรับข้อมูลเพื่อรองรับการดำเนินการนี้
- ที่เก็บข้อมูลที่เข้ารหัสของข้อมูลเข้าสู่ระบบ ซึ่งเป็นตำแหน่งที่เก็บข้อมูลเริ่มต้น และจะใช้ได้หลังจากที่ผู้ใช้ปลดล็อกอุปกรณ์แล้วเท่านั้น
- พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ ซึ่งเป็นตำแหน่งพื้นที่เก็บข้อมูลที่ใช้ได้ทั้ง ในโหมดการบูตโดยตรงและหลังจากที่ผู้ใช้ปลดล็อกอุปกรณ์แล้ว
โดยค่าเริ่มต้น แอปจะไม่ทำงานในโหมดการบูตโดยตรง หากแอปต้องดำเนินการในโหมด Direct Boot คุณสามารถลงทะเบียน คอมโพเนนต์ของแอปให้ทำงานในโหมดนี้ได้ Use Case ที่พบบ่อยสำหรับแอปที่ต้องทำงานในโหมด Direct Boot มีดังนี้
- แอปที่มีการแจ้งเตือนที่ตั้งเวลาไว้ เช่น แอปนาฬิกาปลุก
- แอปที่ให้การแจ้งเตือนที่สำคัญแก่ผู้ใช้ เช่น แอป SMS
- แอปที่ให้บริการการช่วยเหลือพิเศษ เช่น TalkBack
หากแอปต้องเข้าถึงข้อมูลขณะทำงานในโหมดการบูตโดยตรง ให้ใช้ พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์มีข้อมูล ที่เข้ารหัสด้วยคีย์ซึ่งจะใช้ได้หลังจากที่อุปกรณ์ เปิดเครื่องที่ได้รับการยืนยันสำเร็จแล้วเท่านั้น
สำหรับข้อมูลที่ต้องเข้ารหัสด้วยคีย์ที่เชื่อมโยงกับข้อมูลเข้าสู่ระบบของผู้ใช้ เช่น PIN หรือรหัสผ่าน ให้ใช้ที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบ ที่เก็บข้อมูลที่เข้ารหัสของข้อมูลเข้าสู่ระบบจะพร้อมใช้งานหลังจากที่ผู้ใช้ ปลดล็อกอุปกรณ์สำเร็จแล้ว และจนกว่าผู้ใช้จะรีสตาร์ทอุปกรณ์ หาก ผู้ใช้เปิดใช้หน้าจอล็อกหลังจากปลดล็อกอุปกรณ์ พื้นที่เก็บข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบจะยังคงพร้อมใช้งาน
ขอสิทธิ์เข้าถึงเพื่อเรียกใช้ในระหว่างการบูตโดยตรง
แอปต้องลงทะเบียนคอมโพเนนต์กับระบบก่อนจึงจะเรียกใช้ในโหมดการเปิดเครื่องโดยตรงหรือเข้าถึงพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ได้
แอปจะลงทะเบียนกับระบบโดยทำเครื่องหมายคอมโพเนนต์เป็นตระหนักถึงการเข้ารหัส หากต้องการทําเครื่องหมายคอมโพเนนต์ว่ารองรับการเข้ารหัส ให้ตั้งค่าแอตทริบิวต์
android:directBootAware
เป็น true ในไฟล์ Manifest
คอมโพเนนต์ที่รับรู้การเข้ารหัสจะลงทะเบียนเพื่อรับข้อความออกอากาศ ACTION_LOCKED_BOOT_COMPLETED
จากระบบได้เมื่อรีสตาร์ทอุปกรณ์ ในตอนนี้ พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์พร้อมใช้งานแล้ว และคอมโพเนนต์ของคุณสามารถเรียกใช้งานที่ต้องเรียกใช้ในโหมด Direct Boot ได้ เช่น การทริกเกอร์การปลุกที่กำหนดเวลาไว้
ข้อมูลโค้ดต่อไปนี้เป็นตัวอย่างวิธีลงทะเบียน
BroadcastReceiver
ให้รับรู้การเข้ารหัส และเพิ่ม
ตัวกรอง Intent สำหรับ ACTION_LOCKED_BOOT_COMPLETED
ในไฟล์ Manifest ของแอป
<receiver android:directBootAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
เมื่อผู้ใช้ปลดล็อกอุปกรณ์แล้ว คอมโพเนนต์ทั้งหมดจะเข้าถึงได้ทั้ง ที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์และที่เก็บข้อมูลที่เข้ารหัสของข้อมูลเข้าสู่ระบบ
เข้าถึงพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์
หากต้องการเข้าถึงพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ ให้สร้างอินสแตนซ์ที่สอง
Context
โดยการเรียกใช้
Context.createDeviceProtectedStorageContext()
การเรียก API พื้นที่เก็บข้อมูลทั้งหมด
ที่ทำโดยใช้บริบทนี้จะเข้าถึงพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์
ตัวอย่างต่อไปนี้จะเข้าถึงพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์และเปิดไฟล์ข้อมูลแอปที่มีอยู่
Kotlin
val directBootContext: Context = appContext.createDeviceProtectedStorageContext() // Access appDataFilename that lives in device encrypted storage val inStream: InputStream = directBootContext.openFileInput(appDataFilename) // Use inStream to read content...
Java
Context directBootContext = appContext.createDeviceProtectedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
ใช้พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์เฉพาะสำหรับ ข้อมูลที่ต้องเข้าถึงได้ในโหมด Direct Boot อย่าใช้พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์เป็นที่เก็บข้อมูลที่เข้ารหัสแบบอเนกประสงค์ สำหรับข้อมูลผู้ใช้ส่วนตัวหรือข้อมูลที่เข้ารหัสซึ่งไม่จำเป็นในระหว่างโหมด การบูตโดยตรง ให้ใช้พื้นที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบ
รับการแจ้งเตือนเมื่อผู้ใช้ปลดล็อก
เมื่อผู้ใช้ปลดล็อกอุปกรณ์หลังจากรีสตาร์ท แอปจะเปลี่ยนไป เข้าถึงที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบและใช้บริการระบบปกติที่ ขึ้นอยู่กับข้อมูลเข้าสู่ระบบของผู้ใช้ได้
หากต้องการรับการแจ้งเตือนเมื่อผู้ใช้ปลดล็อกอุปกรณ์หลังจากรีบูต ให้
ลงทะเบียน BroadcastReceiver
จากคอมโพเนนต์ที่ทำงานอยู่
เพื่อฟังข้อความแจ้งเตือนการปลดล็อก เมื่อผู้ใช้ปลดล็อกอุปกรณ์
หลังจากเปิดเครื่อง
- หากแอปมีกระบวนการที่ทำงานอยู่เบื้องหน้าที่ต้องมีการแจ้งเตือนทันที ให้
รอรับข้อความ
ACTION_USER_UNLOCKED
- หากแอปใช้เฉพาะกระบวนการเบื้องหลังที่ดำเนินการกับการแจ้งเตือนที่ล่าช้าได้ ให้รอรับ
ACTION_BOOT_COMPLETED
ข้อความ
หากผู้ใช้ปลดล็อกอุปกรณ์แล้ว คุณจะทราบได้โดยการโทรไปที่
UserManager.isUserUnlocked()
ย้ายข้อมูลที่มีอยู่
หากผู้ใช้อัปเดตอุปกรณ์ให้ใช้โหมดการบูตโดยตรง คุณอาจมี
ข้อมูลที่มีอยู่ซึ่งต้องย้ายไปยังพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ ใช้
Context.moveSharedPreferencesFrom()
และ
Context.moveDatabaseFrom()
โดยมีบริบทปลายทางเป็นผู้เรียกเมธอดและบริบทต้นทางเป็นอาร์กิวเมนต์ เพื่อย้ายข้อมูลค่ากำหนดและฐานข้อมูล
ระหว่างพื้นที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบกับพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์
อย่าย้ายข้อมูลส่วนตัวของผู้ใช้ เช่น รหัสผ่านหรือโทเค็นการให้สิทธิ์ จาก ที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบไปยังที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ โปรดใช้วิจารณญาณในการตัดสินใจว่าจะย้ายข้อมูลอื่นๆ ใดไปยังพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ ในบางกรณี คุณอาจต้องจัดการชุดข้อมูลแยกกันในที่เก็บข้อมูลที่เข้ารหัสทั้ง 2 แห่ง
ทดสอบแอปที่รับรู้การเข้ารหัส
ทดสอบแอปที่รับรู้การเข้ารหัสโดยเปิดใช้โหมด Direct Boot
อุปกรณ์ส่วนใหญ่ที่ใช้ Android เวอร์ชันล่าสุดจะเปิดใช้โหมดการบูตโดยตรง ทุกครั้งที่มีการตั้งค่าข้อมูลเข้าสู่ระบบของหน้าจอล็อก (PIN, รูปแบบ หรือรหัสผ่าน) กล่าวคือ กรณีนี้เกิดขึ้นในอุปกรณ์ทั้งหมดที่ใช้การเข้ารหัสที่อิงตามไฟล์ หากต้องการตรวจสอบว่าอุปกรณ์ใช้การเข้ารหัสที่อิงตามไฟล์หรือไม่ ให้เรียกใช้คำสั่งเชลล์ต่อไปนี้
adb shell getprop ro.crypto.type
หากเอาต์พุตเป็น file
แสดงว่าอุปกรณ์เปิดใช้การเข้ารหัสตามไฟล์
ในอุปกรณ์ที่ไม่ได้ใช้การเข้ารหัสตามไฟล์โดยค่าเริ่มต้น อาจมี ตัวเลือกอื่นๆ สำหรับการทดสอบโหมดการบูตโดยตรงดังนี้
-
อุปกรณ์บางรุ่นที่ใช้การเข้ารหัสทั้งดิสก์ (
ro.crypto.type=block
) และใช้ Android 7.0 ถึง Android 12 สามารถแปลงเป็นการเข้ารหัส ระดับไฟล์ได้ ซึ่งทำได้ 2 วิธีดังนี้- ในอุปกรณ์ ให้เปิดใช้ตัวเลือกสำหรับนักพัฒนาแอปหากยังไม่ได้เปิด โดยไปที่การตั้งค่า > เกี่ยวกับโทรศัพท์ แล้วแตะหมายเลขบิลด์ 7 ครั้ง จากนั้นไปที่การตั้งค่า > ตัวเลือกสำหรับนักพัฒนาแอป แล้วเลือกแปลงเป็นการเข้ารหัสไฟล์
- หรือจะเรียกใช้คำสั่งเชลล์ต่อไปนี้ก็ได้
adb reboot-bootloader
fastboot --wipe-and-use-fbe
คำเตือน: ไม่ว่าจะใช้วิธีใดในการแปลงเป็นการเข้ารหัสที่อิงตามไฟล์ ระบบจะล้างข้อมูลผู้ใช้ทั้งหมดในอุปกรณ์
-
อุปกรณ์ที่ใช้ Android 13 หรือต่ำกว่ารองรับโหมดการบูตโดยตรงแบบ "จำลอง" ที่ใช้สิทธิ์ของไฟล์เพื่อจำลองผลลัพธ์ของไฟล์ที่เข้ารหัสซึ่งถูกล็อกและปลดล็อก ใช้โหมดจำลอง ระหว่างการพัฒนาเท่านั้น เนื่องจากอาจทำให้ข้อมูลสูญหายได้ หากต้องการเปิดใช้โหมดการบูตโดยตรงที่จำลอง ให้ตั้งค่ารูปแบบการล็อกในอุปกรณ์ เลือก "ไม่เป็นไร" หาก ได้รับแจ้งให้ใช้หน้าจอการเริ่มต้นระบบที่ปลอดภัยเมื่อตั้งค่ารูปแบบการล็อก จากนั้น เรียกใช้คำสั่ง Shell ต่อไปนี้
adb shell sm set-emulate-fbe true
หากต้องการปิดโหมดการบูตโดยตรงที่จำลอง ให้เรียกใช้คำสั่งเชลล์ต่อไปนี้
adb shell sm set-emulate-fbe false
การเรียกใช้คำสั่งใดคำสั่งหนึ่งเหล่านี้จะทำให้อุปกรณ์รีบูต
ตรวจสอบสถานะการเข้ารหัสของนโยบายอุปกรณ์
แอปการดูแลระบบอุปกรณ์สามารถใช้
DevicePolicyManager.getStorageEncryptionStatus()
เพื่อตรวจสอบสถานะการเข้ารหัสปัจจุบันของอุปกรณ์
หากแอปกำหนดเป้าหมายเป็น API ระดับต่ำกว่า Android 7.0 (API 24)
getStorageEncryptionStatus()
จะแสดง
ENCRYPTION_STATUS_ACTIVE
หากอุปกรณ์ใช้การเข้ารหัสทั้งดิสก์
หรือการเข้ารหัสระดับไฟล์ที่มีการบูตโดยตรง ในทั้ง 2 กรณีนี้ ระบบจะ
จัดเก็บข้อมูลที่ไม่มีการเคลื่อนไหวโดยเข้ารหัสเสมอ
หากแอปกำหนดเป้าหมายเป็น Android 7.0 (API 24) ขึ้นไป
getStorageEncryptionStatus()
จะแสดง
ENCRYPTION_STATUS_ACTIVE
หากอุปกรณ์ใช้การเข้ารหัสทั้งดิสก์ โดยจะแสดง
ENCRYPTION_STATUS_ACTIVE_PER_USER
หากอุปกรณ์ใช้การเข้ารหัสที่อิงตามไฟล์
ที่มีการบูตโดยตรง
หากคุณสร้างแอปการดูแลระบบอุปกรณ์ที่กำหนดเป้าหมายเป็น Android 7.0 โปรดตรวจสอบทั้ง
ENCRYPTION_STATUS_ACTIVE
และ
ENCRYPTION_STATUS_ACTIVE_PER_USER
เพื่อพิจารณาว่าอุปกรณ์มีการเข้ารหัสหรือไม่
ตัวอย่างโค้ดเพิ่มเติม
ตัวอย่าง DirectBoot แสดงให้เห็นถึงการใช้ API ที่กล่าวถึงในหน้านี้เพิ่มเติม