تشفير القرص بالكامل

تشفير القرص بالكامل هو عملية تشفير جميع بيانات المستخدم على جهاز Android باستخدام مفتاح مشفر. بمجرد تشفير الجهاز، يتم تشفير جميع البيانات التي أنشأها المستخدم تلقائيًا قبل تثبيتها على القرص، وتقوم جميع القراءات بفك تشفير البيانات تلقائيًا قبل إعادتها إلى عملية الاستدعاء.

تم تقديم تشفير القرص بالكامل لنظام Android في الإصدار 4.4، لكن Android 5.0 قدم هذه الميزات الجديدة:

  • تم إنشاء تشفير سريع، والذي يقوم فقط بتشفير الكتل المستخدمة في قسم البيانات لتجنب استغراق التمهيد الأول وقتًا طويلاً. أنظمة الملفات ext4 وf2fs فقط هي التي تدعم حاليًا التشفير السريع.
  • تمت إضافة علامة forceencrypt fstab للتشفير عند التمهيد الأول.
  • تمت إضافة دعم للأنماط والتشفير بدون كلمة مرور.
  • تمت إضافة تخزين مدعوم بالأجهزة لمفتاح التشفير باستخدام إمكانية التوقيع الخاصة ببيئة التنفيذ الموثوقة (TEE) (كما هو الحال في TrustZone). راجع تخزين المفتاح المشفر لمزيد من التفاصيل.

تنبيه: قد يتم إرجاع الأجهزة التي تمت ترقيتها إلى Android 5.0 ثم تم تشفيرها إلى حالة غير مشفرة عن طريق إعادة ضبط بيانات المصنع. لا يمكن إرجاع أجهزة Android 5.0 الجديدة المشفرة عند التشغيل الأول إلى حالة غير مشفرة.

كيف يعمل تشفير القرص الكامل لنظام Android

يعتمد تشفير القرص بالكامل لنظام Android على dm-crypt ، وهي إحدى ميزات kernel التي تعمل على طبقة جهاز الكتلة. ولهذا السبب، يعمل التشفير مع Embedded MultiMediaCard ( eMMC) وأجهزة الفلاش المشابهة التي تقدم نفسها للنواة كأجهزة كتلة. التشفير غير ممكن مع YAFFS، الذي يتحدث مباشرة إلى شريحة فلاش NAND الخام.

خوارزمية التشفير هي 128 معيار تشفير متقدم (AES) مع تسلسل كتلة التشفير (CBC) وESSIV:SHA256. يتم تشفير المفتاح الرئيسي باستخدام AES 128 بت عبر الاتصال بمكتبة OpenSSL. يجب عليك استخدام 128 بت أو أكثر للمفتاح (مع كون 256 اختياريًا).

ملاحظة: يمكن لمصنعي المعدات الأصلية استخدام 128 بت أو أعلى لتشفير المفتاح الرئيسي.

في إصدار Android 5.0، هناك أربعة أنواع من حالات التشفير:

  • تقصير
  • دبوس
  • كلمة المرور
  • نمط

عند التشغيل الأول، يقوم الجهاز بإنشاء مفتاح رئيسي 128 بت بشكل عشوائي ثم يقوم بتجزئته باستخدام كلمة مرور افتراضية وملح مخزن. كلمة المرور الافتراضية هي: "default_password" ومع ذلك، يتم أيضًا توقيع التجزئة الناتجة من خلال TEE (مثل TrustZone)، والتي تستخدم تجزئة التوقيع لتشفير المفتاح الرئيسي.

يمكنك العثور على كلمة المرور الافتراضية المحددة في ملف Android Open Source Project cryptfs.cpp .

عندما يقوم المستخدم بتعيين رقم التعريف الشخصي/المرور أو كلمة المرور على الجهاز، تتم إعادة تشفير وتخزين مفتاح 128 بت فقط. (على سبيل المثال، لا تؤدي تغييرات رقم التعريف الشخصي/التمرير/النمط للمستخدم إلى إعادة تشفير بيانات المستخدم.) لاحظ أن الجهاز المُدار قد يخضع لقيود رقم التعريف الشخصي أو النمط أو كلمة المرور.

