وتشفير القرص الكامل هو عملية ترميز جميع بيانات المستخدم على جهاز Android باستخدام بمفتاح مشفّر. بعد تشفير الجهاز، يتم تشفير جميع البيانات التي أنشأها المستخدم بتشفيره تلقائيًا قبل وضعه على القرص وكافة فك تشفير البيانات تلقائيًا قبل إعادتها إلى عملية الاتصال.
تم تقديم ميزة "تشفير القرص الكامل" في Android 4.4، ولكنّ Android 5.0 أضاف الميزات الجديدة التالية:
- تم إنشاء تشفير سريع لا يفكّر إلا الكتل المستخدَمة في قسم البيانات لتجنُّب استغراق عملية التشغيل الأولى وقتًا طويلاً. أنظمة الملفات ext4 وf2fs فقط تستخدم حاليًا التشفير السريع.
- تمت إضافة
forceencrypt
علامة fstab لتشفيرها عند التشغيل لأول مرة. - تمت إضافة إمكانية استخدام الأنماط وميزة التشفير بدون كلمة مرور.
- تمت إضافة مساحة تخزين تعتمد على الأجهزة لمفتاح التشفير باستخدام برنامج "موثوق" إمكانية توقيع بيئة التنفيذ (TEE) (على سبيل المثال في TrustZone) راجِع القسم تخزين المفتاح المشفّر لمزيد من المعلومات التفاصيل.
تحذير: في الأجهزة التي تمت ترقيتها إلى Android 5.0 ثم تم تشفيرها، يمكن إعادة ضبطها على الإعدادات الأصلية لتكون غير مشفَّرة. إصدار Android 5.0 الجديد لا يمكن إرجاع الأجهزة التي تم تشفيرها عند التشغيل الأول إلى حالة غير مشفرة.
آلية عمل ميزة "تشفير القرص بالكامل" في 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" ومع ذلك، يتم أيضًا توقيع التجزئة الناتجة من خلال بيئة التنفيذ الموثوقة (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
الخدمة. (يبدأ هذا التدفق أدناه لتركيب بيانات المستخدم المشفّرة التلقائية). تحقّق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
يتسبب في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
" فوق الجهاز المحظور حتى يتم إنشاء الجهاز. جاهزة للاستخدام. - تثبيت /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
. يؤدي هذا الإجراء إلى إيقاف جميع الخدمات. في الفئة الرئيسية، ما يسمح بإلغاء تثبيت/data
في tmpfs. - التثبيت
/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 بايت (DEK) وذاكرة تخزين عشوائية قدرها 16 بايت.
- استخدِم خوارزمية التشفير على كلمة مرور المستخدم والبيانات العشوائية لإنتاج وحدة وسيطة بحجم 32 بايت. المفتاح 1 (IK1).
- Pad 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 على run_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