การเข้ารหัสดิสก์แบบเต็ม

การเข้ารหัสทั้งดิสก์คือกระบวนการเข้ารหัสข้อมูลผู้ใช้ทั้งหมดบนอุปกรณ์ Android โดยใช้คีย์ที่เข้ารหัส เมื่ออุปกรณ์ได้รับการเข้ารหัสแล้ว ข้อมูลที่สร้างโดยผู้ใช้ทั้งหมดจะได้รับการเข้ารหัสโดยอัตโนมัติก่อนที่จะส่งไปยังดิสก์ และการอ่านทั้งหมดจะถอดรหัสข้อมูลโดยอัตโนมัติก่อนที่จะส่งกลับไปยังกระบวนการเรียก

การเข้ารหัสแบบเต็มดิสก์ได้รับการแนะนำให้รู้จักกับ Android ใน 4.4 แต่ Android 5.0 ได้แนะนำคุณสมบัติใหม่เหล่านี้:

  • สร้างการเข้ารหัสที่รวดเร็ว ซึ่งเข้ารหัสเฉพาะบล็อกที่ใช้บนพาร์ติชั่นข้อมูลเพื่อหลีกเลี่ยงการบู๊ตครั้งแรกที่ใช้เวลานาน ขณะนี้มีเพียงระบบไฟล์ ext4 และ f2fs เท่านั้นที่รองรับการเข้ารหัสที่รวดเร็ว
  • เพิ่ม forceencrypt ธง fstab การเข้ารหัสในการบูตครั้งแรก
  • เพิ่มการรองรับรูปแบบและการเข้ารหัสโดยไม่ต้องใช้รหัสผ่าน
  • เพิ่มที่เก็บข้อมูลฮาร์ดแวร์สำรองของคีย์การเข้ารหัสโดยใช้ความสามารถในการลงนามของ Trusted Execution Environment (TEE) (เช่นใน TrustZone) ดู การจัดเก็บคีย์การเข้ารหัส สำหรับรายละเอียดเพิ่มเติม

ข้อควรระวัง: อุปกรณ์อัพเกรดเป็น Android 5.0 และการเข้ารหัสแล้วอาจถูกส่งกลับไปยังรัฐที่ไม่ได้เข้ารหัสโดยโรงงานตั้งค่าข้อมูลจาก อุปกรณ์ Android 5.0 ใหม่ที่เข้ารหัสเมื่อบูตครั้งแรกไม่สามารถกลับสู่สถานะที่ไม่ได้เข้ารหัสได้

วิธีการทำงานของการเข้ารหัสทั้งดิสก์ของ Android

การเข้ารหัส Android เต็มรูปแบบดิสก์จะขึ้นอยู่กับ dm-crypt ซึ่งเป็นคุณลักษณะเคอร์เนลว่างานที่ชั้นอุปกรณ์ป้องกัน ด้วยเหตุนี้ผลงานการเข้ารหัสด้วยสมองกลฝังตัวมัลติมีเดีย (eMMC) และอุปกรณ์แฟลชที่คล้ายกันที่นำเสนอตัวเองเคอร์เนลเป็นอุปกรณ์ป้องกัน YAFFS ไม่สามารถเข้ารหัสได้ ซึ่งพูดโดยตรงกับชิปแฟลช NAND แบบดิบ

อัลกอริธึมการเข้ารหัสคือ 128 Advanced Encryption Standard (AES) พร้อมด้วย cipher-block chaining (CBC) และ ESSIV:SHA256 มาสเตอร์คีย์ถูกเข้ารหัสด้วย AES 128 บิตผ่านการเรียกไปยังไลบรารี OpenSSL คุณต้องใช้ 128 บิตขึ้นไปสำหรับคีย์ (โดยที่ 256 เป็นทางเลือก)

หมายเหตุ: OEMs สามารถใช้ 128 บิตหรือสูงกว่าในการเข้ารหัสคีย์หลัก

ในรุ่น Android 5.0 มีสถานะการเข้ารหัสสี่ประเภท:

  • ค่าเริ่มต้น
  • เข็มหมุด
  • รหัสผ่าน
  • ลวดลาย

เมื่อบู๊ตครั้งแรก อุปกรณ์จะสร้างมาสเตอร์คีย์ 128 บิตที่สร้างแบบสุ่ม จากนั้นแฮชด้วยรหัสผ่านเริ่มต้นและเก็บเกลือไว้ รหัสผ่านเริ่มต้นคือ: "default_password" อย่างไรก็ตาม แฮชผลลัพธ์ยังถูกเซ็นชื่อผ่าน TEE (เช่น TrustZone) ซึ่งใช้แฮชของลายเซ็นเพื่อเข้ารหัสมาสเตอร์คีย์

