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

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

تم طرح تشفير القرص الكامل لنظام Android في الإصدار 4.4، إلا أن Android 5.0 قدّم الميزات الجديدة التالية:

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

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

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

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

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

  6. التثبيت /data

    بعد ذلك، يُثبِّت init /data على قرص RAMDisk من tmpfs باستخدام المَعلمات التي يحصل عليها من ro.crypto.tmpfs_options، والتي تم ضبطها في init.rc.

  7. إطار العمل المُستخدَم لبدء الحملة

    يضبط 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 على إعداد ملفات tmpfs /data لتشغيل نظام مشفَّر وضبط السمة vold.decrypt على: trigger_restart_min_framework

  9. عرض إطار العمل لإظهار مستوى التقدّم

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

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

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

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

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

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

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

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

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

خصائص Vold

الخاصية الوصف
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 مباشرةً.

سمات الإعداد

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