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

تشفير القرص بالكامل هو عملية ترميز جميع بيانات المستخدم على جهاز 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.

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

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

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

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

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

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

عندما يضبط المستخدم رقم التعريف الشخصي أو كلمة المرور على الجهاز، تتم إعادة تشفير وتخزين مفتاح التشفير الذي يبلغ طوله 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. فك تشفير ‎ /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 (رقم سداسي عشري مكوّن من 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، ما يؤدي إلى تنفيذ 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. تطلب واجهة المستخدم من المستخدم إعادة تشغيل الجهاز وتُعلِمه بأنّ عملية التشفير لم تبدأ أبدًا. إذا حدث الخطأ بعد إزالة الإطار، ولكن قبل ظهور واجهة مستخدم شريط التقدم، يعيد 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 على كلمة مرور المستخدم وملح التشفير لإنشاء مفتاح intermediate متوسّط مكوّن من 32 بايت (IK1).
  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

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