คุณสามารถค้นหารหัสผ่านเริ่มต้นที่กำหนดไว้ใน Android โครงการ Open Source cryptfs.cpp ไฟล์

เมื่อผู้ใช้ตั้งค่า PIN/รหัสผ่าน หรือรหัสผ่านบนอุปกรณ์ เฉพาะคีย์ 128 บิตเท่านั้นที่จะได้รับการเข้ารหัสและจัดเก็บอีกครั้ง (เช่น. ผู้ใช้ / ผ่าน / การเปลี่ยนแปลงรูปแบบ PIN ไม่ก่อให้เกิดการเข้ารหัสใหม่ของ UserData.) ทราบว่า อุปกรณ์ที่มีการจัดการ อาจจะ PIN ข้อ จำกัด รูปแบบหรือรหัสผ่าน

การเข้ารหัสลับมีการจัดการโดย init และ vold init เรียก vold และ Vold ชุดคุณสมบัติเพื่อทริกเกอร์เหตุการณ์ใน init ส่วนอื่นๆ ของระบบยังพิจารณาคุณสมบัติเพื่อดำเนินการต่างๆ เช่น สถานะรายงาน ขอรหัสผ่าน หรือการแจ้งให้รีเซ็ตเป็นค่าจากโรงงานในกรณีที่เกิดข้อผิดพลาดร้ายแรง จะก่อให้เกิดการเข้ารหัสในลักษณะ vold ระบบใช้เครื่องมือบรรทัดคำสั่ง vdc 's cryptfs คำสั่ง: checkpw , restart , enablecrypto , changepw , cryptocomplete , verifypw , setfield , getfield , mountdefaultencrypted , getpwtype , getpw และ clearpw

เพื่อที่จะเข้ารหัสถอดรหัสหรือเช็ด /data , /data จะต้องไม่ถูกติดตั้ง แต่เพื่อที่จะแสดงให้อินเตอร์เฟซผู้ใช้ (UI) กรอบจะต้องเริ่มต้นและกรอบการทำงานต้องใช้ /data วิ่ง เมื่อต้องการแก้ไขปริศนานี้ระบบแฟ้มชั่วคราวติดตั้งบน /data ซึ่งจะช่วยให้ Android สามารถถามรหัสผ่าน แสดงความคืบหน้า หรือแนะนำให้ล้างข้อมูลได้ตามต้องการ มันไม่กำหนดข้อ จำกัด ว่าเพื่อที่จะเปลี่ยนจากระบบแฟ้มชั่วคราวเพื่อความจริง /data ระบบแฟ้มระบบจะต้องหยุดกระบวนการกับไฟล์ที่เปิดให้บริการทุกบนระบบไฟล์ชั่วคราวและเริ่มต้นกระบวนการเหล่านั้นในความเป็นจริงของ /data ระบบแฟ้ม การทำเช่นนี้บริการทั้งหมดจะต้องอยู่ในหนึ่งในสามของกลุ่ม core , main และ late_start

  • core : ไม่เคยปิดตัวลงหลังจากที่เริ่มต้น
  • main : ลงปิดแล้วรีสตาร์ทหลังจากรหัสผ่านดิสก์ถูกป้อน
  • late_start : ไม่เริ่มจนกว่าจะได้รับ /data ได้รับการถอดรหัสและการติดตั้ง

ที่จะเรียกการกระทำเหล่านี้ vold.decrypt ตั้งค่าคุณสมบัติเป็น สายต่างๆ ที่จะฆ่าและบริการเริ่มต้นใหม่ที่ init คำสั่งคือ:

  • class_reset : หยุดบริการ แต่ช่วยให้สามารถเริ่มต้นใหม่กับ class_start
  • class_start : สตาร์ทบริการ
  • class_stop : หยุดบริการและเพิ่ม SVC_DISABLED ธง บริการหยุดไม่ตอบสนองต่อ class_start

กระแส

มีสี่โฟลว์สำหรับอุปกรณ์ที่เข้ารหัส อุปกรณ์ได้รับการเข้ารหัสเพียงครั้งเดียว จากนั้นทำตามขั้นตอนการบูตตามปกติ

  • เข้ารหัสอุปกรณ์ที่ไม่ได้เข้ารหัสก่อนหน้านี้:
    • เข้ารหัสอุปกรณ์ใหม่ที่มี forceencrypt : การเข้ารหัสบังคับที่บูตครั้งแรก (เริ่มต้นใน Android L)
    • เข้ารหัสอุปกรณ์ที่มีอยู่: การเข้ารหัสที่เริ่มต้นโดยผู้ใช้ (Android K และรุ่นก่อนหน้า)
  • บูตอุปกรณ์ที่เข้ารหัส:
    • การเริ่มอุปกรณ์ที่เข้ารหัสโดยไม่มีรหัสผ่าน: การบูตอุปกรณ์ที่เข้ารหัสซึ่งไม่มีรหัสผ่านที่ตั้งไว้ (เกี่ยวข้องกับอุปกรณ์ที่ใช้ Android 5.0 ขึ้นไป)
    • การเริ่มอุปกรณ์ที่เข้ารหัสด้วยรหัสผ่าน: การบูตอุปกรณ์ที่เข้ารหัสซึ่งมีรหัสผ่านที่ตั้งไว้

