Android 7.0 จะทำงานในโหมดการบูตโดยตรงที่ปลอดภัยเมื่อเปิดเครื่องแล้ว แต่ผู้ใช้ยังไม่ได้ปลดล็อกอุปกรณ์ ระบบจะจัดเตรียมตำแหน่งพื้นที่เก็บข้อมูล 2 ตำแหน่งเพื่อรองรับการใช้งาน ดังนี้
- พื้นที่เก็บข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบ ซึ่งเป็นตำแหน่งพื้นที่เก็บข้อมูลเริ่มต้น และพร้อมใช้งานหลังจากที่ผู้ใช้ปลดล็อกอุปกรณ์เท่านั้น
- พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ ซึ่งเป็นตำแหน่งพื้นที่เก็บข้อมูลที่ใช้ได้ทั้ง ในระหว่างโหมดการเปิดเครื่องโดยตรง และหลังจากที่ผู้ใช้ปลดล็อกอุปกรณ์แล้ว
โดยค่าเริ่มต้น แอปจะไม่ทำงานในโหมดการบูตโดยตรง หากแอปต้องดำเนินการในระหว่างโหมดการบูตโดยตรง คุณสามารถลงทะเบียนคอมโพเนนต์แอปให้ทำงานในโหมดนี้ได้ Use Case ที่พบบ่อยสำหรับแอปที่ต้องทำงานในโหมดการบูตโดยตรงมีดังนี้
- แอปที่มีการแจ้งเตือนที่กำหนดเวลาไว้ เช่น นาฬิกาปลุก แอป
- แอปที่มีการแจ้งเตือนที่สำคัญสำหรับผู้ใช้ เช่น แอป SMS
- แอปที่ให้บริการการช่วยเหลือพิเศษ เช่น Talkback
หากแอปจำเป็นต้องเข้าถึงข้อมูลขณะทำงานในโหมดการบูตโดยตรง ให้ใช้พื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ ที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์มีข้อมูล เข้ารหัสด้วยคีย์ที่ใช้ได้หลังจากที่อุปกรณ์ดำเนินการ การเปิดเครื่องที่ได้รับการยืนยันสำเร็จ
สำหรับข้อมูลที่ต้องมีการเข้ารหัสด้วยคีย์ที่เชื่อมโยงกับข้อมูลเข้าสู่ระบบของผู้ใช้ เช่น PIN หรือรหัสผ่าน ให้ใช้ที่เก็บข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบ พื้นที่เก็บข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบจะพร้อมใช้งานหลังจากที่ผู้ใช้ปลดล็อกอุปกรณ์สำเร็จและจนกว่าผู้ใช้จะรีสตาร์ทอุปกรณ์ หากผู้ใช้เปิดใช้หน้าจอล็อกหลังจากปลดล็อกอุปกรณ์ ที่เก็บข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบจะยังคงใช้งานได้
ขอสิทธิ์เข้าถึงเพื่อทำงานระหว่างการเปิดเครื่องโดยตรง
แอปต้องลงทะเบียนคอมโพเนนต์กับระบบก่อนจึงจะทำงานในโหมดการบูตโดยตรงหรือเข้าถึงพื้นที่เก็บข้อมูลที่เข้ารหัสของอุปกรณ์ได้ แอปลงทะเบียนกับระบบโดยทำเครื่องหมายคอมโพเนนต์เป็น
การเข้ารหัส หากต้องการทําเครื่องหมายคอมโพเนนต์ว่ารองรับการเข้ารหัส ให้ตั้งค่าแอตทริบิวต์ android:directBootAware
เป็น true ในไฟล์ Manifest
คอมโพเนนต์ที่ทราบเกี่ยวกับการเข้ารหัสสามารถลงทะเบียนเพื่อรับACTION_LOCKED_BOOT_COMPLETED
ข้อความประกาศจากระบบเมื่ออุปกรณ์รีสตาร์ท เมื่อถึงจุดนี้ อุปกรณ์จะพร้อมใช้งานพื้นที่เก็บข้อมูลที่เข้ารหัส และคอมโพเนนต์จะดําเนินการงานที่จําเป็นต้องทํางานในโหมดการบูตโดยตรง เช่น เรียกใช้การปลุกที่ตั้งเวลาไว้
ข้อมูลโค้ดต่อไปนี้เป็นตัวอย่างของวิธีลงทะเบียน
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
ที่ 2 โดยการเรียกใช้Context.createDeviceProtectedStorageContext()
การเรียกใช้ Storage 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 แห่ง
ทดสอบแอปที่มีการเข้ารหัส
ทดสอบแอปที่รู้จักการเข้ารหัสโดยเปิดใช้โหมดการบูตโดยตรง
อุปกรณ์ส่วนใหญ่ที่ใช้ Android เวอร์ชันล่าสุดจะเปิดใช้โหมดการเปิดเครื่องโดยตรง เมื่อมีการตั้งค่าข้อมูลเข้าสู่ระบบของหน้าจอล็อก (PIN, รูปแบบ หรือรหัสผ่าน) โดยเฉพาะอย่างยิ่ง กรณีนี้เกิดขึ้นในอุปกรณ์ทั้งหมดที่ใช้การเข้ารหัสตามไฟล์ หากต้องการตรวจสอบว่าอุปกรณ์ใช้การเข้ารหัสตามไฟล์หรือไม่ ให้เรียกใช้คำสั่งต่อไปนี้ คำสั่ง Shell:
adb shell getprop ro.crypto.type
หากเอาต์พุตคือ file
แสดงว่าอุปกรณ์เปิดใช้การเข้ารหัสตามไฟล์
ในอุปกรณ์ที่ไม่ได้ใช้การเข้ารหัสตามไฟล์โดยค่าเริ่มต้น อาจมี ตัวเลือกอื่นๆ สำหรับการทดสอบโหมดการเปิดเครื่องโดยตรง
-
อุปกรณ์บางเครื่องที่ใช้การเข้ารหัสแบบ Fullดิสก์ (
ro.crypto.type=block
) และใช้ Android 7.0 ถึง แปลงเป็น Android 12 ตามไฟล์ได้ การเข้ารหัส ซึ่งทำได้ 2 วิธีดังนี้- ในอุปกรณ์ ให้เปิดใช้ตัวเลือกสำหรับนักพัฒนาแอปหากยังไม่ได้เปิดใช้ โดยไปที่การตั้งค่า > เกี่ยวกับโทรศัพท์ แล้วแตะหมายเลขบิลด์ 7 ครั้ง จากนั้นไปที่ การตั้งค่า > นักพัฒนาซอฟต์แวร์ ตัวเลือก แล้วเลือกแปลงเป็นการเข้ารหัสไฟล์
- หรือเรียกใช้คำสั่ง Shell ต่อไปนี้
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
หากอุปกรณ์ใช้การเข้ารหัสทั้งดิสก์
หรือการเข้ารหัสตามไฟล์ด้วย Direct Boot ในทั้ง 2 กรณี ข้อมูลจะ
ถูกจัดเก็บโดยการเข้ารหัสเมื่อไม่มีการเคลื่อนไหว
หากแอปกำหนดเป้าหมายเป็น Android 7.0 (API 24) ขึ้นไป getStorageEncryptionStatus()
จะแสดงผลเป็น ENCRYPTION_STATUS_ACTIVE
หากอุปกรณ์ใช้การเข้ารหัสทั้งดิสก์ ผลลัพธ์
ENCRYPTION_STATUS_ACTIVE_PER_USER
หากอุปกรณ์ใช้การเข้ารหัสตามไฟล์
ด้วย Direct Boot
ถ้าคุณสร้างแอปการดูแลระบบอุปกรณ์
ที่กำหนดเป้าหมายเป็น Android 7.0 อย่าลืมตรวจหาทั้ง
ENCRYPTION_STATUS_ACTIVE
และ
ENCRYPTION_STATUS_ACTIVE_PER_USER
เพื่อระบุว่าอุปกรณ์
ที่เข้ารหัส
ตัวอย่างโค้ดเพิ่มเติม
ตัวอย่าง DirectBoot แสดงการใช้งาน API ที่ครอบคลุมในหน้านี้เพิ่มเติม