تشفير القرص الكامل هو عملية ترميز جميع بيانات المستخدم على جهاز 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.
- رصد نظام ملفات غير مشفّر باستخدام العلامة
forceencrypt/dataغير مشفَّر ولكن يجب تشفيره لأنّforceencryptيتطلّب ذلك. إلغاء تحميل/data - بدء التشفير
/dataيؤدي
vold.decrypt = "trigger_encryption"إلى تشغيلinit.rc، ما يؤدي إلى تشفيرvoldلـ/dataبدون كلمة مرور. (لم يتم ضبط أيّ منها لأنّ هذا الجهاز يجب أن يكون جديدًا). - تثبيت tmpfs
تُحمّل
voldنظام ملفات tmpfs/data(باستخدام خيارات tmpfs منro.crypto.tmpfs_options) وتضبط السمةvold.encrypt_progressعلى 0. يُعدّvoldنظام tmpfs/dataلتشغيل نظام مشفّر ويضبط السمةvold.decryptعلى:trigger_restart_min_framework - عرض إطار العمل لإظهار مستوى التقدّم
وبما أنّ الجهاز لا يتضمّن أي بيانات تقريبًا لتشفيرها، لن يظهر شريط التقدّم كثيرًا لأنّ عملية التشفير تتم بسرعة كبيرة. لمزيد من التفاصيل حول واجهة مستخدم تقدّم التشفير، يُرجى الاطّلاع على تشفير جهاز حالي.
- عند تشفير
/data، يجب إزالة إطار العمليضبط
voldقيمةvold.decryptعلىtrigger_default_encryption، ما يؤدي إلى بدء خدمةdefaultcrypto. (يبدأ هذا الإجراء عملية ربط بيانات المستخدم المشفّرة التلقائية الموضّحة أدناه.) تتحقّقtrigger_default_encryptionمن نوع التشفير لمعرفة ما إذا كان/dataمشفّرًا بكلمة مرور أو بدونها. بما أنّ أجهزة Android 5.0 تكون مشفَّرة عند التشغيل لأول مرة، من المفترض ألا تكون هناك كلمة مرور تم ضبطها، لذا سنفك تشفير/dataونحمّله. - تثبيت
/dataبعد ذلك، يتم تحميل
initعلى/dataفي ذاكرة RAMDisk المؤقتة باستخدام المَعلمات التي يتم استردادها منro.crypto.tmpfs_options، والتي يتم ضبطها فيinit.rc. - إطار عمل Start
يضبط
voldقيمةvold.decryptعلىtrigger_restart_framework، ما يؤدي إلى استمرار عملية التشغيل المعتادة.
تشفير جهاز حالي
يحدث ذلك عند تشفير جهاز Android K أو إصدار أقدم غير مشفّر تم نقل بياناته إلى الإصدار L.
تتم هذه العملية بمبادرة من المستخدم ويُشار إليها باسم "التشفير الموضعي" في الرمز. عندما يختار المستخدم تشفير جهاز، تتأكّد واجهة المستخدم من أنّ البطارية مشحونة بالكامل وأنّ محوّل التيار المتردد موصول بمصدر الطاقة لضمان توفّر طاقة كافية لإكمال عملية التشفير.
تحذير: إذا نفدت طاقة الجهاز وأُغلق قبل انتهاء عملية التشفير، ستظل بيانات الملفات في حالة مشفّرة جزئيًا. يجب إعادة ضبط الجهاز على الإعدادات الأصلية، وسيتم فقدان جميع البيانات.
لتفعيل التشفير الموضعي، يبدأ vold حلقة لقراءة كل قطاع من قطاعات جهاز الحظر الفعلي ثم كتابته إلى جهاز الحظر المشفّر. تتحقّق vold مما إذا كان أحد القطاعات قيد الاستخدام قبل قراءته وكتابته، ما يجعل عملية التشفير أسرع بكثير على جهاز جديد لا يحتوي على بيانات أو يحتوي على القليل منها.
حالة الجهاز: اضبط ro.crypto.state = "unencrypted"
ونفِّذ مشغّل on nonencrypted init لمواصلة عملية التشغيل.
- التحقّق من كلمة المرور
تستدعي واجهة المستخدم
voldباستخدام الأمرcryptfs enablecrypto inplaceحيثpasswdهي كلمة مرور شاشة القفل الخاصة بالمستخدم. - إزالة الإطار
تتحقّق
voldمن الأخطاء، وتعرض القيمة -1 إذا تعذّر التشفير، وتطبع سببًا في السجلّ. إذا كان بإمكانه التشفير، يضبط السمةvold.decryptعلىtrigger_shutdown_framework. يؤدي ذلك إلى توقّفinit.rcعن تقديم الخدمات في الفئتَينlate_startوmain. - إنشاء تذييل تشفير
- إنشاء ملف فتات الخبز
- إعادة التشغيل
- رصد ملف شريط التنقّل
- بدء التشفير
/dataثم
voldيضبط عملية ربط التشفير، ما يؤدي إلى إنشاء جهاز تشفير افتراضي يرتبط بجهاز التشفير الفعلي، ولكنّه يشفّر كل قطاع عند كتابته، ويزيل تشفير كل قطاع عند قراءته.voldثم ينشئ البيانات الوصفية الخاصة بالعملات المشفّرة ويكتبها. - أثناء التشفير، قم بتثبيت tmpfs
voldيركّب نظام ملفات tmpfs/data(باستخدام خيارات tmpfs منro.crypto.tmpfs_options) ويضبط السمةvold.encrypt_progressعلى 0. تجهّزvoldنظام الملفات المؤقتة tmpfs/dataلبدء تشغيل نظام مشفّر وتضبط الخاصيةvold.decryptعلى:trigger_restart_min_framework - عرض إطار العمل لإظهار مستوى التقدّم
تتسبّب
trigger_restart_min_frameworkفي أن تبدأinit.rcفئة الخدماتmain. عندما يلاحظ إطار العمل أنّ قيمةvold.encrypt_progressمضبوطة على 0، يعرض واجهة مستخدم شريط التقدّم، والتي تستعلم عن هذه السمة كل خمس ثوانٍ وتعدّل شريط التقدّم. يتم تعديل حلقة التشفيرvold.encrypt_progressفي كل مرة يتم فيها تشفير نسبة مئوية أخرى من القسم. - عندما يتم تشفير
/data، عدِّل تذييل التشفيرعند تشفير
/dataبنجاح، يزيلvoldالعلامةENCRYPTION_IN_PROGRESSمن البيانات الوصفية.عند فتح قفل الجهاز بنجاح، يتم استخدام كلمة المرور لتشفير المفتاح الرئيسي وتعديل التذييل المشفر.
إذا تعذّرت إعادة التشغيل لسبب ما، تضبط
voldالسمةvold.encrypt_progressعلىerror_reboot_failed، ويجب أن تعرض واجهة المستخدم رسالة تطلب من المستخدم الضغط على زر لإعادة التشغيل. ومن غير المتوقّع حدوث ذلك أبدًا.
بدء تشغيل جهاز مشفَّر باستخدام التشفير التلقائي
يحدث ذلك عند تشغيل جهاز مشفّر بدون كلمة مرور. بما أنّ أجهزة Android 5.0 تكون مشفَّرة عند التشغيل لأول مرة، من المفترض ألا يكون هناك كلمة مرور تم ضبطها، وبالتالي تكون هذه هي حالة التشفير التلقائي.
- رصد ملف
/dataمشفّر بدون كلمة مروررصد أنّ جهاز Android مشفّر لأنّه لا يمكن تحميل
/dataوتم ضبط أحد العلامتَينencryptableأوforceencrypt.يضبط
voldقيمةvold.decryptعلىtrigger_default_encryption، ما يؤدي إلى بدء خدمةdefaultcrypto. يتحقّقtrigger_default_encryptionمن نوع التشفير لمعرفة ما إذا كان/dataمشفّرًا بكلمة مرور أو بدونها. - فك تشفير /data
يتم إنشاء جهاز
dm-cryptفوق جهاز الحظر ليكون الجهاز جاهزًا للاستخدام. - تثبيت /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للمرة الأولى منذ بدء التشغيل. - إطار عمل Start
يبدأ إطار العمل الآن تشغيل جميع خدماته باستخدام
/dataالذي تم فك تشفيره، ويصبح النظام جاهزًا للاستخدام.
بدء تشغيل جهاز مشفَّر بدون تشفير تلقائي
في ما يلي ما يحدث عند بدء تشغيل جهاز مشفّر تم ضبط كلمة مرور له. يمكن أن تكون كلمة مرور الجهاز رقم تعريف شخصي أو نقشًا أو كلمة مرور.
- رصد جهاز مشفَّر باستخدام كلمة مرور
رصد أنّ جهاز Android مشفَّر لأنّ العلامة
ro.crypto.state = "encrypted"يضبط
voldقيمةvold.decryptعلىtrigger_restart_min_frameworkلأنّ/dataمشفَّر بكلمة مرور. - تثبيت tmpfs
تضبط
initخمس خصائص لحفظ خيارات التحميل الأولية المحدّدة لـ/dataمع المَعلمات التي تم تمريرها منinit.rc. تستخدمvoldهذه الخصائص لإعداد عملية ربط العملات المشفّرة:ro.crypto.fs_typero.crypto.fs_real_blkdevro.crypto.fs_mnt_pointro.crypto.fs_optionsro.crypto.fs_flags(رقم سداسي عشري مكوّن من 8 أرقام ASCII مسبوقًا بـ 0x)
- بدء إطار العمل لطلب كلمة المرور
يبدأ إطار العمل ويلاحظ أنّ قيمة
vold.decryptمضبوطة علىtrigger_restart_min_framework. يُعلم ذلك إطار العمل بأنّه يتم تشغيله على قرص/datatmpfs ويجب الحصول على كلمة مرور المستخدم.ولكن يجب أولاً التأكّد من أنّ القرص قد تم تشفيره بشكل صحيح. يرسل هذا التطبيق الأمر
cryptfs cryptocompleteإلىvold. تعرضvoldالقيمة 0 إذا تم التشفير بنجاح، أو -1 في حال حدوث خطأ داخلي، أو -2 إذا لم يتم التشفير بنجاح. تحدّد السمةvoldذلك من خلال البحث في البيانات الوصفية للتشفير عن العلامةCRYPTO_ENCRYPTION_IN_PROGRESS. في حال ضبطها، يعني ذلك أنّه تم إيقاف عملية التشفير مؤقتًا، ولا تتوفّر أي بيانات قابلة للاستخدام على الجهاز. إذا عرضت الدالةvoldخطأً، يجب أن تعرض واجهة المستخدم رسالة للمستخدم لإعادة تشغيل الجهاز وإعادة ضبطه على الإعدادات الأصلية، وأن تمنحه زرًا للضغط عليه لتنفيذ ذلك. - فك تشفير البيانات باستخدام كلمة المرور
بعد نجاح عملية
cryptfs cryptocomplete، يعرض إطار العمل واجهة مستخدم تطلب كلمة مرور القرص. تتحقّق واجهة المستخدم من كلمة المرور من خلال إرسال الأمرcryptfs checkpwإلىvold. إذا كانت كلمة المرور صحيحة (ويتم تحديد ذلك من خلال تركيب/dataالذي تم فك تشفيره بنجاح في موقع مؤقت، ثم إلغاء تركيبه)، سيحفظvoldاسم جهاز الحظر الذي تم فك تشفيره في السمةro.crypto.fs_crypto_blkdevويعرض الحالة 0 في واجهة المستخدم. إذا كانت كلمة المرور غير صحيحة، سيتم عرض القيمة -1 في واجهة المستخدم. - إطار عمل Stop
تعرض واجهة المستخدم صورة تمهيد تشفير ثم تستدعي
voldمع الأمرcryptfs restart. تضبط السمةvoldالسمةvold.decryptعلىtrigger_reset_main، ما يؤدي إلى تنفيذinit.rcللإجراءclass_reset main. يؤدي ذلك إلى إيقاف جميع الخدمات في الفئة الرئيسية، ما يسمح بإلغاء تحميل/datatmpfs. - تثبيت
/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للمرة الأولى منذ بدء التشغيل. - بدء الإطار الكامل
يبدأ إطار العمل الآن تشغيل جميع خدماته باستخدام نظام الملفات
/dataالذي تم فك تشفيره، ويصبح النظام جاهزًا للاستخدام.
تعذَّر إتمام العملية.
قد يتعذّر فك تشفير جهاز لعدة أسباب. يبدأ الجهاز بالسلسلة العادية من خطوات التشغيل:
- رصد جهاز مشفّر باستخدام كلمة مرور
- تثبيت tmpfs
- بدء إطار العمل لطلب كلمة المرور
ولكن بعد فتح الإطار، قد يواجه الجهاز بعض الأخطاء:
- تطابُق كلمة المرور ولكن يتعذّر فك تشفير البيانات
- إدخال المستخدم كلمة مرور خاطئة 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 مرة أخرى. ويُستخدَم هذا المفتاح بعد ذلك لتشفير المفتاح الرئيسي وفك تشفيره. لتخزين هذا المفتاح:
- إنشاء مفتاح تشفير قرص (DEK) عشوائي بحجم 16 بايت وقيمة عشوائية بحجم 16 بايت
- طبِّق خوارزمية scrypt على كلمة مرور المستخدم ورمز التشفير لإنشاء مفتاح وسيط 1 (IK1) بحجم 32 بايت.
- أضِف وحدات بايت صفرية إلى IK1 ليصبح بحجم المفتاح الخاص المرتبط بالأجهزة (HBK). على وجه التحديد، نستخدم التعبئة على النحو التالي: 00 || IK1 || 00..00؛ بايت واحد من الأصفار، و32 بايت من IK1، و223 بايت من الأصفار.
- وقِّع IK1 المعبّأ باستخدام HBK لإنشاء IK2 بحجم 256 بايت.
- طبِّق scrypt على IK2 والملح (الملح نفسه المستخدَم في الخطوة 2) لإنتاج IK3 بحجم 32 بايت.
- استخدِم أول 16 بايت من IK3 كـ KEK وآخر 16 بايت كـ IV.
- تشفير مفتاح تشفير البيانات (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 مشفّر. |
|
يتم ضبط هذه الخصائص الخمس من خلال
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