นอกเหนือไปจากกระแสเหล่านี้อุปกรณ์ยังสามารถล้มเหลวในการเข้ารหัส /data โฟลว์แต่ละอันมีคำอธิบายโดยละเอียดด้านล่าง

เข้ารหัสอุปกรณ์ใหม่ด้วยforceencrypt

นี่เป็นการบู๊ตครั้งแรกตามปกติสำหรับอุปกรณ์ Android 5.0

  1. ตรวจสอบระบบแฟ้มที่ไม่ได้เข้ารหัสกับ forceencrypt ธง

    /data ไม่ได้เข้ารหัส แต่ความต้องการที่จะเป็นเพราะ forceencrypt เอกสารมัน ยกเลิกการเชื่อมต่อ /data

  2. เริ่มต้นการเข้ารหัส /data

    vold.decrypt = "trigger_encryption" ทริกเกอร์ init.rc ซึ่งจะทำให้ vold ในการเข้ารหัส /data ด้วยรหัสผ่านใด ๆ (ไม่มีการตั้งค่าเพราะควรเป็นอุปกรณ์ใหม่)

  3. เมานต์ tmpfs

    vold เมาท์ tmpfs /data (โดยใช้ตัวเลือกจาก tmpfs ro.crypto.tmpfs_options ) และชุดทรัพย์สิน vold.encrypt_progress 0 vold prepepares tmpfs /data สำหรับการบูตระบบเข้ารหัสและชุดทรัพย์สิน vold.decrypt ที่: trigger_restart_min_framework

  4. นำกรอบงานมาแสดงความคืบหน้า

    เนื่องจากอุปกรณ์แทบไม่มีข้อมูลที่จะเข้ารหัส แถบแสดงความคืบหน้าจึงมักจะไม่ปรากฏขึ้นเนื่องจากการเข้ารหัสเกิดขึ้นเร็วมาก ดู เข้ารหัสอุปกรณ์ที่มีอยู่ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับความคืบหน้าของ UI

  5. เมื่อ /data การเข้ารหัสจะลงกรอบ

    vold ชุด vold.decrypt เพื่อ trigger_default_encryption ซึ่งเริ่ม defaultcrypto บริการ (นี้เริ่มไหลด้านล่างเพื่อติดตั้ง UserData เข้ารหัสเริ่มต้น.) trigger_default_encryption การตรวจสอบชนิดการเข้ารหัสลับเพื่อดูว่า /data มีการเข้ารหัสที่มีหรือไม่มีรหัสผ่าน เนื่องจากอุปกรณ์ Android 5.0 ได้รับการเข้ารหัสในการบูตครั้งแรก จึงไม่ควรตั้งรหัสผ่านไว้ ดังนั้นเราจึงถอดรหัสและการติดตั้ง /data

  6. เมา /data

    init แล้วเมาท์ /data ใน tmpfs ramdisk ใช้พารามิเตอร์ก็หยิบขึ้นมาจาก ro.crypto.tmpfs_options ซึ่งตั้งอยู่ใน init.rc

  7. เริ่มเฟรมเวิร์ก

    ชุด vold เพื่อ trigger_restart_framework ซึ่งยังคงกระบวนการบูตปกติ

เข้ารหัสอุปกรณ์ที่มีอยู่

นี่คือสิ่งที่จะเกิดขึ้นเมื่อคุณเข้ารหัส Android K ที่ไม่ได้เข้ารหัสหรืออุปกรณ์รุ่นก่อนหน้าซึ่งถูกย้ายไปยัง L

กระบวนการนี้เริ่มต้นโดยผู้ใช้และเรียกว่า "การเข้ารหัสแบบแทนที่" ในโค้ด เมื่อผู้ใช้เลือกเข้ารหัสอุปกรณ์ UI จะทำให้แน่ใจว่าแบตเตอรี่ชาร์จเต็มแล้ว และเสียบอะแดปเตอร์ AC อยู่ จึงมีพลังงานเพียงพอที่จะทำกระบวนการเข้ารหัสให้เสร็จสิ้น