تتم إدارة التشفير بواسطة init و vold . يقوم init باستدعاء vold ، ويقوم vold بتعيين الخصائص لتشغيل الأحداث في init. تنظر أجزاء أخرى من النظام أيضًا إلى الخصائص لإجراء مهام مثل حالة التقرير أو طلب كلمة مرور أو المطالبة بإعادة ضبط المصنع في حالة حدوث خطأ فادح. لاستدعاء ميزات التشفير في vold ، يستخدم النظام أوامر cryptfs لأداة سطر الأوامر vdc : 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. جبل تمبفس

    يقوم vold بتحميل tmpfs /data (باستخدام خيارات tmpfs من ro.crypto.tmpfs_options ) ويقوم بتعيين الخاصية vold.encrypt_progress على 0. يقوم vold بإعداد tmpfs /data لتشغيل نظام مشفر ويضبط الخاصية vold.decrypt على: trigger_restart_min_framework

  4. طرح الإطار لإظهار التقدم

    نظرًا لأن الجهاز لا يحتوي فعليًا على أي بيانات لتشفيرها، فلن يظهر شريط التقدم فعليًا في كثير من الأحيان لأن التشفير يحدث بسرعة كبيرة. راجع تشفير جهاز موجود للحصول على مزيد من التفاصيل حول واجهة مستخدم التقدم.

  5. عندما يتم تشفير /data ، قم بإنزال الإطار

    يقوم vold بتعيين vold.decrypt على trigger_default_encryption الذي يبدأ خدمة defaultcrypto . (يبدأ هذا التدفق أدناه لتثبيت بيانات مستخدم مشفرة افتراضية.) يتحقق trigger_default_encryption من نوع التشفير لمعرفة ما إذا كان /data مشفرة بكلمة مرور أو بدونها. نظرًا لأن أجهزة Android 5.0 مشفرة عند التشغيل الأول، فلا ينبغي تعيين كلمة مرور؛ لذلك نقوم بفك التشفير وتركيب /data .

  6. جبل /data

    يقوم init بعد ذلك بتحميل /data على tmpfs RAMDisk باستخدام المعلمات التي يلتقطها من ro.crypto.tmpfs_options ، والتي تم تعيينها في init.rc

  7. بدء الإطار

    يقوم vold بتعيين vold.decrypt على trigger_restart_framework ، والذي يستمر في عملية التمهيد المعتادة.

تشفير جهاز موجود

هذا ما يحدث عندما تقوم بتشفير جهاز Android K غير مشفر أو جهاز أقدم تم ترحيله إلى L.

يتم بدء هذه العملية بواسطة المستخدم ويشار إليها باسم "التشفير الداخلي" في التعليمات البرمجية. عندما يختار المستخدم تشفير جهاز ما، تتأكد واجهة المستخدم من شحن البطارية بالكامل وتوصيل محول التيار المتردد بحيث تكون هناك طاقة كافية لإنهاء عملية التشفير.

تحذير: إذا نفدت طاقة الجهاز وتم إيقاف تشغيله قبل الانتهاء من التشفير، فسيتم ترك بيانات الملف في حالة مشفرة جزئيًا. يجب إعادة ضبط المصنع للجهاز وسيتم فقدان كافة البيانات.

لتمكين التشفير الموضعي، يبدأ vold حلقة لقراءة كل قطاع من جهاز الكتلة الحقيقي ثم كتابته على جهاز كتلة التشفير. يتحقق vold لمعرفة ما إذا كان القطاع قيد الاستخدام قبل قراءته وكتابته، مما يجعل التشفير أسرع بكثير على جهاز جديد يحتوي على القليل من البيانات أو لا يحتوي على أي بيانات على الإطلاق.

حالة الجهاز : قم بتعيين ro.crypto.state = "unencrypted" وقم بتنفيذ مشغل init on nonencrypted لمواصلة التشغيل.

  1. تحقق من كلمة المرور

    تستدعي واجهة المستخدم 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، فإنه يعرض واجهة مستخدم شريط التقدم، والتي تستعلم عن هذه الخاصية كل خمس ثوانٍ وتقوم بتحديث شريط التقدم. تقوم حلقة التشفير بتحديث vold.encrypt_progress في كل مرة تقوم فيها بتشفير نسبة أخرى من القسم.

  10. عندما يتم تشفير /data ، قم بتحديث تذييل التشفير

    عندما يتم تشفير /data بنجاح، يقوم vold بمسح العلامة ENCRYPTION_IN_PROGRESS في البيانات التعريفية.

    عندما يتم إلغاء قفل الجهاز بنجاح، يتم بعد ذلك استخدام كلمة المرور لتشفير المفتاح الرئيسي ويتم تحديث تذييل التشفير.

    إذا فشلت عملية إعادة التشغيل لسبب ما، يقوم vold بتعيين الخاصية vold.encrypt_progress على error_reboot_failed ويجب أن تعرض واجهة المستخدم رسالة تطلب من المستخدم الضغط على زر لإعادة التشغيل. ومن غير المتوقع أن يحدث هذا على الإطلاق.

بدء تشغيل جهاز مشفر بالتشفير الافتراضي

