وتشفير القرص الكامل هو عملية ترميز جميع بيانات المستخدم على جهاز Android باستخدام بمفتاح مشفّر. بعد تشفير الجهاز، يتم تشفير جميع البيانات التي أنشأها المستخدم بتشفيره تلقائيًا قبل وضعه على القرص وكافة فك تشفير البيانات تلقائيًا قبل إعادتها إلى عملية الاتصال.
تم طرح تشفير القرص الكامل في الإصدار 4.4 من نظام التشغيل Android، بينما تم طرح Android 5.0. الميزات الجديدة التالية:
- تم إنشاء تشفير سريع يشفِّر فقط الوحدات المستخدَمة في قسم البيانات. لتجنب أن يستغرق التشغيل الأول وقتًا طويلاً. لا يتيح نظاما الملفات ext4 وf2fs سوى التشفير السريع.
- تمت إضافة
forceencrypt
العلامة fstab لتشفير البيانات عند أول عملية تشغيل. - تمت إضافة إمكانية استخدام النقوش والتشفير بدون كلمة مرور.
- تمت إضافة مساحة تخزين تعتمد على الأجهزة لمفتاح التشفير باستخدام برنامج "موثوق" إمكانية توقيع بيئة التنفيذ (TEE) (على سبيل المثال في TrustZone) راجِع القسم تخزين المفتاح المشفّر لمزيد من المعلومات التفاصيل.
تنبيه: تمت ترقية الأجهزة إلى الإصدار 5.0 من Android ثم مشفّرًا يمكن أن تتم إعادته إلى حالة غير مشفرة من خلال إعادة الضبط على الإعدادات الأصلية. لا يمكن إعادة الأجهزة الجديدة التي تعمل بالإصدار 5.0 من Android إلى حالتها غير المشفَّرة إذا تم تشفيرها عند أول عملية تشغيل.
آلية عمل ميزة "تشفير القرص بالكامل" في Android
يعتمد تشفير قرص Android الكامل على dm-crypt
، وهو نوع من النواة.
التي تعمل على طبقة جهاز الحظر. بسبب
يعمل التشفير مع بطاقات الوسائط المتعددة
المضمنة (eMMC)
أجهزة فلاش مماثلة تقدم نفسها إلى النواة على أنها
الأجهزة. لا يمكن التشفير باستخدام YAFFS، الذي يتواصل مباشرةً مع شريحة فلاش ملف شخصي
NAND.
خوارزمية التشفير هي 128 Advanced Encryption Standard (AES) الذي يتضمّن تسلسل كتلة التشفير (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.
- رصد نظام الملفات غير المشفَّر باستخدام العلامة
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
على ذاكرة وصول عشوائي tmpfs باستخدام 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
على جهاز التخزين المُجمَّع لكي يكون الجهاز جاهزًا للاستخدام. - تثبيت /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
(رقم ASCII مكوَّن من 8 أرقام مسبوق بـ 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) في السابق، تم تشفير المفتاح الرئيسي باستخدام مفتاح تم إنشاؤه من خلال تطبيق تشفير إلى كلمة مرور المستخدم والبيانات العشوائية المخزنة. لجعل المفتاح مقاومًا للهجمات التي تتم خارج الجهاز، نوسّع هذه الخوارزمية من خلال توقيع المفتاح الناتج باستخدام مفتاح TEE مخزّن. ثم يتم تحويل التوقيع الناتج إلى توقيع طول المفتاح بتطبيق آخر من سكربت. ويُستخدَم هذا المفتاح بعد ذلك لتشفير المفتاح الرئيسي وفك تشفيره. لتخزين هذا المفتاح:
- أنشئ مفتاح تشفير قرص عشوائيًا مكوّنًا من 16 بايت وقيمة عشوائية مكوّنة من 16 بايت.
- طبِّق scrypt على كلمة مرور المستخدم والملح لإنشاء مفتاح وسيط بحجم 32 بايت، وهو المفتاح 1 (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