Android 7.0 ขึ้นไปรองรับการเข้ารหัสตามไฟล์ (FBE) การเข้ารหัสตามไฟล์ช่วยให้เข้ารหัสไฟล์ต่างๆ ได้ ด้วยกุญแจแต่ละอันที่ปลดล็อกแยกต่างหากได้
บทความนี้อธิบายวิธีเปิดใช้การเข้ารหัสตามไฟล์ในอุปกรณ์ใหม่ และวิธีที่แอปพลิเคชันระบบสามารถใช้ Direct Boot API เพื่อนำเสนอแก่ผู้ใช้ ปลอดภัยและดีที่สุดเท่าที่จะเป็นไปได้
อุปกรณ์ทั้งหมดที่เปิดตัวด้วย Android 10 ขึ้นไป จำเป็นต่อการใช้การเข้ารหัสตามไฟล์
Direct Boot
การเข้ารหัสตามไฟล์จะเปิดใช้ฟีเจอร์ใหม่ใน Android 7.0 ที่ชื่อว่า Direct เปิดเครื่อง Direct Boot ช่วยให้อุปกรณ์ที่เข้ารหัสเปิดเครื่องไปยังล็อกได้โดยตรง บนหน้าจอ ก่อนหน้านี้ในอุปกรณ์ที่เข้ารหัสโดยใช้ full-disk การเข้ารหัส (FDE) ผู้ใช้ต้องให้ข้อมูลเข้าสู่ระบบก่อน จึงจะมีข้อมูล ป้องกันไม่ให้โทรศัพท์ทำงาน ยกเว้นในระดับพื้นฐานที่สุด ตัวอย่างเช่น นาฬิกาปลุกไม่ทำงาน บริการช่วยเหลือพิเศษมี ไม่พร้อมใช้งาน และโทรศัพท์ รับสายไม่ได้ แต่มีการจำกัดเพียงโทรศัพท์พื้นฐาน การดำเนินการโทรฉุกเฉิน
ด้วยการเปิดตัวการเข้ารหัสตามไฟล์ (FBE) และ API ใหม่ที่จะทำให้ แอปพลิเคชันที่ต้องรับรู้ถึงการเข้ารหัส จึงเป็นไปได้ที่แอปพลิเคชันเหล่านี้จะทำงาน ในบริบทที่จำกัด ซึ่งอาจเกิดขึ้นได้ก่อนที่ผู้ใช้จะระบุ ในขณะที่ยังคงปกป้องข้อมูลส่วนตัวของผู้ใช้
ในอุปกรณ์ที่เปิดใช้ FBE ผู้ใช้อุปกรณ์แต่ละคนจะมีพื้นที่เก็บข้อมูล 2 ตำแหน่ง ใช้ได้กับแอปพลิเคชัน:
- พื้นที่เก็บข้อมูลเข้าสู่ระบบที่เข้ารหัส (CE) ซึ่งเป็นตำแหน่งของพื้นที่เก็บข้อมูลเริ่มต้น และใช้งานได้หลังจากที่ผู้ใช้ปลดล็อกอุปกรณ์แล้วเท่านั้น
- พื้นที่เก็บข้อมูลแบบเข้ารหัส (DE) ของอุปกรณ์ ซึ่งเป็นตำแหน่งของพื้นที่เก็บข้อมูลที่ใช้ได้ทั้ง 2 แบบ ในระหว่างโหมดการเปิดเครื่องโดยตรง และหลังจากที่ผู้ใช้ปลดล็อกอุปกรณ์แล้ว
การแยกนี้จะทำให้โปรไฟล์งานปลอดภัยยิ่งขึ้น เนื่องจากช่วยให้มีมากกว่า 1 โปรไฟล์ เพื่อปกป้องผู้ใช้อยู่เสมอ เนื่องจากการเข้ารหัสไม่ได้อิงตาม รหัสผ่านเวลาเปิดเครื่อง
Direct Boot API ช่วยให้แอปพลิเคชันที่ตระหนักถึงการเข้ารหัสเข้าถึงแต่ละแอปพลิเคชันได้ พื้นที่ใดก็ได้ มีการเปลี่ยนแปลงในวงจรของแอปพลิเคชันเพื่อรองรับความต้องการ แจ้งเตือนแอปพลิเคชันเมื่อพื้นที่เก็บข้อมูล CE ของผู้ใช้ปลดล็อกเพื่อตอบสนองต่อ ป้อนข้อมูลเข้าสู่ระบบบนหน้าจอล็อกก่อน หรือในกรณีที่ใช้โปรไฟล์งาน ซึ่งเป็น ที่ทำงาน ภารกิจ อุปกรณ์ที่ใช้ Android 7.0 ต้องรองรับ API ใหม่เหล่านี้และ โดยไม่คำนึงว่าจะติดตั้ง FBE หรือไม่ แม้ว่า, หากไม่มี พื้นที่เก็บข้อมูล FBE, DE และ CE จะอยู่ในสถานะปลดล็อกเสมอ
การใช้งานการเข้ารหัสตามไฟล์โดยสมบูรณ์ในไฟล์ Ext4 และ F2FS ระบบนี้มีอยู่ในโครงการโอเพนซอร์ส Android (AOSP) และจำเป็นเท่านั้น ซึ่งเปิดใช้ในอุปกรณ์ที่มีคุณสมบัติตรงตามข้อกำหนด ผู้ผลิตที่เลือกใช้ FBE อาจต้องการสำรวจวิธีเพิ่มประสิทธิภาพฟีเจอร์ตามระบบวงจรรวมบนชิป (SoC) ที่ใช้
แพ็กเกจที่จำเป็นทั้งหมดใน AOSP ได้รับการอัปเดตให้มีการเปิดเครื่องโดยตรงแล้ว แต่หากผู้ผลิตอุปกรณ์จะใช้แอปเหล่านี้ในเวอร์ชันที่กำหนดเอง ต้องการทำให้แน่ใจว่าอย่างน้อยที่สุดจะมีแพ็กเกจที่สามารถรับรู้การเปิดเครื่องโดยตรง บริการต่อไปนี้
- บริการโทรศัพท์และแอปโทรศัพท์
- วิธีป้อนข้อมูลสําหรับป้อนรหัสผ่านในหน้าจอล็อก
ตัวอย่างและแหล่งที่มา
Android ใช้การอ้างอิงการเข้ารหัสตามไฟล์ โดยที่ vold (ระบบ/vold) มีฟังก์ชันสำหรับจัดการอุปกรณ์จัดเก็บข้อมูลและ จำนวนมหาศาลใน Android การเพิ่ม FBE ทำให้เกิด vold พร้อมกับคำสั่งใหม่หลายรายการ เพื่อรองรับการจัดการคีย์สำหรับคีย์ CE และ DE ของผู้ใช้หลายคน นอกจากนี้ การเปลี่ยนแปลงหลักไปใช้ตามไฟล์ ความสามารถในการเข้ารหัสในเคอร์เนล แพ็กเกจระบบจำนวนมาก รวมถึง มีการแก้ไขหน้าจอล็อกและ SystemUI ให้รองรับ FBE และ Direct ฟีเจอร์เปิดเครื่อง ซึ่งได้แก่
- แป้นโทรศัพท์ AOSP (แพ็กเกจ/แอป/โปรแกรมโทรออก)
- นาฬิกาตั้งโต๊ะ (แพ็กเกจ/แอป/DeskClock)
- ละติน (แพ็กเกจ/วิธีการป้อนข้อมูล/ละติน)*
- แอปการตั้งค่า (แพ็กเกจ/แอป/การตั้งค่า)*
- SystemUI (เฟรมเวิร์ก/ฐาน/แพ็กเกจ/SystemUI)*
* แอปพลิเคชันระบบที่ใช้ defaultToDeviceProtectedStorage
แอตทริบิวต์ไฟล์ Manifest
ตัวอย่างเพิ่มเติมของแอปพลิเคชันและบริการที่ตระหนักถึงการเข้ารหัสมีดังนี้
ที่พบเมื่อเรียกใช้คำสั่ง mangrep directBootAware
ใน
ไดเรกทอรีหรือแพ็กเกจของ AOSP
แผนผังต้นทาง
การขึ้นต่อกัน
หากต้องการใช้ AOSP สำหรับ FBE อย่างปลอดภัย อุปกรณ์จะต้องมีคุณสมบัติตรงตาม ทรัพยากร Dependency ต่อไปนี้
- การรองรับเคอร์เนลสำหรับการเข้ารหัส Ext4 หรือการเข้ารหัส F2FS
- คีย์มาสเตอร์ รองรับ HAL เวอร์ชัน 1.0 ขึ้นไป ไม่มีการสนับสนุนสำหรับ Keymaster 0.3 เนื่องจากไม่มีความสามารถที่จำเป็นหรือการรับรอง การป้องกันที่เพียงพอสำหรับคีย์การเข้ารหัส
- Keymaster/Keystore และ ต้องติดตั้งใช้งานผู้รับสายแทนในการดำเนินการที่เชื่อถือได้ Environment (TEE) ให้การปกป้องคีย์ DE เพื่อให้ ระบบปฏิบัติการที่ไม่ได้รับอนุญาต (ระบบปฏิบัติการที่กำหนดเองที่ติดมากับอุปกรณ์) จะไม่เพียงแค่ขอ แป้น DE
- รูทของความน่าเชื่อถือของฮาร์ดแวร์และการเปิดเครื่องที่ได้รับการยืนยัน ต้องมีการเชื่อมโยงกับการเริ่มต้น Keymaster เพื่อให้แน่ใจว่าคีย์ DE สามารถเข้าถึงได้โดยระบบปฏิบัติการที่ไม่ได้รับอนุญาต
การใช้งาน
สิ่งแรกและสำคัญที่สุดคือแอปต่างๆ เช่น นาฬิกาปลุก โทรศัพท์ และฟีเจอร์การช่วยเหลือพิเศษ ควรทำให้เป็น android:directBootAware ตาม Boot ในเอกสารสำหรับนักพัฒนาซอฟต์แวร์
การรองรับเคอร์เนล
การรองรับเคอร์เนลสำหรับการเข้ารหัส Ext4 และ F2FS มีให้ใช้งานใน Android ทั่วไป เคอร์เนล เวอร์ชัน 3.18 ขึ้นไป เมื่อต้องการเปิดใช้งานในเคอร์เนลที่เป็นเวอร์ชัน 5.1 หรือสูงกว่า ให้ใช้
CONFIG_FS_ENCRYPTION=y
สำหรับเคอร์เนลรุ่นเก่า ให้ใช้ CONFIG_EXT4_ENCRYPTION=y
หากอุปกรณ์ของคุณ
ระบบไฟล์ userdata
เป็น Ext4 หรือใช้
CONFIG_F2FS_FS_ENCRYPTION=y
หากuserdata
ของอุปกรณ์
ระบบไฟล์คือ F2FS
หากอุปกรณ์ของคุณสนับสนุน พื้นที่เก็บข้อมูล หรือจะใช้ข้อมูลเมตา การเข้ารหัสในที่จัดเก็บข้อมูลภายใน ให้เปิดใช้ตัวเลือกการกำหนดค่าเคอร์เนล ที่จำเป็นสำหรับการเข้ารหัสข้อมูลเมตาตามที่อธิบายไว้ในเอกสารประกอบการเข้ารหัสข้อมูลเมตา
นอกจากการสนับสนุนการทำงานสำหรับการเข้ารหัส Ext4 หรือ F2FS แล้ว ผู้ผลิตก็ควรเปิดใช้การเร่ง การเข้ารหัสเพื่อเร่งความเร็ว การเข้ารหัสตามไฟล์และปรับปรุงประสบการณ์ของผู้ใช้ ตัวอย่างเช่น บน อุปกรณ์ที่ใช้ ARM64 สามารถเร่ง ARMv8 CE (Cryptography Extensions) ได้ เปิดใช้งานแล้วโดยตั้งค่าตัวเลือกการกำหนดค่าเคอร์เนลต่อไปนี้
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_SHA2_ARM64_CE=y
เพื่อปรับปรุงประสิทธิภาพและลดการใช้พลังงานให้มากขึ้น ผู้ผลิตอุปกรณ์อาจ ให้พิจารณาใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ ซึ่ง เข้ารหัส/ถอดรหัสข้อมูลระหว่างทางไปยัง/จากอุปกรณ์จัดเก็บข้อมูล เคอร์เนลทั่วไปของ Android (เวอร์ชัน 4.14 และสูงกว่า) มีเฟรมเวิร์กที่ อนุญาตให้ใช้การเข้ารหัสแบบอินไลน์เมื่อฮาร์ดแวร์และผู้ให้บริการไดรเวอร์ของ พร้อมใช้งาน คุณสามารถเปิดใช้เฟรมเวิร์กการเข้ารหัสแบบอินไลน์ได้โดยการตั้งค่า ตัวเลือกการกำหนดค่าเคอร์เนลต่อไปนี้
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
หากอุปกรณ์ใช้พื้นที่เก็บข้อมูลแบบ UFS โปรดเปิดใช้รายการต่อไปนี้ด้วย
CONFIG_SCSI_UFS_CRYPTO=y
หากอุปกรณ์ใช้พื้นที่เก็บข้อมูลแบบ eMMC ให้เปิดใช้ตัวเลือกต่อไปนี้ด้วย
CONFIG_MMC_CRYPTO=y
การเปิดใช้การเข้ารหัสตามไฟล์
การเปิดใช้ FBE ในอุปกรณ์จำเป็นต้องเปิดใช้ในที่จัดเก็บข้อมูลภายใน
(userdata
) การดำเนินการนี้จะเปิดใช้ FBE โดยอัตโนมัติใน Adable
พื้นที่เก็บข้อมูล; แต่อาจมีการลบล้างรูปแบบการเข้ารหัสในพื้นที่เก็บข้อมูลแบบปรับใช้ได้
หากจำเป็น
ที่เก็บข้อมูลภายใน
FBE เปิดใช้อยู่ด้วยการเพิ่มตัวเลือก
fileencryption=contents_encryption_mode[:filenames_encryption_mode[:flags]]
ในคอลัมน์ fs_mgr_flags ในบรรทัด fstab
สำหรับ
userdata
ตัวเลือกนี้จะกำหนดรูปแบบการเข้ารหัสในอุปกรณ์ภายใน
พื้นที่เก็บข้อมูล ซึ่งมีพารามิเตอร์ที่คั่นด้วยโคลอนได้สูงสุด 3 รายการ ได้แก่
- พารามิเตอร์
contents_encryption_mode
กำหนดว่า มีการใช้อัลกอริทึมการเข้ารหัสเพื่อเข้ารหัสเนื้อหาของไฟล์ อาจเป็นอย่างใดอย่างหนึ่งต่อไปนี้aes-256-xts
หรือadiantum
ตั้งแต่ Android 11 สามารถเว้นว่างไว้เพื่อระบุ อัลกอริทึมเริ่มต้น ซึ่งก็คือaes-256-xts
- พารามิเตอร์
filenames_encryption_mode
กำหนดว่า อัลกอริทึมการเข้ารหัสจะใช้ในการเข้ารหัสชื่อไฟล์ อาจเป็นอย่างใดอย่างหนึ่งต่อไปนี้aes-256-cts
aes-256-heh
adiantum
หรือaes-256-hctr2
หากไม่ได้ระบุ ระบบจะใช้ค่าเริ่มต้นเป็นaes-256-cts
หากcontents_encryption_mode
คือaes-256-xts
หรือadiantum
หากcontents_encryption_mode
คือadiantum
- พารามิเตอร์
flags
ฟีเจอร์ใหม่ใน Android 11, เป็นรายการแฟล็กที่คั่นด้วย+
อักขระ ระบบรองรับแฟล็กต่อไปนี้- แฟล็ก
v1
จะเลือกนโยบายการเข้ารหัสเวอร์ชัน 1 เวลา Flagv2
เลือกนโยบายการเข้ารหัสเวอร์ชัน 2 เวอร์ชัน นโยบายการเข้ารหัส 2 รายการจะใช้ฟังก์ชันการดึงคีย์ที่ปลอดภัยและยืดหยุ่นมากขึ้น ค่าเริ่มต้นคือ v2 หาก อุปกรณ์ที่เปิดตัวใน Android 11 ขึ้นไป (ตามที่กำหนดโดยro.product.first_api_level
) หรือ v1 หาก เปิดตัวอุปกรณ์บน Android 10 หรือ ด้านล่าง - แฟล็ก
inlinecrypt_optimized
จะเลือกการเข้ารหัส ที่เหมาะสำหรับฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ที่ไม่ จัดการกับแป้นจำนวนมากได้อย่างมีประสิทธิภาพ ซึ่งทำได้โดยการดึงข้อมูล คีย์การเข้ารหัสเนื้อหาไฟล์เพียง 1 คีย์ต่อคีย์ CE หรือ DE มากกว่า 1 รายการ 1 ครั้งต่อไฟล์ การสร้าง IV (เวกเตอร์เริ่มต้น) คือ ปรับให้สอดคล้องกัน - การแจ้งว่าไม่เหมาะสม
emmc_optimized
คล้ายกับinlinecrypt_optimized
แต่โมเดลก็ยังเลือก IV ด้วย เมธอดที่จํากัด IV ไว้ที่ 32 บิต การตั้งค่าสถานะนี้ควร สามารถใช้กับฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ซึ่งเป็นไปตาม ข้อมูลจำเพาะของ JEDEC eMMC v5.2 จึงรองรับเพียง 32 บิตเท่านั้น IV สำหรับฮาร์ดแวร์การเข้ารหัสแบบอินไลน์อื่นๆ ให้ใช้inlinecrypt_optimized
แทน ไม่ควรตั้งค่าสถานะนี้ ใช้กับพื้นที่เก็บข้อมูลแบบ UFS ข้อกำหนด UFS ช่วยให้สามารถใช้ IV 64 บิต - บนอุปกรณ์ที่รองรับการห่อด้วยฮาร์ดแวร์
คีย์, แฟล็ก
wrappedkey_v0
จะช่วยให้ใช้ คีย์ที่หุ้มด้วยฮาร์ดแวร์สำหรับ FBE ตัวเลือกนี้สามารถใช้คู่กันเท่านั้น ด้วยตัวเลือกตัวยึดinlinecrypt
และinlinecrypt_optimized
หรือemmc_optimized
แจ้ง - แฟล็ก
dusize_4k
จะบังคับขนาดของหน่วยข้อมูลการเข้ารหัส เป็น 4096 ไบต์แม้ว่าขนาดบล็อกของระบบไฟล์จะไม่ใช่ 4096 ไบต์ ขนาดหน่วยข้อมูลการเข้ารหัสคือรายละเอียดของไฟล์ การเข้ารหัสเนื้อหา แฟล็กนี้ใช้ได้ตั้งแต่ Android 15. ควรใช้แฟล็กนี้เพื่อเปิดใช้เท่านั้น การใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ที่ไม่รองรับข้อมูล หน่วยโฆษณาที่มีขนาดใหญ่กว่า 4096 ไบต์ในอุปกรณ์ที่ใช้ขนาดหน้า ใหญ่กว่า 4096 ไบต์และใช้ระบบไฟล์ f2fs
- แฟล็ก
หากคุณไม่ได้ใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ การตั้งค่าที่แนะนำสำหรับ
อุปกรณ์fileencryption=aes-256-xts
หากคุณใช้ในบรรทัด
ฮาร์ดแวร์การเข้ารหัส การตั้งค่าที่แนะนำสำหรับอุปกรณ์ส่วนใหญ่คือ
fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized
(หรือเทียบเท่า fileencryption=::inlinecrypt_optimized
) เปิด
อุปกรณ์ที่ไม่มีการเร่ง AES ในรูปแบบใดๆ สามารถใช้ Adiantum แทน AES ได้โดย
การตั้งค่า fileencryption=adiantum
ตั้งแต่ Android 14 โหมด AES-HCTR2 คือโหมดการเข้ารหัสชื่อไฟล์ที่แนะนำ
สำหรับอุปกรณ์ที่มีวิธีการเข้ารหัสแบบเร่ง อย่างไรก็ตาม จะรองรับเคอร์เนล Android รุ่นใหม่เท่านั้น
AES-HCTR2 ใน Android รุ่นต่อๆ ไป จะมีแผนที่จะกลายเป็นโหมดเริ่มต้นสำหรับชื่อไฟล์
การเข้ารหัส หากเคอร์เนลรองรับ AES-HCTR2 คุณจะเปิดใช้การเข้ารหัสชื่อไฟล์ได้โดย
กำลังตั้งค่า filenames_encryption_mode
เป็น aes-256-hctr2
ในกรณีที่ง่ายที่สุด
การดำเนินการนี้จะดำเนินการด้วย fileencryption=aes-256-xts:aes-256-hctr2
ในอุปกรณ์ที่เปิดตัว Android 10 หรือต่ำกว่า
fileencryption=ice
ยังได้รับการยอมรับเพื่อระบุการใช้
โหมดการเข้ารหัสเนื้อหาไฟล์ FSCRYPT_MODE_PRIVATE
โหมดนี้
ไม่ได้ใช้งานโดยเคอร์เนลทั่วไปของ Android แต่ก็สามารถนำไปใช้โดย
ผู้ให้บริการที่ใช้แพตช์เคอร์เนลที่กำหนดเอง รูปแบบบนดิสก์ที่โหมดนี้สร้างขึ้น
จะเป็นผู้ให้บริการเฉพาะ บนอุปกรณ์ที่เปิดตัวด้วย Android
11 ขึ้นไป จะไม่อนุญาตโหมดนี้อีกต่อไป และ
และต้องใช้รูปแบบการเข้ารหัสมาตรฐานแทน
โดยค่าเริ่มต้น การเข้ารหัสเนื้อหาไฟล์จะดำเนินการโดยใช้เคอร์เนลของ Linux
Cryptography API หากต้องการใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์แทน
เพิ่มตัวเลือกต่อเชื่อม inlinecrypt
ตัวอย่างเช่น แบบเต็ม
บรรทัด fstab
อาจมีลักษณะดังนี้
/dev/block/by-name/userdata /data f2fs nodev,noatime,nosuid,errors=panic,inlinecrypt wait,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized
พื้นที่เก็บข้อมูลแบบ Adoptable
นับตั้งแต่ Android 9, FBE และ พื้นที่เก็บข้อมูลแบบ Adoptable สามารถใช้ร่วมกันได้
การระบุตัวเลือก fileencryption
fstab สำหรับ
userdata
ยังเปิดใช้ทั้ง FBE และการเข้ารหัสข้อมูลเมตาโดยอัตโนมัติในอุปกรณ์ที่นำมาใช้ได้
พื้นที่เก็บข้อมูล อย่างไรก็ตาม คุณอาจลบล้าง FBE และ/หรือรูปแบบการเข้ารหัสข้อมูลเมตาใน
โดยการตั้งค่าพร็อพเพอร์ตี้ใน
PRODUCT_PROPERTY_OVERRIDES
ในอุปกรณ์ที่เปิดตัวด้วย Android 11 ขึ้นไป ให้ใช้ พร็อพเพอร์ตี้ต่อไปนี้
ro.crypto.volume.options
(ใหม่ใน Android 11) เลือกรูปแบบการเข้ารหัส FBE พื้นที่เก็บข้อมูลแบบ Adable ซึ่งมีไวยากรณ์เดียวกันกับอาร์กิวเมนต์ของfileencryption
ซึ่งใช้ค่าเริ่มต้นเดียวกัน ดูคำแนะนำสำหรับfileencryption
ข้างต้นว่าต้องทำอย่างไร ใช้ที่นี่ro.crypto.volume.metadata.encryption
เลือกข้อมูลเมตา รูปแบบการเข้ารหัสในพื้นที่เก็บข้อมูลที่ใช้ได้ โปรดดูข้อมูลเมตา ในเอกสารประกอบเรื่องการเข้ารหัส
ในอุปกรณ์ที่เปิดตัว Android 10 หรือต่ำกว่า ให้ใช้ พร็อพเพอร์ตี้ต่อไปนี้
ro.crypto.volume.contents_mode
เลือกเนื้อหา โหมดการเข้ารหัส ซึ่งเทียบเท่ากับฟิลด์แรกที่คั่นด้วยโคลอนro.crypto.volume.options
ro.crypto.volume.filenames_mode
เลือกชื่อไฟล์ โหมดการเข้ารหัส ซึ่งเทียบเท่ากับช่องที่คั่นด้วยเครื่องหมายทวิภาคของro.crypto.volume.options
ยกเว้นค่าเริ่มต้นในอุปกรณ์ ที่เปิดตัวด้วย Android 10 หรือต่ำกว่าaes-256-heh
ในอุปกรณ์ส่วนใหญ่ ค่านี้ต้องมีการระบุอย่างชัดเจน ลบล้างเป็นaes-256-cts
แล้วro.crypto.fde_algorithm
และro.crypto.fde_sector_size
เลือกการเข้ารหัสข้อมูลเมตา บนพื้นที่เก็บข้อมูลที่ใช้ได้ โปรดดูข้อมูลเมตา ในเอกสารประกอบเรื่องการเข้ารหัส
การผสานรวมกับ Keymaster
HAL ของ Keymaster ควรเริ่มต้นโดยเป็นส่วนหนึ่งของคลาส early_hal
เนื่องจาก FBE กำหนดให้ Keymaster พร้อมที่จะจัดการคำขอโดย
ระยะเปิดเครื่องpost-fs-data
ซึ่งก็คือเมื่อ vold
ตั้งค่า
คีย์เริ่มต้น
การยกเว้นไดเรกทอรี
init
ใช้คีย์ DE ของระบบกับ
ไดเรกทอรีระดับบนสุดทั้งหมดของ /data
ยกเว้นไดเรกทอรีที่
ต้องไม่มีการเข้ารหัส เช่น ไดเรกทอรีที่มีคีย์ DE ของระบบ
และไดเรกทอรีที่มีไดเรกทอรี CE หรือ DE ของผู้ใช้ คีย์การเข้ารหัส
นำไปใช้ซ้ำๆ และไดเรกทอรีย่อยไม่สามารถลบล้างได้
ใน Android 11 ขึ้นไป คีย์ที่
init
มีผลกับไดเรกทอรีที่สามารถควบคุมได้โดย
อาร์กิวเมนต์ encryption=<action>
ไปยัง mkdir
ในสคริปต์ init ค่าที่เป็นไปได้ของ <action>
คือ
ตามที่ระบุไว้ใน
README สำหรับภาษา Init ของ Android
ใน Android 10 การดำเนินการเข้ารหัส init
ถูกฮาร์ดโค้ดลงในตำแหน่งต่อไปนี้:
/system/extras/libfscrypt/fscrypt_init_extensions.cpp
ใน Android 9 และเวอร์ชันก่อนหน้า ตำแหน่งคือ
/system/extras/ext4_utils/ext4_crypt_init_extensions.cpp
คุณสามารถเพิ่มข้อยกเว้นเพื่อป้องกันไม่ให้บางไดเรกทอรี มีการเข้ารหัสเลย หากมีการปรับเปลี่ยนข้อมูลประเภทนี้ อุปกรณ์ ผู้ผลิตควรมี นโยบาย SELinux ที่ให้สิทธิ์เข้าถึงเฉพาะ แอปพลิเคชันที่ต้องใช้ไดเรกทอรีที่ไม่ได้เข้ารหัส ซึ่งจะเป็นการยกเว้นทั้งหมด แอปพลิเคชันที่ไม่น่าเชื่อถือ
กรณีการใช้งานเดียวที่เรายอมรับได้คือการรองรับ OTA เดิม ความสามารถ
การรองรับ Direct Boot ในแอปพลิเคชันระบบ
การกำหนดให้ Direct Boot ของแอปพลิเคชันรับรู้
เพื่อช่วยให้ย้ายข้อมูลแอประบบได้อย่างรวดเร็ว เรามีแอตทริบิวต์ใหม่ 2 รายการที่
สามารถตั้งค่าในระดับแอปพลิเคชัน
แอตทริบิวต์ defaultToDeviceProtectedStorage
ใช้ได้เฉพาะกับ
แอประบบ ทุกคนใช้แอตทริบิวต์ directBootAware
ได้
<application android:directBootAware="true" android:defaultToDeviceProtectedStorage="true">
แอตทริบิวต์ directBootAware
ในระดับแอปพลิเคชันเป็นทางลัดสำหรับการทำเครื่องหมาย
คอมโพเนนต์ทั้งหมดในแอปว่ารับรู้การเข้ารหัส
แอตทริบิวต์ defaultToDeviceProtectedStorage
เปลี่ยนเส้นทางค่าเริ่มต้น
ตำแหน่งพื้นที่เก็บข้อมูลของแอปให้ชี้ไปที่พื้นที่เก็บข้อมูล DE แทนการชี้ไปที่พื้นที่เก็บข้อมูล CE
แอประบบที่ใช้แฟล็กนี้ต้องตรวจสอบข้อมูลทั้งหมดที่จัดเก็บไว้ในค่าเริ่มต้นอย่างละเอียด
ตำแหน่ง และเปลี่ยนเส้นทางของข้อมูลที่ละเอียดอ่อนเพื่อใช้พื้นที่เก็บข้อมูล CE อุปกรณ์
ผู้ผลิตที่ใช้ตัวเลือกนี้ควรตรวจสอบข้อมูลอย่างละเอียด
จัดเก็บเพื่อให้แน่ใจว่าไม่มีข้อมูลส่วนบุคคล
เมื่อทำงานในโหมดนี้ API ระบบต่อไปนี้ จัดการบริบทที่สนับสนุนโดยพื้นที่เก็บข้อมูล CE ได้เมื่อจำเป็น ซึ่ง จะเทียบเท่ากับเวอร์ชันที่ได้รับการคุ้มครองอุปกรณ์
Context.createCredentialProtectedStorageContext()
Context.isCredentialProtectedStorage()
รองรับผู้ใช้หลายคน
ผู้ใช้แต่ละคนในสภาพแวดล้อมที่มีผู้ใช้หลายคนจะได้รับคีย์การเข้ารหัสแยกกัน ผู้ใช้ทุกคน ได้รับคีย์ 2 อัน ได้แก่ คีย์ DE และ CE ผู้ใช้ 0 ต้องเข้าสู่ระบบอุปกรณ์ตามที่เป็นอยู่ก่อน ผู้ใช้พิเศษ กรณีนี้เกี่ยวข้องกับอุปกรณ์ การดูแลระบบ
แอปพลิเคชันแบบ Crypto-Aware จะโต้ตอบระหว่างผู้ใช้ในลักษณะนี้
INTERACT_ACROSS_USERS
และ INTERACT_ACROSS_USERS_FULL
อนุญาตให้แอปพลิเคชันดำเนินการกับผู้ใช้ทั้งหมดบนอุปกรณ์ อย่างไรก็ตาม
แอปจะเข้าถึงได้เฉพาะไดเรกทอรีที่เข้ารหัส CE สําหรับผู้ใช้ที่
ปลดล็อกแล้ว
แอปพลิเคชันอาจสามารถโต้ตอบได้อย่างอิสระทั่วพื้นที่เยอรมนี แต่ผู้ใช้ 1 คน ปลดล็อกแล้ว ไม่ได้หมายความว่าผู้ใช้ทุกคนบนอุปกรณ์ได้รับการปลดล็อกแล้ว ควรตรวจสอบสถานะนี้ก่อนที่จะพยายามเข้าถึงพื้นที่เหล่านี้
รหัสผู้ใช้โปรไฟล์งานแต่ละรายการจะได้รับคีย์ 2 อัน ได้แก่ DE และ CE เมื่อความท้าทายในการทำงาน ผู้ใช้โปรไฟล์จะถูกปลดล็อก และ Keymaster (ใน TEE) สามารถให้ คีย์ TEE ของโปรไฟล์
การจัดการการอัปเดต
พาร์ติชันการกู้คืนไม่สามารถเข้าถึงพื้นที่เก็บข้อมูลที่ได้รับการป้องกันโดย DE ใน พาร์ติชันข้อมูลผู้ใช้ ขอแนะนำให้ใช้อุปกรณ์ FBE เพื่อรองรับ OTA โดยใช้การอัปเดตระบบ A/B อาส ก็สามารถใช้ OTA ในระหว่างการทำงานตามปกติ โดยไม่ต้องกู้คืนเพื่อ เข้าถึงข้อมูลในไดรฟ์ที่เข้ารหัส
เมื่อใช้โซลูชัน OTA แบบเดิม ซึ่งต้องมีการกู้คืนเพื่อเข้าถึงไฟล์ OTA
ในพาร์ติชัน userdata
:
- สร้างไดเรกทอรีระดับบนสุด (เช่น
misc_ne
) ใน พาร์ติชันuserdata
- กำหนดค่าไดเรกทอรีระดับบนสุดนี้ให้เป็นไม่เข้ารหัส (ดูการยกเว้นไดเรกทอรี)
- สร้างไดเรกทอรีภายในไดเรกทอรีระดับบนสุดเพื่อเก็บแพ็กเกจ OTA
- เพิ่มกฎ SELinux และบริบทไฟล์เพื่อควบคุมการเข้าถึงไดเรกทอรีนี้และ ในเนื้อหานั้น เฉพาะกระบวนการหรือแอปพลิเคชันที่ได้รับการอัปเดต OTA เท่านั้นที่ควร สามารถอ่านและเขียนลงในไดเรกทอรีนี้ได้ ไม่มีการสมัครหรือกระบวนการอื่น ควรมีสิทธิ์เข้าถึงไดเรกทอรีนี้
การตรวจสอบความถูกต้อง
เพื่อให้แน่ใจว่าฟีเจอร์ในเวอร์ชันติดตั้งใช้งานทำงานได้ตามที่ต้องการ ให้เรียกใช้ก่อน การทดสอบการเข้ารหัส CTS หลายรายการ เช่น DirectBootHostTest และ EncryptionTest
หากอุปกรณ์ใช้ Android 11 ขึ้นไป ให้ใช้ vts_kernel_encryption_test
atest vts_kernel_encryption_test
หรือ
vts-tradefed run vts -m vts_kernel_encryption_test
นอกจากนี้ ผู้ผลิตอุปกรณ์อาจทำการทดสอบด้วยตนเองต่อไปนี้ ใน อุปกรณ์ที่เปิดใช้ FBE:
- ตรวจสอบว่ามี
ro.crypto.state
อยู่- ตรวจสอบว่ามีการเข้ารหัส
ro.crypto.state
- ตรวจสอบว่ามีการเข้ารหัส
- ตรวจสอบว่ามี
ro.crypto.type
อยู่- ตรวจสอบว่าตั้งค่า
ro.crypto.type
เป็นfile
แล้ว
- ตรวจสอบว่าตั้งค่า
นอกจากนี้ ผู้ทดสอบยังตรวจสอบได้ว่าพื้นที่เก็บข้อมูล CE ล็อกอยู่หรือไม่ก่อนที่อุปกรณ์จะ
ถูกปลดล็อกเป็นครั้งแรกตั้งแต่เปิดเครื่อง โดยใช้
บิลด์ userdebug
หรือ eng
ตั้งค่า PIN, รูปแบบ หรือ
กับผู้ใช้หลักและรีบูตอุปกรณ์ ก่อนปลดล็อกอุปกรณ์
เรียกใช้คำสั่งต่อไปนี้เพื่อตรวจสอบพื้นที่เก็บข้อมูล CE ของผู้ใช้หลัก หาก
อุปกรณ์ที่ใช้ระบบแบบไม่มีส่วนหัว
โหมดผู้ใช้ (อุปกรณ์ยานยนต์ส่วนใหญ่) ผู้ใช้หลักคือผู้ใช้ 10 ดังนั้นให้เรียกใช้
adb root; adb shell ls /data/user/10
ในอุปกรณ์อื่นๆ (อุปกรณ์ที่ไม่ใช่ยานยนต์ส่วนใหญ่) ผู้ใช้หลักคือผู้ใช้ 0 ดังนั้น เรียกใช้:
adb root; adb shell ls /data/user/0
ตรวจสอบว่าชื่อไฟล์ที่แสดงมีการเข้ารหัส Base64 ซึ่งบ่งชี้ว่า ชื่อไฟล์ได้รับการเข้ารหัส และคีย์ที่ใช้ถอดรหัสยังไม่พร้อมใช้งาน หากชื่อไฟล์แสดงเป็นข้อความธรรมดา แสดงว่ามีข้อผิดพลาดเกิดขึ้น
ขอแนะนำให้ผู้ผลิตอุปกรณ์ลองเรียกใช้การทดสอบ Linux ต้นทางสำหรับ fscrypt ในอุปกรณ์หรือ เคอร์เนล การทดสอบเหล่านี้เป็นส่วนหนึ่งของชุดทดสอบระบบไฟล์ xfstests อย่างไรก็ตาม Android ไม่รองรับการทดสอบอัปสตรีมเหล่านี้อย่างเป็นทางการ
รายละเอียดการใช้งาน AOSP
ส่วนนี้จะให้รายละเอียดเกี่ยวกับการติดตั้งใช้งาน AOSP และอธิบายวิธี การเข้ารหัสตามไฟล์ใช้งานได้ ไม่จำเป็นสำหรับผู้ผลิตอุปกรณ์ เพื่อใช้ FBE และ Direct Boot ในอุปกรณ์ของตนในส่วนนี้
การเข้ารหัส fscrypt
การใช้ AOSP ใช้ "fscrypt" การเข้ารหัส (รองรับโดย ext4 และ f2fs) ในเคอร์เนล และตามปกติจะมีการกำหนดค่าดังนี้
- เข้ารหัสเนื้อหาไฟล์ด้วย AES-256 ในโหมด XTS
- เข้ารหัสชื่อไฟล์ด้วย AES-256 ในโหมด CBC-CTS
การเข้ารหัส Adiantum ยัง ที่รองรับ เมื่อเปิดใช้การเข้ารหัส Adiantum ทั้งเนื้อหาไฟล์และชื่อไฟล์ ด้วย Adiantum แล้ว
fscrypt รองรับนโยบายการเข้ารหัส 2 เวอร์ชัน ได้แก่ เวอร์ชัน 1 และ 2 เราเลิกใช้งานเวอร์ชัน 1 แล้ว รวมถึงข้อกำหนดของ CDD สำหรับอุปกรณ์ที่เปิดตัวด้วย Android 11 ขึ้นไปใช้ได้กับเวอร์ชัน 2. นโยบายการเข้ารหัสเวอร์ชัน 2 ใช้ HKDF-SHA512 เพื่อรับคีย์การเข้ารหัสจริงจากคีย์ที่ Userspace มีให้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ fscrypt โปรดดูเอกสารประกอบของเคอร์เนลอัปสตรีม
คลาสพื้นที่เก็บข้อมูล
ตารางต่อไปนี้แสดงคีย์ FBE และไดเรกทอรีที่คีย์ FBE ป้องกัน รายละเอียด:
ประเภทพื้นที่เก็บข้อมูล | คำอธิบาย | ไดเรกทอรี |
---|---|---|
ไม่ได้เข้ารหัส | ไดเรกทอรีใน /data ที่ต้องมีหรือไม่จำเป็นต้องเป็น
ได้รับการปกป้องโดย FBE ในอุปกรณ์ที่ใช้ข้อมูลเมตา
การเข้ารหัส ไดเรกทอรีเหล่านี้ไม่ได้เข้ารหัสอย่างแท้จริง แต่
ได้รับการปกป้องด้วยคีย์การเข้ารหัสข้อมูลเมตาซึ่งเทียบเท่ากับ
ระบบ DE |
|
ระบบ DE | ข้อมูลที่เข้ารหัสอุปกรณ์ไม่เชื่อมโยงกับผู้ใช้รายใดรายหนึ่ง |
|
ต่อบูท | ไฟล์ระบบชั่วคราวที่ไม่จำเป็นต้องผ่านกระบวนการรีบูต | /data/per_boot |
CE ของผู้ใช้ (ภายใน) | ข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบต่อผู้ใช้ในพื้นที่เก็บข้อมูลภายใน |
|
ผู้ใช้ DE (ภายใน) | ข้อมูลที่เข้ารหัสตามอุปกรณ์บนพื้นที่เก็บข้อมูลภายในต่อผู้ใช้ |
|
CE ของผู้ใช้ (นำมาใช้ได้) | ข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบต่อผู้ใช้ในพื้นที่เก็บข้อมูลแบบ Adable |
|
ผู้ใช้ DE (นำมาใช้ได้) | ข้อมูลที่เข้ารหัสตามอุปกรณ์บนพื้นที่เก็บข้อมูลแบบนํามาใช้ได้ |
|
การจัดเก็บและการปกป้องคีย์
คีย์ FBE ทั้งหมดจัดการโดย vold
และจัดเก็บที่เข้ารหัสบนดิสก์
ยกเว้นคีย์ต่อบูตที่ไม่ได้เก็บไว้เลย ตารางต่อไปนี้
แสดงตำแหน่งที่เก็บคีย์ FBE ต่างๆ
ประเภทคีย์ | ตำแหน่งที่ตั้งคีย์ | ประเภทพื้นที่เก็บข้อมูลของตำแหน่งคีย์ |
---|---|---|
คีย์ DE ของระบบ | /data/unencrypted |
ไม่ได้เข้ารหัส |
คีย์ CE (ภายใน) ของผู้ใช้ | /data/misc/vold/user_keys/ce/${user_id} |
ระบบ DE |
คีย์ DE (ภายใน) ของผู้ใช้ | /data/misc/vold/user_keys/de/${user_id} |
ระบบ DE |
คีย์ CE (นำมาใช้ได้) ของผู้ใช้ | /data/misc_ce/${user_id}/vold/volume_keys/${volume_uuid} |
CE ของผู้ใช้ (ภายใน) |
คีย์ DE (นำมาใช้ได้) ของผู้ใช้ | /data/misc_de/${user_id}/vold/volume_keys/${volume_uuid} |
ผู้ใช้ DE (ภายใน) |
ตามที่แสดงในตารางก่อนหน้านี้ คีย์ FBE ส่วนใหญ่จัดเก็บไว้ในไดเรกทอรีที่ ได้รับการเข้ารหัสโดยคีย์ FBE อื่น ปลดล็อกกุญแจไม่ได้จนกว่าจะเหลือพื้นที่เก็บข้อมูล ที่มีปลดล็อกแล้ว
vold
ยังใช้เลเยอร์การเข้ารหัสกับคีย์ FBE ทั้งหมดด้วย ทุกคีย์
นอกเหนือจากคีย์ CE สำหรับที่จัดเก็บข้อมูลภายในแล้วจะได้รับการเข้ารหัสด้วย AES-256-GCM โดยใช้คีย์ของตัวเอง
คีย์ Keystore ที่ไม่ใช่คีย์
เปิดเผยนอก TEE ซึ่งจะทำให้คีย์ FBE ปลดล็อกไม่ได้เว้นแต่
ระบบปฏิบัติการที่เชื่อถือได้มีการเปิดเครื่องตามที่บังคับใช้โดยการเปิดเครื่องที่ได้รับการยืนยัน ย้อนกลับ
มีการขอความต้านทานบนคีย์คีย์สโตร์ด้วย ซึ่งทำให้คีย์ FBE สามารถ
ถูกลบอย่างปลอดภัยในอุปกรณ์ที่ Keymaster รองรับการต้านทานการย้อนกลับ อาส
SHA-512 ซึ่งเป็นตัวเลือกสำรองที่ใช้ความพยายามมากที่สุดเมื่อไม่มีข้อมูลการต้านทานย้อนกลับ
แฮชของไบต์แบบสุ่ม 16,384 ไบต์ที่จัดเก็บไว้ในไฟล์ secdiscardable
ข้างคีย์จะใช้เป็น รหัสแอปพลิเคชัน
ของคีย์คีย์สโตร์ คุณจะต้องกู้คืนไบต์เหล่านี้ทั้งหมดเพื่อกู้คืน
คีย์ FBE
คีย์ CE สำหรับที่จัดเก็บข้อมูลภายในจะได้รับการป้องกันในระดับที่แน่นหนายิ่งขึ้นเพื่อให้มั่นใจได้ว่า ไม่สามารถปลดล็อกได้หากไม่ทราบหน้าจอล็อกของผู้ใช้ กราฟความรู้ (LSKF) (PIN, รูปแบบ หรือรหัสผ่าน) ความปลอดภัย โทเค็นการรีเซ็ตรหัสผ่าน หรือทั้งคีย์ฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์สำหรับ การดำเนินการกลับมาทำงานอีกครั้งเมื่อรีบูต อนุญาตให้สร้างโทเค็นการรีเซ็ตรหัสผ่านได้เฉพาะสำหรับโปรไฟล์งานและ เต็มจำนวน อุปกรณ์ที่มีการจัดการ
vold
จะเข้ารหัสคีย์ CE แต่ละคีย์สำหรับที่จัดเก็บข้อมูลภายในเพื่อให้ดำเนินการดังกล่าวได้
โดยใช้คีย์ AES-256-GCM ที่ได้มาจากรหัสผ่านสังเคราะห์ของผู้ใช้
รหัสผ่านสังเคราะห์คือข้อมูลลับในการเข้ารหัสที่มีเอนโทรปีสูงที่เปลี่ยนแปลงไม่ได้
ที่สร้างขึ้นแบบสุ่มสำหรับผู้ใช้แต่ละคน LockSettingsService
นิ้ว
system_server
จะจัดการรหัสผ่านสังเคราะห์และวิธีการที่
อุปกรณ์จึงได้รับการป้องกัน
วิธีปกป้องรหัสผ่านสังเคราะห์ด้วย LSKF
LockSettingsService
ยืด LSKF ออกไปก่อนโดยผ่าน
scrypt
โดยกำหนดเป้าหมายที่เวลาประมาณ 25 มิลลิวินาที และ
ใช้หน่วยความจำประมาณ 2 MiB เนื่องจาก LSKF มักสั้น ขั้นตอนนี้จึงมัก
ไม่มีความปลอดภัยมากนัก ระดับความปลอดภัยชั้นหลักคือ
องค์ประกอบ (SE) หรือการจำกัดอัตราที่บังคับใช้ TEE ที่อธิบายไว้ด้านล่าง
หากอุปกรณ์มีองค์ประกอบความปลอดภัย (SE) LockSettingsService
จับคู่ LSKF ที่ยืดแล้วไปยังข้อมูลลับแบบสุ่มที่มีเอนโทรปีสูงซึ่งจัดเก็บไว้ใน SE โดยใช้
Weaver HAL LockSettingsService
จากนั้นเข้ารหัส
รหัสผ่านสังเคราะห์ 2 ครั้ง โดยครั้งแรกจะใช้คีย์ซอฟต์แวร์ที่มาจาก
LSKF และข้อมูลลับ Weaver ที่เพิ่มขึ้นอย่างที่สองอย่างที่สองคือคีย์สโตร์ที่ไม่ได้เชื่อมโยงกับการตรวจสอบสิทธิ์
ซึ่งจะระบุการจำกัดอัตราการคาดเดาของ LSKF ที่บังคับใช้กับ SE
หากอุปกรณ์ไม่มี SE ให้ใช้ LockSettingsService
แทน
ใช้ LSKF แบบขยายในฐานะผู้รับสายแทน
รหัสผ่าน จากนั้น LockSettingsService
จะเข้ารหัสรหัสผ่านสังเคราะห์
สองครั้ง: อันแรกใช้คีย์ซอฟต์แวร์ที่ได้มาจาก LSKF แบบขยายและแฮชของ
ไฟล์ที่ secdiscardable ได้ โดยเป็นไฟล์ที่ 2 ด้วยคีย์คีย์สโตร์ที่ผูกการตรวจสอบสิทธิ์กับ
การลงทะเบียนผู้รับสายแทน ซึ่งจะระบุการจำกัดอัตราการคาดเดาของ LSKF ที่บังคับใช้กับ TEE
เมื่อเปลี่ยน LSKF แล้ว LockSettingsService
จะลบทั้งหมด
ข้อมูลที่เกี่ยวข้องกับการเชื่อมโยงรหัสผ่านสังเคราะห์กับรหัสผ่านเก่า
LSKF ในอุปกรณ์ที่รองรับ Weaver หรือคีย์สโตร์ที่ป้องกันการย้อนกลับ
รับประกันการลบการเชื่อมโยงเดิมออกอย่างปลอดภัย ด้วยเหตุนี้ การป้องกัน
ที่อธิบายไว้ ณ ที่นี้ จะมีการนำมาใช้แม้ว่าผู้ใช้จะไม่มี LSKF ก็ตาม