هذا ما يحدث عند تشغيل جهاز مشفر بدون كلمة مرور. نظرًا لأن أجهزة Android 5.0 يتم تشفيرها عند التشغيل الأول، فلا ينبغي أن تكون هناك كلمة مرور محددة، وبالتالي فإن هذه هي حالة التشفير الافتراضية .

  1. كشف /data المشفرة بدون كلمة مرور

    اكتشف أن جهاز Android مشفر لأنه لا يمكن تحميل /data وتم تعيين إحدى العلامات encryptable أو forceencrypt .

    يقوم vold بتعيين vold.decrypt على trigger_default_encryption ، الذي يبدأ خدمة defaultcrypto . يتحقق trigger_default_encryption من نوع التشفير لمعرفة ما إذا كان /data مشفرًا بكلمة مرور أو بدونها.

  2. فك تشفير / البيانات

    يقوم بإنشاء جهاز dm-crypt على جهاز الحظر بحيث يكون الجهاز جاهزًا للاستخدام.

  3. جبل / البيانات

    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. جبل تمبفس

    يقوم 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 بإرجاع خطأ، فيجب أن تعرض واجهة المستخدم رسالة للمستخدم لإعادة تشغيل الجهاز وإعادة ضبط المصنع، وتمنح المستخدم زرًا للضغط عليه للقيام بذلك.

  4. فك تشفير البيانات بكلمة مرور

    بمجرد نجاح cryptfs cryptocomplete ، يعرض إطار العمل واجهة مستخدم تطلب كلمة مرور القرص. تتحقق واجهة المستخدم من كلمة المرور عن طريق إرسال الأمر cryptfs checkpw إلى vold . إذا كانت كلمة المرور صحيحة (والتي يتم تحديدها عن طريق تحميل /data التي تم فك تشفيرها بنجاح في موقع مؤقت، ثم إلغاء تحميلها)، فسيحفظ vold اسم جهاز الكتلة الذي تم فك تشفيره في الخاصية ro.crypto.fs_crypto_blkdev ويعيد الحالة 0 إلى واجهة المستخدم . إذا كانت كلمة المرور غير صحيحة، فسيتم إرجاع -1 إلى واجهة المستخدم.

  5. وقف الإطار

    تضع واجهة المستخدم رسمًا تمهيديًا للتشفير ثم تستدعي 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. جبل تمبفس
  3. بدء الإطار للمطالبة بكلمة المرور

لكن بعد فتح الإطار قد يواجه الجهاز بعض الأخطاء:

  • كلمة المرور متطابقة ولكن لا يمكنها فك تشفير البيانات
  • يقوم المستخدم بإدخال كلمة مرور خاطئة 30 مرة

إذا لم يتم حل هذه الأخطاء، فاطلب من المستخدم إجراء مسح المصنع :

إذا اكتشف vold خطأ أثناء عملية التشفير، وإذا لم يتم تدمير أي بيانات بعد وكان إطار العمل قيد التشغيل، فسيقوم vold بتعيين الخاصية vold.encrypt_progress إلى error_not_encrypted . تطالب واجهة المستخدم المستخدم بإعادة التشغيل وتنبهه إلى أن عملية التشفير لم تبدأ أبدًا. إذا حدث الخطأ بعد هدم إطار العمل، ولكن قبل رفع واجهة مستخدم شريط التقدم، فسيقوم vold بإعادة تشغيل النظام. إذا فشلت عملية إعادة التشغيل، فسيتم تعيين vold.encrypt_progress على error_shutting_down وإرجاع -1؛ ولكن لن يكون هناك أي شيء للقبض على الخطأ. وهذا ليس من المتوقع أن يحدث.

إذا اكتشف vold خطأ أثناء عملية التشفير، فإنه يقوم بتعيين vold.encrypt_progress على error_partially_encrypted ويعيد -1. يجب أن تعرض واجهة المستخدم بعد ذلك رسالة تفيد بفشل التشفير وتوفر زرًا للمستخدم لإعادة ضبط الجهاز على إعدادات المصنع.

تخزين المفتاح المشفر

