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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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) في السابق، تم تشفير المفتاح الرئيسي باستخدام مفتاح تم إنشاؤه من خلال تطبيق تشفير إلى كلمة مرور المستخدم والبيانات العشوائية المخزنة. لجعل المفتاح مقاومًا للهجمات التي تتم خارج الجهاز، نوسّع هذه الخوارزمية من خلال توقيع المفتاح الناتج باستخدام مفتاح TEE مخزّن. ثم يتم تحويل التوقيع الناتج إلى توقيع طول المفتاح بتطبيق آخر من سكربت. ويُستخدَم هذا المفتاح بعد ذلك لتشفير المفتاح الرئيسي وفك تشفيره. لتخزين هذا المفتاح:

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