คำเตือน: หากอุปกรณ์ที่ไหลออกมาจากอำนาจและปิดลงก่อนที่จะมีการเข้ารหัสเสร็จแฟ้มข้อมูลที่เหลืออยู่ในรัฐที่มีการเข้ารหัสบางส่วน อุปกรณ์จะต้องรีเซ็ตเป็นค่าเริ่มต้นจากโรงงานและข้อมูลทั้งหมดจะสูญหาย

เพื่อเปิดใช้การเข้ารหัส inplace, vold เริ่มห่วงในการอ่านภาคของอุปกรณ์ป้องกันที่จริงแต่ละคนและแล้วเขียนไปยังอุปกรณ์ป้องกันการเข้ารหัสลับ vold การตรวจสอบเพื่อดูว่าภาคมีการใช้งานก่อนที่จะอ่านและเขียนมันซึ่งจะทำให้การเข้ารหัสได้เร็วขึ้นมากในอุปกรณ์ใหม่ที่มีน้อยถึงไม่มีข้อมูล

รัฐของอุปกรณ์: ชุด ro.crypto.state = "unencrypted" และดำเนินการ on nonencrypted init ทริกเกอร์ที่จะดำเนินการบูต

  1. ตรวจสอบรหัสผ่าน

    UI ที่เรียก vold ด้วยคำสั่ง cryptfs enablecrypto inplace ที่ passwd รหัสผ่านล็อคหน้าจอของผู้ใช้

  2. ลงกรอบ

    vold การตรวจสอบข้อผิดพลาดกลับ -1 ถ้ามันไม่สามารถเข้ารหัสและพิมพ์เหตุผลในล็อก ถ้ามันสามารถเข้ารหัสจะกำหนดคุณสมบัติ vold.decrypt เพื่อ trigger_shutdown_framework สาเหตุนี้ init.rc ของการบริการที่ครบวงจรในชั้นเรียน late_start และ main

  3. สร้างส่วนท้ายของการเข้ารหัสลับ
  4. สร้างไฟล์เบรดครัมบ์
  5. รีบูต
  6. ตรวจจับไฟล์เบรดครัมบ์
  7. เริ่มต้นการเข้ารหัส /data

    vold แล้วตั้งค่าการทำแผนที่การเข้ารหัสลับซึ่งจะสร้างการเข้ารหัสลับอุปกรณ์ป้องกันเสมือนว่าแผนที่บนอุปกรณ์ป้องกันจริง แต่เข้ารหัสแต่ละภาคตามที่เขียนและถอดรหัสแต่ละภาคมันเป็นอ่าน vold แล้วสร้างและเขียนออกเมตาดาต้าลับ

  8. ขณะที่กำลังเข้ารหัส ให้เมานต์ tmpfs

    vold เมาท์ tmpfs /data (โดยใช้ตัวเลือกจาก tmpfs ro.crypto.tmpfs_options ) และชุดทรัพย์สิน vold.encrypt_progress 0 vold เตรียม tmpfs /data สำหรับการบูตระบบการเข้ารหัสและการตั้งค่าคุณสมบัติ vold.decrypt ที่: trigger_restart_min_framework

  9. นำกรอบงานมาแสดงความคืบหน้า

    trigger_restart_min_framework ทำให้เกิด init.rc ที่จะเริ่มต้น main ระดับของการบริการ เมื่อกรอบเห็นว่า vold.encrypt_progress ตั้งค่าเป็น 0 ที่จะนำขึ้นแถบความคืบหน้า UI ซึ่ง queries ทรัพย์สินที่ทุกห้าวินาทีและการปรับปรุงแถบความคืบหน้า การปรับปรุงการเข้ารหัสห่วง vold.encrypt_progress ทุกครั้งที่มันเข้ารหัสร้อยละหนึ่งของพาร์ทิชัน

  10. เมื่อ /data จะถูกเข้ารหัสปรับปรุงส่วนท้ายของการเข้ารหัสลับ

    เมื่อ /data จะถูกเข้ารหัสประสบความสำเร็จ vold ล้างธง ENCRYPTION_IN_PROGRESS ในข้อมูลเมตา

    เมื่อปลดล็อกอุปกรณ์สำเร็จแล้ว รหัสผ่านจะถูกใช้ในการเข้ารหัสมาสเตอร์คีย์และส่วนท้ายของการเข้ารหัสลับจะได้รับการอัปเดต

    ถ้ารีบูตล้มเหลวด้วยเหตุผลบางอย่าง vold ชุดทรัพย์สิน vold.encrypt_progress เพื่อ error_reboot_failed และ UI ที่ควรจะแสดงข้อความที่ขอให้ผู้ใช้สามารถกดปุ่มเพื่อรีบูต สิ่งนี้ไม่คาดว่าจะเกิดขึ้น

การเริ่มอุปกรณ์ที่เข้ารหัสด้วยการเข้ารหัสเริ่มต้น