يتم تخزين المفتاح المشفر في بيانات تعريف التشفير. يتم تنفيذ دعم الأجهزة باستخدام إمكانية التوقيع الخاصة ببيئة التنفيذ الموثوقة (TEE). في السابق، قمنا بتشفير المفتاح الرئيسي باستخدام مفتاح تم إنشاؤه عن طريق تطبيق scrypt على كلمة مرور المستخدم والملح المخزن. من أجل جعل المفتاح مرنًا ضد الهجمات خارج الصندوق، نقوم بتوسيع هذه الخوارزمية من خلال توقيع المفتاح الناتج بمفتاح TEE مخزن. يتم بعد ذلك تحويل التوقيع الناتج إلى مفتاح طول مناسب من خلال تطبيق آخر من scrypt. ثم يتم استخدام هذا المفتاح لتشفير وفك تشفير المفتاح الرئيسي. لتخزين هذا المفتاح:

  1. قم بإنشاء مفتاح تشفير قرص عشوائي 16 بايت (DEK) وملح 16 بايت.
  2. قم بتطبيق scrypt على كلمة مرور المستخدم والملح لإنتاج مفتاح وسيط 1 (IK1) بحجم 32 بايت.
  3. لوحة IK1 مع صفر بايت لحجم المفتاح الخاص المرتبط بالأجهزة (HBK). على وجه التحديد، نحن نرسم كـ: 00 || IK1 || 00..00; 1 صفر بايت، 32 بايت IK1، 223 صفر بايت.
  4. قم بتوقيع IK1 المبطن مع HBK لإنتاج 256 بايت IK2.
  5. قم بتطبيق scrypt على IK2 والملح (نفس الملح الموجود في الخطوة 2) لإنتاج IK3 بحجم 32 بايت.
  6. استخدم أول 16 بايت من IK3 كـ KEK وآخر 16 بايت كـ IV.
  7. قم بتشفير DEK باستخدام AES_CBC، باستخدام مفتاح KEK، ومتجه التهيئة IV.

تغيير كلمة المرور

عندما يختار المستخدم تغيير كلمة المرور الخاصة به أو إزالتها في الإعدادات، ترسل واجهة المستخدم الأمر cryptfs changepw إلى vold ، ويعيد vold تشفير المفتاح الرئيسي للقرص باستخدام كلمة المرور الجديدة.

خصائص التشفير

يتواصل vold و init مع بعضهما البعض من خلال تحديد الخصائص. فيما يلي قائمة بالخصائص المتاحة للتشفير.

خصائص فولد

ملكية وصف
vold.decrypt trigger_encryption تشفير محرك الأقراص بدون كلمة مرور.
vold.decrypt trigger_default_encryption تحقق من محرك الأقراص لمعرفة ما إذا كان مشفرًا بدون كلمة مرور. إذا كان الأمر كذلك، فقم بفك تشفيره وتثبيته، وإلا قم بتعيين vold.decrypt على مشغل_restart_min_framework.
vold.decrypt trigger_reset_main اضبط بواسطة vol لإيقاف تشغيل واجهة المستخدم التي تطلب كلمة مرور القرص.
vold.decrypt trigger_post_fs_data اضبط بواسطة vold على الإعدادية /data مع الدلائل الضرورية، وآخرون.
vold.decrypt trigger_restart_framework اضبط بواسطة vol لبدء الإطار الحقيقي وجميع الخدمات.
vold.decrypt trigger_shutdown_framework اضبط بواسطة vol لإيقاف تشغيل الإطار الكامل لبدء التشفير.
vold.decrypt trigger_restart_min_framework قم بالتعيين بواسطة vold لبدء واجهة مستخدم شريط التقدم للتشفير أو المطالبة بكلمة المرور، اعتمادًا على قيمة ro.crypto.state .
vold.encrypt_progress عند بدء تشغيل الإطار، إذا تم تعيين هذه الخاصية، فادخل إلى وضع واجهة المستخدم لشريط التقدم.
vold.encrypt_progress 0 to 100 يجب أن تعرض واجهة مستخدم شريط التقدم مجموعة قيمة النسبة المئوية.
vold.encrypt_progress error_partially_encrypted يجب أن تعرض واجهة مستخدم شريط التقدم رسالة تفيد بفشل التشفير، وتمنح المستخدم خيارًا لإعادة ضبط الجهاز على إعدادات المصنع.
vold.encrypt_progress error_reboot_failed يجب أن تعرض واجهة مستخدم شريط التقدم رسالة تفيد بأن التشفير قد اكتمل، وتمنح المستخدم زرًا لإعادة تشغيل الجهاز. ومن غير المتوقع أن يحدث هذا الخطأ.
vold.encrypt_progress error_not_encrypted يجب أن تعرض واجهة مستخدم شريط التقدم رسالة تفيد بحدوث خطأ، ولم يتم تشفير أو فقدان أي بيانات، وتمنح المستخدم زرًا لإعادة تشغيل النظام.
vold.encrypt_progress error_shutting_down واجهة مستخدم شريط التقدم لا تعمل، لذلك ليس من الواضح من سيستجيب لهذا الخطأ. ولا ينبغي أن يحدث ذلك أبدًا على أي حال.
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 .

خصائص الحرف الأول

ملكية وصف
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