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

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

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

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

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

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