นี่คือสิ่งที่จะเกิดขึ้นเมื่อคุณเปิดเครื่องอุปกรณ์ที่เข้ารหัสโดยไม่มีรหัสผ่าน เพราะอุปกรณ์ที่ใช้ Android 5.0 จะถูกเข้ารหัสในการบูตแรกไม่ควรมีการตั้งรหัสผ่านและดังนั้นนี่คือสถานะการเข้ารหัสเริ่มต้น

  1. ตรวจสอบการเข้ารหัส /data ด้วยรหัสผ่านใด ๆ

    ตรวจสอบว่าอุปกรณ์ Android จะถูกเข้ารหัสเพราะ /data ไม่สามารถติดตั้งและเป็นหนึ่งในธง encryptable หรือ forceencrypt เป็นชุด

    vold ชุด vold.decrypt เพื่อ trigger_default_encryption ซึ่งเริ่ม defaultcrypto บริการ trigger_default_encryption การตรวจสอบชนิดการเข้ารหัสลับเพื่อดูว่า /data มีการเข้ารหัสที่มีหรือไม่มีรหัสผ่าน

  2. ถอดรหัส /data

    สร้าง dm-crypt ที่อุปกรณ์มากกว่าอุปกรณ์ป้องกันเพื่อให้อุปกรณ์พร้อมใช้งาน

  3. เมานต์ /data

    vold แล้วเมาท์ถอดรหัสจริง /data พาร์ทิชันและจากนั้นเตรียมพาร์ทิชันใหม่ ได้กำหนดคุณสมบัติ vold.post_fs_data_done ถึง 0 แล้วชุด vold.decrypt เพื่อ trigger_post_fs_data สาเหตุนี้ init.rc ที่จะทำงานของมัน post-fs-data คำสั่ง พวกเขาจะสร้างไดเรกทอรีใด ๆ ที่จำเป็นหรือการเชื่อมโยงแล้วชุด vold.post_fs_data_done 1

    เมื่อ vold เห็น 1 ในทรัพย์สินที่จะกำหนดคุณสมบัติ vold.decrypt ที่: trigger_restart_framework. สาเหตุนี้ init.rc ที่จะเริ่มให้บริการในระดับ main อีกครั้งและยังเริ่มให้บริการในระดับ late_start เป็นครั้งแรกนับตั้งแต่บูต

  4. เริ่มเฟรมเวิร์ก

    ตอนนี้รองเท้ากรอบทุกบริการที่ใช้ถอดรหัส /data และระบบที่มีความพร้อมสำหรับการใช้งาน

การเริ่มอุปกรณ์ที่เข้ารหัสโดยไม่มีการเข้ารหัสเริ่มต้น

