تشفير القرص بالكامل هو عملية تشفير جميع بيانات المستخدم على جهاز Android باستخدام مفتاح مشفر. بمجرد تشفير الجهاز، يتم تشفير جميع البيانات التي أنشأها المستخدم تلقائيًا قبل تثبيتها على القرص، وتقوم جميع القراءات بفك تشفير البيانات تلقائيًا قبل إعادتها إلى عملية الاستدعاء.
تم تقديم تشفير القرص بالكامل لنظام Android في الإصدار 4.4، لكن Android 5.0 قدم هذه الميزات الجديدة:
- تم إنشاء تشفير سريع، والذي يقوم فقط بتشفير الكتل المستخدمة في قسم البيانات لتجنب استغراق التمهيد الأول وقتًا طويلاً. أنظمة الملفات ext4 وf2fs فقط هي التي تدعم حاليًا التشفير السريع.
- تمت إضافة علامة
forceencrypt
fstab للتشفير عند التمهيد الأول. - تمت إضافة دعم للأنماط والتشفير بدون كلمة مرور.
- تمت إضافة تخزين مدعوم بالأجهزة لمفتاح التشفير باستخدام إمكانية التوقيع الخاصة ببيئة التنفيذ الموثوقة (TEE) (كما هو الحال في TrustZone). راجع تخزين المفتاح المشفر لمزيد من التفاصيل.
تنبيه: قد يتم إرجاع الأجهزة التي تمت ترقيتها إلى Android 5.0 ثم تم تشفيرها إلى حالة غير مشفرة عن طريق إعادة ضبط بيانات المصنع. لا يمكن إرجاع أجهزة Android 5.0 الجديدة المشفرة عند التشغيل الأول إلى حالة غير مشفرة.
كيف يعمل تشفير القرص الكامل لنظام Android
يعتمد تشفير القرص بالكامل لنظام Android على dm-crypt
، وهي إحدى ميزات kernel التي تعمل على طبقة جهاز الكتلة. ولهذا السبب، يعمل التشفير مع Embedded MultiMediaCard ( eMMC) وأجهزة الفلاش المشابهة التي تقدم نفسها للنواة كأجهزة كتلة. التشفير غير ممكن مع YAFFS، الذي يتحدث مباشرة إلى شريحة فلاش NAND الخام.
خوارزمية التشفير هي 128 معيار تشفير متقدم (AES) مع تسلسل كتلة التشفير (CBC) وESSIV:SHA256. يتم تشفير المفتاح الرئيسي باستخدام AES 128 بت عبر الاتصال بمكتبة OpenSSL. يجب عليك استخدام 128 بت أو أكثر للمفتاح (مع كون 256 اختياريًا).
ملاحظة: يمكن لمصنعي المعدات الأصلية استخدام 128 بت أو أعلى لتشفير المفتاح الرئيسي.
في إصدار Android 5.0، هناك أربعة أنواع من حالات التشفير:
- تقصير
- دبوس
- كلمة المرور
- نمط
عند التشغيل الأول، يقوم الجهاز بإنشاء مفتاح رئيسي 128 بت بشكل عشوائي ثم يقوم بتجزئته باستخدام كلمة مرور افتراضية وملح مخزن. كلمة المرور الافتراضية هي: "default_password" ومع ذلك، يتم أيضًا توقيع التجزئة الناتجة من خلال TEE (مثل TrustZone)، والتي تستخدم تجزئة التوقيع لتشفير المفتاح الرئيسي.
يمكنك العثور على كلمة المرور الافتراضية المحددة في ملف Android Open Source Project cryptfs.cpp .
عندما يقوم المستخدم بتعيين رقم التعريف الشخصي/المرور أو كلمة المرور على الجهاز، تتم إعادة تشفير وتخزين مفتاح 128 بت فقط. (على سبيل المثال، لا تؤدي تغييرات رقم التعريف الشخصي/التمرير/النمط للمستخدم إلى إعادة تشفير بيانات المستخدم.) لاحظ أن الجهاز المُدار قد يخضع لقيود رقم التعريف الشخصي أو النمط أو كلمة المرور.
تتم إدارة التشفير بواسطة init
و vold
. يقوم init
باستدعاء vold
، ويقوم vold بتعيين الخصائص لتشغيل الأحداث في init. تنظر أجزاء أخرى من النظام أيضًا إلى الخصائص لإجراء مهام مثل حالة التقرير أو طلب كلمة مرور أو المطالبة بإعادة ضبط المصنع في حالة حدوث خطأ فادح. لاستدعاء ميزات التشفير في vold
، يستخدم النظام أوامر cryptfs
لأداة سطر الأوامر vdc
: checkpw
، restart
، enablecrypto
، changepw
، cryptocomplete
، verifypw
، setfield
، getfield
، mountdefaultencrypted
، getpwtype
، getpw
، و clearpw
.
من أجل تشفير أو فك تشفير أو مسح /data
، يجب عدم تثبيت /data
. ومع ذلك، لإظهار أي واجهة مستخدم (UI)، يجب أن يبدأ إطار العمل ويتطلب إطار العمل /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
بدون كلمة مرور. (لم يتم تعيين أي شيء لأن هذا يجب أن يكون جهازًا جديدًا.) - جبل تمبفس
يقوم
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
على tmpfs RAMDisk باستخدام المعلمات التي يلتقطها منro.crypto.tmpfs_options
، والتي تم تعيينها فيinit.rc
- بدء الإطار
يقوم
vold
بتعيينvold.decrypt
علىtrigger_restart_framework
، والذي يستمر في عملية التمهيد المعتادة.
تشفير جهاز موجود
هذا ما يحدث عندما تقوم بتشفير جهاز Android K غير مشفر أو جهاز أقدم تم ترحيله إلى L.
يتم بدء هذه العملية بواسطة المستخدم ويشار إليها باسم "التشفير الداخلي" في التعليمات البرمجية. عندما يختار المستخدم تشفير جهاز ما، تتأكد واجهة المستخدم من شحن البطارية بالكامل وتوصيل محول التيار المتردد بحيث تكون هناك طاقة كافية لإنهاء عملية التشفير.
تحذير: إذا نفدت طاقة الجهاز وتم إيقاف تشغيله قبل الانتهاء من التشفير، فسيتم ترك بيانات الملف في حالة مشفرة جزئيًا. يجب إعادة ضبط المصنع للجهاز وسيتم فقدان كافة البيانات.
لتمكين التشفير الموضعي، يبدأ vold
حلقة لقراءة كل قطاع من جهاز الكتلة الحقيقي ثم كتابته على جهاز كتلة التشفير. يتحقق vold
لمعرفة ما إذا كان القطاع قيد الاستخدام قبل قراءته وكتابته، مما يجعل التشفير أسرع بكثير على جهاز جديد يحتوي على القليل من البيانات أو لا يحتوي على أي بيانات على الإطلاق.
حالة الجهاز : قم بتعيين ro.crypto.state = "unencrypted"
وقم بتنفيذ مشغل init
on nonencrypted
لمواصلة التشغيل.
- تحقق من كلمة المرور
تستدعي واجهة المستخدم
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
مشفرًا بكلمة مرور أو بدونها. - فك تشفير / البيانات
يقوم بإنشاء جهاز
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
مشفرة بكلمة مرور. - جبل تمبفس
يقوم
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
، والنظام جاهز للاستخدام.
فشل
قد يكون الجهاز الذي فشل في فك تشفيره منحرفًا لعدة أسباب. يبدأ الجهاز بسلسلة الخطوات العادية للتمهيد:
- كشف الجهاز المشفر بكلمة مرور
- جبل تمبفس
- بدء الإطار للمطالبة بكلمة المرور
لكن بعد فتح الإطار قد يواجه الجهاز بعض الأخطاء:
- كلمة المرور متطابقة ولكن لا يمكنها فك تشفير البيانات
- يقوم المستخدم بإدخال كلمة مرور خاطئة 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 بايت (DEK) وملح 16 بايت.
- قم بتطبيق scrypt على كلمة مرور المستخدم والملح لإنتاج مفتاح وسيط 1 (IK1) بحجم 32 بايت.
- لوحة IK1 مع صفر بايت لحجم المفتاح الخاص المرتبط بالأجهزة (HBK). على وجه التحديد، نحن نرسم كـ: 00 || IK1 || 00..00; 1 صفر بايت، 32 بايت IK1، 223 صفر بايت.
- قم بتوقيع IK1 المبطن مع HBK لإنتاج 256 بايت IK2.
- قم بتطبيق scrypt على IK2 والملح (نفس الملح الموجود في الخطوة 2) لإنتاج IK3 بحجم 32 بايت.
- استخدم أول 16 بايت من IK3 كـ KEK وآخر 16 بايت كـ IV.
- قم بتشفير DEK باستخدام AES_CBC، باستخدام مفتاح KEK، ومتجه التهيئة IV.
تغيير كلمة المرور
عندما يختار المستخدم تغيير كلمة المرور الخاصة به أو إزالتها في الإعدادات، ترسل واجهة المستخدم الأمر cryptfs changepw
إلى vold
، ويعيد vold
تشفير المفتاح الرئيسي للقرص باستخدام كلمة المرور الجديدة.
خصائص التشفير
يتواصل vold
و init
مع بعضهما البعض من خلال تحديد الخصائص. فيما يلي قائمة بالخصائص المتاحة للتشفير.
خصائص فولد
ملكية | وصف |
---|---|
vold.decrypt trigger_encryption | تشفير محرك الأقراص بدون كلمة مرور. |
vold.decrypt trigger_default_encryption | تحقق من محرك الأقراص لمعرفة ما إذا كان مشفرًا بدون كلمة مرور. إذا كان الأمر كذلك، فقم بفك تشفيره وتثبيته، وإلا قم بتعيين vold.decrypt على مشغل_restart_min_framework. |
vold.decrypt trigger_reset_main | اضبط بواسطة vol لإيقاف تشغيل واجهة المستخدم التي تطلب كلمة مرور القرص. |
vold.decrypt trigger_post_fs_data | اضبط بواسطة vold على الإعدادية /data مع الدلائل الضرورية، وآخرون. |
vold.decrypt trigger_restart_framework | اضبط بواسطة vol لبدء الإطار الحقيقي وجميع الخدمات. |
vold.decrypt trigger_shutdown_framework | اضبط بواسطة vol لإيقاف تشغيل الإطار الكامل لبدء التشفير. |
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