يشير تشفير القرص الكامل إلى تشفير جميع بيانات المستخدم على جهاز 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 أولية.
خوارزمية التشفير هي 128 معيار التشفير المتقدم (AES) مع سلسلة كتلة الرموز (CBC) وESSIV:SHA256. يتم تشفير المفتاح الرئيسي باستخدام معيار AES 128 بت عبر الاتصالات بمكتبة OpenSSL. يجب استخدام 128 بت أو أكثر للمفتاح (وتكون 256 اختيارية).
ملاحظة: يمكن للمصنّعين الأصليين للأجهزة استخدام 128 بت أو أعلى لتشفير المفتاح الرئيسي.
في إصدار Android 5.0، هناك أربعة أنواع من حالات التشفير:
- تلقائي
- رقم التعريف الشخصي
- كلمة المرور
- نمط
عند التشغيل لأول مرة، ينشئ الجهاز مفتاحًا رئيسيًا مكوّنًا من 128 بت يتم إنشاؤه عشوائيًا، ثم يُشفّره باستخدام كلمة مرور تلقائية وملح مخزّن. كلمة المرور التلقائية هي: "default_password" ومع ذلك، يتم أيضًا توقيع التجزئة الناتجة من خلال وحدة معالجة آمنة (TEE) (مثل TrustZone)، التي تستخدِم تجزئة للتوقيع من أجل تشفير المفتاح الرئيسي.
يمكنك العثور على كلمة المرور التلقائية المحدّدة في ملف cryptfs.cpp في "المشروع المفتوح المصدر لنظام Android".
عندما يضبط المستخدم رقم التعريف الشخصي أو كلمة المرور على الجهاز، تتم إعادة تشفير وتخزين مفتاح التشفير الذي يبلغ طوله 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 لأول مرة.
- اكتشاف نظام الملفات غير المشفّر باستخدام علامة
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
. (يؤدي ذلك إلى بدء العملية أدناه لتركيب ملف userdata مشفَّر بشكلٍ تلقائي). يفحصtrigger_default_encryption
نوع التشفير لمعرفة ما إذا كان/data
مشفّرًا باستخدام كلمة مرور أو بدونها. بما أنّ أجهزة Android 5.0 يتم تشفيرها عند التشغيل لأول مرة، يجب عدم ضبط كلمة مرور، لذلك نفك تشفير/data
ونثبّته. - التثبيت
/data
بعد ذلك، يُثبِّت
init
/data
على قرص RAMDisk من tmpfs باستخدام المَعلمات التي يحصل عليها منro.crypto.tmpfs_options
، والتي تم ضبطها فيinit.rc
. - إطار العمل المُستخدَم لبدء الحملة
يضبط
vold
vold.decrypt
علىtrigger_restart_framework
، ما يواصل عملية التمهيد المعتادة .
تشفير جهاز حالي
في ما يلي ما يحدث عند تشفير جهاز Android K أو إصدار سابق غير مشفَّر تم نقله إلى الإصدار L.
يبدأ المستخدم هذه العملية ويُشار إليها في الرمز البرمجي باسم "التشفير الداخلي". عندما يختار أحد المستخدمين تشفير جهاز، تتأكّد واجهة المستخدم من أنّ البطارية مشحونة بالكامل وتوصيل محوّل AC بحيث يتوفّر ما يكفي من الطاقة لإنهاء عملية التشفير.
تحذير: إذا نفدت طاقة الجهاز وتم إيقافه قبل اكتمال عملية التشفير، ستبقى بيانات الملفات مشفَّرة جزئيًا. يجب إعادة ضبط الجهاز على الإعدادات الأصلية وسيتم فقدان جميع البيانات.
لتفعيل ميزة "التشفير أثناء التنقل"، يبدأ 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
إلى بدء فئة الخدماتmain
فيinit.rc
. عندما يرصد إطار العمل أنّه تم ضبط قيمة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
مشفّرًا باستخدام كلمة مرور أو بدونها. - فك تشفير /البيانات
يتم إنشاء جهاز
dm-crypt
فوق الجهاز المكعب كي يصبح الجهاز جاهزًا للاستخدام. - تثبيت /البيانات
بعد ذلك، يُثبِّت
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
أيضًا لأول مرة منذ التشغيل. - بدء إطار العمل
ويشغِّل إطار العمل الآن جميع خدماته باستخدام
/data
الذي تم فك تشفيره، ويصبح النظام جاهزًا للاستخدام.
بدء جهاز مشفَّر بدون التشفير التلقائي
هذا ما يحدث عند تشغيل جهاز مشفّر يحتوي على كلمة مرور محددة. يمكن أن تكون كلمة مرور الجهاز رقم تعريف شخصي أو نقشًا أو كلمة مرور.
- رصد الجهاز المشفَّر باستخدام كلمة مرور
رصد أنّ جهاز Android مشفَّر لأنّ العلامة
ro.crypto.state = "encrypted"
يضبط
vold
vold.decrypt
علىtrigger_restart_min_framework
لأنّ/data
مشفَّر بكلمة مرور. - تثبيت ملفات tmpfs
يضبط
init
خمس خصائص لحفظ خيارات التثبيت الأولية المقدمة لـ/data
باستخدام المعلمات التي يتم تمريرها منinit.rc
. يستخدمvold
هذه السمات لإعداد تعيين العملات المشفّرة:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(رقم سداسي عشري مكوّن من 8 أرقام بترميز ASCII ويسبقه 0x)
- بدء إطار العمل لطلب إدخال كلمة المرور
يبدأ إطار العمل ويلاحظ أنّه تم ضبط
vold.decrypt
علىtrigger_restart_min_framework
. يُعلم هذا الإطار العمل بأنّه يتم التمهيد على قرص tmpfs/data
وأنّه يحتاج إلى الحصول على كلمة مرور المستخدم.أولاً، يجب التأكّد من تشفير القرص بشكل صحيح. ويؤدي ذلك إلى إرسال الأمر
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 في واجهة المستخدم. - إيقاف إطار العمل
تعرض واجهة المستخدم رسمًا بيانيًا لبدء التشفير، ثم تستدعي
vold
باستخدام الأمرcryptfs restart
. تضبطvold
السمةvold.decrypt
علىtrigger_reset_main
، ما يؤدي إلى تنفيذclass_reset main
فيinit.rc
. يؤدي ذلك إلى إيقاف جميع الخدمات في الفئة الرئيسية، ما يسمح بإلغاء تركيب tmpfs/data
. - التثبيت
/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
للمرة الأولى منذ التشغيل. - بدء إطار العمل الكامل
ويشغِّل إطار العمل الآن جميع خدماته باستخدام نظام ملفات
/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 مرة أخرى. يُستخدم بعد ذلك هذا المفتاح لتشفير وفك تشفير المفتاح الرئيسي. لتخزين هذا المفتاح:
- أنشئ مفتاح تشفير قرص عشوائيًا مكوّنًا من 16 بايت وقيمة عشوائية مكوّنة من 16 بايت.
- طبِّق scrypt على كلمة مرور المستخدم والملح لإنشاء مفتاح وسيط بحجم 32 بايت، وهو المفتاح 1 (IK1).
- املأ عنصر IK1 بقيمة صفرية من البايتات حتى يصل حجمه إلى حجم المفتاح الخاص المرتبط بالأجهزة (HBK). على وجه التحديد، نضيف البادئة على النحو التالي: 00 || IK1 || 00..00، أي بايت واحد من الصفر و32 بايت من IK1 و223 بايت من الصفر.
- وقِّع على IK1 مع وضع HBK لإنتاج IK2 بحجم 256 بايت.
- استخدِم سْكرَم على IK2 مع الملح (نفس الملح كما في الخطوة 2) لإنتاج 32 بايت من IK3.
- استخدِم أول 16 بايت من IK3 كدالة KEK، واستخدِم آخر 16 بايت كقيمة IV.
- تشفير 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 مشفّر. |
|
يتم ضبط هذه السمات الخمس من قِبل
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