นี่คือสิ่งที่จะเกิดขึ้นเมื่อคุณเปิดเครื่องอุปกรณ์ที่เข้ารหัสซึ่งมีรหัสผ่านที่ตั้งไว้ รหัสผ่านของอุปกรณ์อาจเป็นพิน รูปแบบ หรือรหัสผ่าน

  1. ตรวจจับอุปกรณ์ที่เข้ารหัสด้วยรหัสผ่าน

    ตรวจสอบว่าอุปกรณ์ Android จะถูกเข้ารหัสเพราะธง ro.crypto.state = "encrypted"

    vold ชุด vold.decrypt เพื่อ trigger_restart_min_framework เพราะ /data ถูกเข้ารหัสด้วยรหัสผ่าน

  2. เมานต์ tmpfs

    init ชุดห้าคุณสมบัติเพื่อบันทึกตัวเลือกติดเบื้องต้นได้รับสำหรับ /data กับพารามิเตอร์ที่ส่งผ่านจาก init.rc vold ใช้คุณสมบัติเหล่านี้ในการตั้งค่าการทำแผนที่การเข้ารหัสลับ:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII 8 หลักจำนวนฐานสิบหกนำหน้าด้วย 0x)
  3. เริ่มเฟรมเวิร์กเพื่อขอรหัสผ่าน

    กรอบการเริ่มต้นขึ้นและเห็นว่า vold.decrypt ถูกตั้งค่าให้ trigger_restart_min_framework นี้จะบอกกรอบที่ว่ามันเป็นบูตบน tmpfs /data ดิสก์และความต้องการที่จะได้รับรหัสผ่านผู้ใช้

    อย่างไรก็ตาม อันดับแรก จำเป็นต้องตรวจสอบให้แน่ใจว่าดิสก์ได้รับการเข้ารหัสอย่างถูกต้อง มันจะส่งคำสั่ง cryptfs cryptocomplete เพื่อ vold vold ผลตอบแทน 0 ถ้าเข้ารหัสเสร็จสมบูรณ์, -1 ในข้อผิดพลาดภายในหรือ -2 ถ้าเข้ารหัสไม่เสร็จสมบูรณ์แล้ว vold กำหนดนี้โดยมองในการเข้ารหัสลับข้อมูลเมตาสำหรับ CRYPTO_ENCRYPTION_IN_PROGRESS ธง หากมีการตั้งค่าไว้ กระบวนการเข้ารหัสจะถูกขัดจังหวะ และไม่มีข้อมูลที่ใช้งานได้บนอุปกรณ์ หาก vold กลับข้อผิดพลาด UI ที่ควรจะแสดงข้อความให้กับผู้ใช้ในการรีบูตและโรงงานตั้งค่าอุปกรณ์และให้ผู้ใช้ปุ่มกดจะทำเช่นนั้น

  4. ถอดรหัสข้อมูลด้วยรหัสผ่าน

    เมื่อ cryptfs cryptocomplete จะประสบความสำเร็จแสดงกรอบ UI ที่ขอรหัสผ่านดิสก์ ตรวจสอบ UI รหัสผ่านโดยการส่งคำสั่ง cryptfs checkpw เพื่อ vold ถ้ารหัสผ่านถูกต้อง (ซึ่งถูกกำหนดโดยประสบความสำเร็จในการติดตั้งถอดรหัส /data ที่สถานที่ชั่วคราวแล้ว unmounting มัน) vold บันทึกชื่อของอุปกรณ์ป้องกันถอดรหัสในทรัพย์สินที่ ro.crypto.fs_crypto_blkdev และผลตอบแทน 0 ถึงสถานะของ UI . หากรหัสผ่านไม่ถูกต้อง จะส่งกลับ -1 ไปยัง UI

  5. หยุดเฟรมเวิร์ก

    ทำให้ UI ขึ้นกราฟิกบูตเข้ารหัสลับและเรียก vold กับคำสั่ง cryptfs restart vold ชุดทรัพย์สิน vold.decrypt เพื่อ trigger_reset_main ซึ่งเป็นสาเหตุ init.rc จะทำ class_reset main นี้หยุดบริการทั้งหมดในระดับหลักซึ่งจะช่วยให้ tmpfs /data ที่จะเดินเท้า

  6. เมา /data

    vold แล้วเมาท์ถอดรหัสจริง /data พาร์ทิชันและเตรียมพาร์ทิชันใหม่ (ซึ่งอาจไม่เคยได้รับการจัดทำถ้ามันถูกเข้ารหัสด้วยตัวเลือกที่เช็ดซึ่งไม่ได้รับการสนับสนุนในการเปิดตัวครั้งแรก) ได้กำหนดคุณสมบัติ vold.post_fs_data_done ถึง 0 แล้วชุด vold.decrypt เพื่อ trigger_post_fs_data สาเหตุนี้ init.rc ที่จะทำงานของมัน post-fs-data คำสั่ง พวกเขาจะสร้างไดเรกทอรีใด ๆ ที่จำเป็นหรือการเชื่อมโยงแล้วชุด vold.post_fs_data_done 1 เมื่อ vold เห็น 1 ในทรัพย์สินที่จะกำหนดคุณสมบัติ vold.decrypt เพื่อ trigger_restart_framework สาเหตุนี้ init.rc ที่จะเริ่มให้บริการในระดับ main อีกครั้งและยังเริ่มให้บริการในระดับ late_start เป็นครั้งแรกนับตั้งแต่บูต

  7. เริ่มเต็มกรอบ

    ตอนนี้รองเท้ากรอบทุกบริการที่ใช้ถอดรหัส /data ระบบแฟ้มและระบบพร้อมสำหรับการใช้งาน

ความล้มเหลว

อุปกรณ์ที่ไม่สามารถถอดรหัสลับอาจผิดพลาดด้วยเหตุผลบางประการ อุปกรณ์เริ่มต้นด้วยชุดขั้นตอนปกติในการบู๊ต:

  1. ตรวจจับอุปกรณ์ที่เข้ารหัสด้วยรหัสผ่าน
  2. เมานต์ tmpfs
  3. เริ่มเฟรมเวิร์กเพื่อขอรหัสผ่าน

แต่หลังจากเฟรมเวิร์กเปิดขึ้น อุปกรณ์อาจพบข้อผิดพลาดบางประการ:

  • รหัสผ่านตรงกันแต่ถอดรหัสข้อมูลไม่ได้
  • ผู้ใช้กรอกรหัสผ่านผิด 30 ครั้ง

หากมีข้อผิดพลาดเหล่านี้ไม่ได้รับการแก้ไขให้ผู้ใช้แจ้งให้โรงงานเช็ด:

