تشفير القرص بالكامل هو عملية ترميز جميع بيانات المستخدم على جهاز 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.
خوارزمية التشفير هي معيار التشفير المُطوَّر (AES) 128 بت مع تسلسل كتل التشفير (CBC) وESSIV:SHA256. يتم تشفير المفتاح الرئيسي باستخدام AES بسعة 128 بت من خلال طلبات إلى مكتبة OpenSSL. يجب استخدام 128 بت أو أكثر ل المفتاح (ويكون 256 اختياريًا).
ملاحظة: يمكن لمصنّعي المعدّات الأصلية استخدام مفتاح بسعة 128 بت أو أعلى لتشفير المفتاح الرئيسي.
في إصدار Android 5.0، هناك أربعة أنواع من حالات التشفير:
- تلقائي
- رقم التعريف الشخصي
- كلمة المرور
- نمط
عند التشغيل لأول مرة، ينشئ الجهاز مفتاحًا رئيسيًا مكوّنًا من 128 بت يتم إنشاؤه عشوائيًا، ثم يُشفّره باستخدام كلمة مرور تلقائية وملح مخزّن. كلمة المرور التلقائية هي: "default_password" ومع ذلك، يتم أيضًا توقيع التجزئة الناتجة من خلال بيئة تنفيذ موثوقة (مثل TrustZone)، التي تستخدِم تجزئة للتوقيع من أجل تشفير المفتاح الرئيسي.
يمكنك العثور على كلمة المرور التلقائية المحدّدة في ملف cryptfs.cpp ضمن مشروع Android Open Source Project.
عندما يضبط المستخدم رقم التعريف الشخصي أو كلمة المرور على الجهاز، تتم إعادة تشفير وتخزين مفتاح التشفير الذي يبلغ طوله 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
مشفّرًا باستخدام كلمة مرور أو بدونها. - فك تشفير /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
للمرة الأولى منذ بدء التشغيل. - إطار العمل المُستخدَم لبدء الحملة
الآن، يشغِّل إطار العمل جميع خدماته باستخدام
/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
، ما يؤدي إلى تنفيذinit.rc
للإجراءclass_reset main
. يؤدي ذلك إلى إيقاف جميع الخدمات في الفئة الرئيسية، ما يسمح بإلغاء تركيب 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 على كلمة مرور المستخدم وملح التشفير لإنشاء مفتاح intermediate متوسّط مكوّن من 32 بايت (IK1).
- املأ عنصر 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
الخاصية | الوصف |
---|---|
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