تشفير القرص الكامل هو عملية ترميز جميع بيانات المستخدم على جهاز 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
.
يتم استدعاء init
vold
، ويضبط 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_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
. يُعلم ذلك إطار العمل بأنّه يتم تشغيله على قرص/data
tmpfs ويجب الحصول على كلمة مرور المستخدم.ولكن يجب أولاً التأكّد من أنّ القرص قد تم تشفيره بشكل صحيح. يرسل هذا التطبيق الأمر
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
. يؤدي ذلك إلى إيقاف جميع الخدمات في الفئة الرئيسية، ما يسمح بإلغاء تحميل/data
tmpfs. - تثبيت
/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