หาก vold ตรวจพบข้อผิดพลาดระหว่างขั้นตอนการเข้ารหัสและถ้าไม่มีข้อมูลที่ได้ถูกทำลายและยังกรอบที่จะขึ้น vold ชุดทรัพย์สิน vold.encrypt_progress เพื่อ error_not_encrypted UI จะแจ้งให้ผู้ใช้รีบูตและแจ้งเตือนว่ากระบวนการเข้ารหัสไม่เคยเริ่มต้น ถ้าข้อผิดพลาดเกิดขึ้นหลังจากที่กรอบการทำงานที่ได้รับการฉีกขาดลง แต่ก่อนที่จะมี UI แถบความคืบหน้าจะขึ้น vold จะรีบูตระบบ ถ้ารีบูตล้มเหลวมันชุด vold.encrypt_progress เพื่อ error_shutting_down และผลตอบแทน -1; แต่จะไม่มีอะไรจับผิด สิ่งนี้ไม่คาดว่าจะเกิดขึ้น

หาก vold ตรวจพบข้อผิดพลาดระหว่างขั้นตอนการเข้ารหัสจะกำหนด vold.encrypt_progress เพื่อ error_partially_encrypted ผลตอบแทนและ -1 จากนั้น UI ควรแสดงข้อความแจ้งว่าการเข้ารหัสล้มเหลว และให้ปุ่มสำหรับผู้ใช้เพื่อรีเซ็ตอุปกรณ์เป็นค่าเริ่มต้น

การจัดเก็บคีย์ที่เข้ารหัส

คีย์ที่เข้ารหัสจะถูกเก็บไว้ในข้อมูลเมตาของการเข้ารหัสลับ การสำรองข้อมูลฮาร์ดแวร์ดำเนินการโดยใช้ความสามารถในการลงนามของ Trusted Execution Environment (TEE) ก่อนหน้านี้ เราเข้ารหัสมาสเตอร์คีย์ด้วยคีย์ที่สร้างโดยการใช้การเข้ารหัสกับรหัสผ่านของผู้ใช้และเกลือที่เก็บไว้ เพื่อให้คีย์มีความยืดหยุ่นต่อการโจมตีแบบ off-box เราขยายอัลกอริทึมนี้โดยลงนามคีย์ผลลัพธ์ด้วยคีย์ TEE ที่เก็บไว้ ลายเซ็นผลลัพธ์จะกลายเป็นคีย์ความยาวที่เหมาะสมโดยแอปพลิเคชัน scrypt อีกหนึ่งโปรแกรม คีย์นี้จะใช้ในการเข้ารหัสและถอดรหัสมาสเตอร์คีย์ ในการจัดเก็บคีย์นี้:

  1. สร้างคีย์เข้ารหัสดิสก์ 16 ไบต์แบบสุ่ม (DEK) และเกลือ 16 ไบต์
  2. ใช้การเข้ารหัสกับรหัสผ่านผู้ใช้และเกลือเพื่อสร้างคีย์กลางขนาด 32 ไบต์ 1 (IK1)
  3. Pad IK1 ที่มีศูนย์ไบต์เท่ากับขนาดของคีย์ส่วนตัวที่ผูกกับฮาร์ดแวร์ (HBK) โดยเฉพาะอย่างยิ่ง เราใส่เป็น: 00 || IK1 || 00.00 น.; หนึ่งศูนย์ไบต์ 32 IK1 ไบต์ 223 ศูนย์ไบต์
  4. ลงชื่อเบาะ IK1 ด้วย HBK เพื่อสร้าง IK2 256 ไบต์
  5. ใช้ scrypt กับ IK2 และเกลือ (เกลือเดียวกับขั้นตอนที่ 2) เพื่อสร้าง IK3 ขนาด 32 ไบต์
  6. ใช้ 16 ไบต์แรกของ IK3 เป็น KEK และ 16 ไบต์สุดท้ายเป็น IV
  7. เข้ารหัส DEK ด้วย AES_CBC พร้อมคีย์ KEK และเวกเตอร์เริ่มต้น IV

การเปลี่ยนรหัสผ่าน

เมื่อมีการเลือกตั้งผู้ใช้สามารถเปลี่ยนหรือลบรหัสผ่านของพวกเขาในการตั้งค่า, UI ที่จะส่งคำสั่ง cryptfs changepw เพื่อ vold และ vold ใหม่เข้ารหัสคีย์หลักดิสก์ด้วยรหัสผ่านใหม่

คุณสมบัติการเข้ารหัส

vold และ init สื่อสารกับแต่ละอื่น ๆ โดยการตั้งค่าคุณสมบัติ นี่คือรายการคุณสมบัติที่พร้อมใช้งานสำหรับการเข้ารหัส

คุณสมบัติของโวลด์

