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

تشفير القرص الكامل هو عملية ترميز جميع بيانات المستخدم على جهاز 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 بت، ثم يجزّئه باستخدام كلمة مرور تلقائية وقيمة salt مخزّنة. كلمة المرور التلقائية هي: "default_password" ومع ذلك، يتم أيضًا توقيع التجزئة الناتجة من خلال بيئة تنفيذ موثوقة (TEE) (مثل TrustZone)، التي تستخدم تجزئة التوقيع لتشفير المفتاح الرئيسي.

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

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

تتم إدارة التشفير من خلال init وvold. يتم استدعاء initvold، ويضبط 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.

Flows

هناك أربعة مسارات لجهاز مشفَّر. يتم تشفير الجهاز مرة واحدة فقط ثم يتم اتّباع تسلسل بدء التشغيل العادي.

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

  6. تثبيت /data

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

  7. إطار عمل Start

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

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

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

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

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

لتفعيل التشفير الموضعي، يبدأ 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. فك تشفير /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. تثبيت 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. إطار عمل Stop

    تعرض واجهة المستخدم صورة تمهيد تشفير ثم تستدعي vold مع الأمر cryptfs restart. تضبط السمة vold السمة vold.decrypt على trigger_reset_main، ما يؤدي إلى تنفيذ init.rc للإجراء class_reset main. يؤدي ذلك إلى إيقاف جميع الخدمات في الفئة الرئيسية، ما يسمح بإلغاء تحميل /data tmpfs.

  6. تثبيت /data

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

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

إجراءات init

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