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

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

تم طرح ميزة "تشفير القرص الكامل" في Android 4.4، ولكن تم تقديم الميزات الجديدة التالية في Android 5.0:

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

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

طريقة عمل ميزة "تشفير القرص الكامل" في Android

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

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

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

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

  • المظهر التلقائي
  • رقم التعريف الشخصي
  • كلمة المرور
  • نقش

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

يمكنك العثور على كلمة المرور التلقائية المحدّدة في ملف cryptfs.cpp ضمن مشروع مفتوح المصدر لنظام Android.

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

تتم إدارة التشفير من خلال init وvold. يتم استدعاء init،vold ويضبط vold الخصائص لتفعيل الأحداث في init. تستند أجزاء أخرى من النظام إلى الخصائص لتنفيذ مهام مثل عرض حالة التقرير أو طلب كلمة مرور أو طلب إعادة الضبط على الإعدادات الأصلية في حال حدوث خطأ فادح. لاستخدام ميزات التشفير في vold، يستخدِم النظام أداة سطر الأوامر vdc مع الأوامر cryptfs التالية: checkpw وrestart وenablecrypto وchangepw وcryptocomplete وverifypw وsetfield وgetfield وmountdefaultencrypted وgetpwtype وgetpw وclearpw.

لتشفير أو فك تشفير أو محو بيانات /data، يجب ألا يكون /data مثبّتًا. ومع ذلك، لعرض أي واجهة مستخدم، يجب بدء تشغيل إطار العمل، ويتطلّب إطار العمل /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 والإصدارات الأقدم)
  • تشغيل جهاز مشفَّر:
    • بدء تشغيل جهاز مشفّر بدون كلمة مرور: بدء تشغيل جهاز مشفّر لم يتم ضبط كلمة مرور له (ينطبق ذلك على الأجهزة التي تعمل بالإصدار 5.0 من نظام التشغيل Android والإصدارات الأحدث).
    • بدء تشغيل جهاز مشفّر باستخدام كلمة مرور: عملية بدء تشغيل جهاز مشفّر تم ضبط كلمة مرور له.

بالإضافة إلى هذه العمليات، قد يتعذّر على الجهاز أيضًا تشفير /data. يتم شرح كل مسار من المسارات بالتفصيل أدناه.

تشفير جهاز جديد باستخدام forceencrypt

هذه هي عملية التشغيل الأولى العادية لجهاز Android 5.0.

  1. رصد نظام ملفات غير مشفَّر باستخدام العلامة forceencrypt

    /data غير مشفَّر ولكن يجب تشفيره لأنّ forceencrypt يتطلّب ذلك. إلغاء تحميل /data

  2. بدء التشفير /data

    يؤدي vold.decrypt = "trigger_encryption" إلى تشغيل init.rc، ما يؤدي إلى تشفير vold لـ /data بدون كلمة مرور. (لم يتم ضبط أي خيار لأنّ هذا الجهاز يجب أن يكون جديدًا).

  3. Mount tmpfs

    تُحمّل 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. إطار عمل Start

    يضبط vold قيمة vold.decrypt على trigger_restart_framework، ما يؤدي إلى استمرار عملية التشغيل المعتادة.

تشفير جهاز حالي

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

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

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

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

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

  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 نظام الملفات المؤقتة /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. فك تشفير /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. إطار عمل Start

    يبدأ إطار العمل الآن تشغيل جميع خدماته باستخدام /data الذي تم فك تشفيره، ويصبح النظام جاهزًا للاستخدام.

بدء تشغيل جهاز مشفَّر بدون تشفير تلقائي

يحدث ذلك عند بدء تشغيل جهاز مشفّر تم ضبط كلمة مرور له. يمكن أن تكون كلمة مرور الجهاز رقم تعريف شخصي أو نقشًا أو كلمة مرور.

  1. رصد جهاز مشفَّر باستخدام كلمة مرور

    رصد أنّ جهاز Android مشفَّر لأنّ العلامة ro.crypto.state = "encrypted"

    يضبط vold قيمة vold.decrypt على trigger_restart_min_framework لأنّ /data مشفَّر بكلمة مرور.

  2. Mount 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 (رقم سداسي عشري مكوّن من 8 أرقام ASCII مسبوقًا بـ 0x)
  3. بدء إطار العمل لطلب كلمة المرور

    يبدأ إطار العمل ويلاحظ أنّ قيمة vold.decrypt مضبوطة على trigger_restart_min_framework. يُعلم ذلك إطار العمل بأنّه يتم تشغيله على قرص /data tmpfs وأنّه يحتاج إلى الحصول على كلمة مرور المستخدم.

    ولكن يجب أولاً التأكّد من أنّ القرص قد تم تشفيره بشكل صحيح. يرسل هذا التطبيق الأمر 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. يؤدي ذلك إلى إيقاف جميع الخدمات في الفئة الرئيسية، ما يسمح بإلغاء تحميل /data tmpfs.

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

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

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

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

  1. إنشاء مفتاح تشفير قرص (DEK) عشوائي بطول 16 بايت وملح بطول 16 بايت
  2. طبِّق خوارزمية scrypt على كلمة مرور المستخدم وعبارة التشفير لإنشاء مفتاح وسيط 1 (IK1) بحجم 32 بايت.
  3. أضِف وحدات بايت صفرية إلى 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).

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

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

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

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

Vold properties

الخاصية الوصف
vold.decrypt trigger_encryption تشفير محرك الأقراص بدون كلمة مرور
vold.decrypt trigger_default_encryption تحقَّق من محرك الأقراص لمعرفة ما إذا كان مشفَّرًا بدون كلمة مرور. إذا كان الأمر كذلك، يجب فك تشفيرها وتثبيتها، وإلا اضبط قيمة vold.decrypt على trigger_restart_min_framework.
vold.decrypt trigger_reset_main يتم ضبط هذا الخيار من خلال vold لإيقاف واجهة المستخدم التي تطلب كلمة مرور القرص.
vold.decrypt trigger_post_fs_data يتم ضبطها بواسطة vold لإعداد /data مع الدلائل الضرورية وما إلى ذلك.
vold.decrypt trigger_restart_framework يتم ضبطها بواسطة vold لبدء إطار العمل الحقيقي وجميع الخدمات.
vold.decrypt trigger_shutdown_framework يتم ضبطها من خلال vold لإيقاف إطار العمل بالكامل لبدء التشفير.
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.

init properties

الخاصية الوصف
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