คุณสมบัติ คำอธิบาย
vold.decrypt trigger_encryption เข้ารหัสไดรฟ์โดยไม่ต้องใช้รหัสผ่าน
vold.decrypt trigger_default_encryption ตรวจสอบไดรฟ์เพื่อดูว่ามีการเข้ารหัสโดยไม่มีรหัสผ่านหรือไม่ หากเป็นเช่นนั้นถอดรหัสและติดตั้งอื่น vold.decrypt เพื่อ trigger_restart_min_framework
vold.decrypt trigger_reset_main ตั้งค่าโดย vold เพื่อปิด UI เพื่อขอรหัสผ่านดิสก์
vold.decrypt trigger_post_fs_data กำหนดโดย Vold เพื่อเตรียม /data กับไดเรกทอรีที่จำเป็น, et al
vold.decrypt trigger_restart_framework กำหนดโดย vold เพื่อเริ่มเฟรมเวิร์กจริงและบริการทั้งหมด
vold.decrypt trigger_shutdown_framework กำหนดโดย vold เพื่อปิดเฟรมเวิร์กแบบเต็มเพื่อเริ่มการเข้ารหัส
vold.decrypt trigger_restart_min_framework กำหนดโดย Vold ที่จะเริ่มต้นแถบความคืบหน้า UI สำหรับการเข้ารหัสหรือถามรหัสผ่านทั้งนี้ขึ้นอยู่กับมูลค่าของ ro.crypto.state
vold.encrypt_progress เมื่อเฟรมเวิร์กเริ่มทำงาน หากมีการตั้งค่าคุณสมบัตินี้ ให้เข้าสู่โหมด UI ของแถบความคืบหน้า
vold.encrypt_progress 0 to 100 UI ของแถบความคืบหน้าควรแสดงชุดค่าเปอร์เซ็นต์
vold.encrypt_progress error_partially_encrypted UI ของแถบความคืบหน้าควรแสดงข้อความว่าการเข้ารหัสล้มเหลว และให้ตัวเลือกแก่ผู้ใช้ในการรีเซ็ตอุปกรณ์เป็นค่าเริ่มต้น
vold.encrypt_progress error_reboot_failed UI ของแถบความคืบหน้าควรแสดงข้อความว่าการเข้ารหัสเสร็จสิ้น และให้ปุ่มผู้ใช้เพื่อรีบูตอุปกรณ์ ข้อผิดพลาดนี้ไม่คาดว่าจะเกิดขึ้น
vold.encrypt_progress error_not_encrypted UI ของแถบความคืบหน้าควรแสดงข้อความแจ้งว่ามีข้อผิดพลาดเกิดขึ้น ไม่มีข้อมูลใดถูกเข้ารหัสหรือสูญหาย และให้ปุ่มผู้ใช้เพื่อรีบูตระบบ
vold.encrypt_progress error_shutting_down UI ของแถบความคืบหน้าไม่ทำงาน ดังนั้นจึงไม่มีความชัดเจนว่าใครจะตอบสนองต่อข้อผิดพลาดนี้ และมันไม่ควรเกิดขึ้นอยู่ดี
vold.post_fs_data_done 0 กำหนดโดย vold เพียงก่อนที่จะตั้ง vold.decrypt เพื่อ trigger_post_fs_data
vold.post_fs_data_done 1 ชุดโดย init.rc หรือ init.rc เพียงหลังจากจบงาน post-fs-data

คุณสมบัติ init

คุณสมบัติ คำอธิบาย
ro.crypto.fs_crypto_blkdev ที่กำหนดโดย vold คำสั่ง checkpw เพื่อใช้ในภายหลังโดย vold คำสั่ง restart
ro.crypto.state unencrypted กำหนดโดย init จะบอกว่าระบบนี้ทำงานอยู่กับที่ไม่ได้เข้ารหัส /data ro.crypto.state encrypted กำหนดโดย init จะบอกว่าระบบนี้จะทำงานด้วยการเข้ารหัส /data

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

คุณสมบัติเหล่านี้ห้าถูกกำหนดโดย init เมื่อพยายามที่จะติด /data ที่มีพารามิเตอร์ผ่านจาก init.rc vold ใช้เหล่านี้ในการตั้งค่าการเข้ารหัสลับการทำแผนที่
ro.crypto.tmpfs_options ชุดโดย init.rc กับตัวเลือก init ควรใช้เมื่อมีการติดตั้ง tmpfs /data ระบบแฟ้ม

เริ่มต้นการกระทำ

on post-fs-data
on nonencrypted
on property:vold.decrypt=trigger_reset_main
on property:vold.decrypt=trigger_post_fs_data
on property:vold.decrypt=trigger_restart_min_framework
on property:vold.decrypt=trigger_restart_framework
on property:vold.decrypt=trigger_shutdown_framework
on property:vold.decrypt=trigger_encryption
on property:vold.decrypt=trigger_default_encryption