رمزگذاری فول دیسک فرآیند رمزگذاری تمام داده های کاربر در دستگاه اندرویدی با استفاده از یک کلید رمزگذاری شده است. هنگامی که یک دستگاه رمزگذاری می شود، تمام داده های ایجاد شده توسط کاربر به طور خودکار قبل از انتقال آن به دیسک رمزگذاری می شوند و همه داده ها به طور خودکار قبل از بازگرداندن آنها به فرآیند تماس، رمزگشایی می شوند.
رمزگذاری فول دیسک در نسخه 4.4 به اندروید معرفی شد، اما اندروید 5.0 این ویژگی های جدید را معرفی کرد:
- رمزگذاری سریع ایجاد کرد، که فقط بلوک های استفاده شده در پارتیشن داده را رمزگذاری می کند تا از طولانی شدن زمان بوت اولیه جلوگیری شود. در حال حاضر فقط فایل سیستم های ext4 و f2fs از رمزگذاری سریع پشتیبانی می کنند.
- پرچم
forceencrypt
را برای رمزگذاری در اولین بوت اضافه کرد. - پشتیبانی از الگوها و رمزگذاری بدون رمز عبور اضافه شده است.
- ذخیره سازی سخت افزاری کلید رمزگذاری را با استفاده از قابلیت امضای Trusted Execution Environment (TEE) اضافه کرد (مانند TrustZone). برای جزئیات بیشتر به ذخیره کلید رمزگذاری شده مراجعه کنید.
احتیاط: دستگاههایی که به Android 5.0 ارتقا یافته و سپس رمزگذاری شدهاند را میتوان با بازنشانی دادههای کارخانه به حالت رمزگذاری نشده برگرداند. دستگاههای Android 5.0 جدید که در اولین راهاندازی رمزگذاری شدهاند را نمیتوان به حالت رمزگذاری نشده بازگرداند.
نحوه عملکرد رمزگذاری فول دیسک اندروید
رمزگذاری فول دیسک اندروید مبتنی بر dm-crypt
است که یک ویژگی هسته است که در لایه دستگاه بلوک کار می کند. به همین دلیل، رمزگذاری با کارت چند رسانه ای جاسازی شده ( eMMC) و دستگاه های فلش مشابه که خود را به عنوان دستگاه های بلوک به هسته نشان می دهند، کار می کند. رمزگذاری با YAFFS امکان پذیر نیست، که مستقیماً با یک تراشه فلش NAND خام صحبت می کند.
الگوریتم رمزگذاری 128 استاندارد رمزگذاری پیشرفته (AES) با زنجیره بلوک رمز (CBC) و ESSIV:SHA256 است. کلید اصلی با AES 128 بیتی از طریق تماس با کتابخانه OpenSSL رمزگذاری می شود. برای کلید باید از 128 بیت یا بیشتر استفاده کنید (که 256 اختیاری است).
توجه: OEM ها می توانند از 128 بیت یا بالاتر برای رمزگذاری کلید اصلی استفاده کنند.
در نسخه اندروید 5.0، چهار نوع حالت رمزگذاری وجود دارد:
- پیش فرض
- پین
- رمز عبور
- الگوی
پس از اولین راهاندازی، دستگاه یک کلید اصلی ۱۲۸ بیتی بهطور تصادفی ایجاد میکند و سپس آن را با رمز عبور پیشفرض و نمک ذخیرهشده هش میکند. رمز عبور پیشفرض این است: "default_password" با این حال، هش حاصل از طریق یک TEE (مانند TrustZone) نیز امضا میشود که از هش امضا برای رمزگذاری کلید اصلی استفاده میکند.
می توانید رمز عبور پیش فرض تعریف شده در فایل cryptfs.cpp پروژه متن باز Android را پیدا کنید.
هنگامی که کاربر پین/گذر یا رمز عبور را روی دستگاه تنظیم می کند، تنها کلید 128 بیتی دوباره رمزگذاری و ذخیره می شود. (یعنی تغییرات پین/گذر/الگوی کاربر باعث رمزگذاری مجدد دادههای کاربر نمیشود.) توجه داشته باشید که دستگاه مدیریتشده ممکن است مشمول محدودیتهای پین، الگو یا رمز عبور باشد.
رمزگذاری توسط init
و vold
مدیریت می شود. init
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 نسخه ۵.۰ و بالاتر).
- راهاندازی دستگاه رمزگذاریشده با رمز عبور: راهاندازی دستگاه رمزگذاریشده که رمز عبور تعیینشده دارد.
علاوه بر این جریانها، دستگاه ممکن است در رمزگذاری /data
نیز شکست بخورد. در زیر هر یک از جریان ها به تفصیل توضیح داده شده است.
یک دستگاه جدید را با رمزگذاری اجباری رمزگذاری کنید
این اولین بوت معمولی برای دستگاه اندروید 5.0 است.
- شناسایی سیستم فایل رمزگذاری نشده با پرچم
forceencrypt
/data
رمزگذاری نشده است، اما باید رمزگذاری شود زیراforceencrypt
آن را الزامی می کند. حذف/data
. - رمزگذاری
/data
شروع کنیدvold.decrypt = "trigger_encryption"
init.rc
راهاندازی میکند که باعث میشودvold
/data
بدون رمز عبور رمزگذاری کند. (هیچ کدام تنظیم نشده است زیرا باید دستگاه جدیدی باشد.) - tmpfs را سوار کنید
vold
یک tmpfs/data
/data
را نصبtrigger_restart_min_framework
(با استفاده از گزینههای tmpfs ازro.crypto.tmpfs_options
) و ویژگیvold.encrypt_progress
vold.decrypt
روی 0 تنظیمvold
. - چارچوبی را برای نشان دادن پیشرفت بیاورید
از آنجایی که دستگاه عملا هیچ داده ای برای رمزگذاری ندارد، نوار پیشرفت اغلب ظاهر نمی شود زیرا رمزگذاری خیلی سریع اتفاق می افتد. برای جزئیات بیشتر در مورد رابط کاربری پیشرفت، به رمزگذاری یک دستگاه موجود مراجعه کنید.
- هنگامی که
/data
رمزگذاری شده است، چارچوب را حذف کنیدvold
vold.decrypt
را رویtrigger_default_encryption
قرار میدهد که سرویسdefaultcrypto
را شروع میکند. (این کار جریان زیر را برای نصب دادههای کاربری رمزگذاری شده پیشفرض شروع میکند.)trigger_default_encryption
نوع رمزگذاری را بررسی میکند تا ببیند/data
با رمز عبور یا بدون رمزگذاری رمزگذاری شده است. از آنجایی که دستگاههای Android 5.0 در اولین بوت رمزگذاری میشوند، نباید رمز عبوری تنظیم شود. بنابراین ما/data
را رمزگشایی و سوار می کنیم. - Mount
/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
را اجرا کنید.
- رمز عبور را بررسی کنید
UI با دستور
cryptfs enablecrypto inplace
در جایی کهpasswd
رمز عبور صفحه قفل کاربر است،vold
فراخوانی میکند. - چارچوب را بردارید
vold
خطاها را بررسی میکند، اگر نتواند رمزگذاری کند -1 را برمیگرداند و دلیلی را در گزارش چاپ میکند. اگر بتواند رمزگذاری کند، ویژگیvold.decrypt
را رویtrigger_shutdown_framework
تنظیم می کند. این باعث میشود کهinit.rc
سرویسها را در کلاسهایlate_start
وmain
متوقف کند. - یک پاورقی رمزنگاری ایجاد کنید
- یک فایل پودر سوخاری ایجاد کنید
- راه اندازی مجدد
- شناسایی فایل پودر سوخاری
- رمزگذاری
/data
شروع کنیدسپس
vold
نقشه رمزنگاری را راهاندازی میکند، که یک دستگاه بلوک کریپتو مجازی ایجاد میکند که بر روی دستگاه بلاک واقعی نقشه میگیرد، اما هر بخش را همانطور که نوشته شده رمزگذاری میکند، و هر بخش را هنگام خواندن رمزگشایی میکند.vold
سپس ابرداده رمزنگاری را ایجاد و می نویسد. - در حالی که در حال رمزگذاری است، tmpfs را سوار کنید
vold
یک tmpfs/data
/data
را نصبtrigger_restart_min_framework
(با استفاده از گزینههای tmpfs ازro.crypto.tmpfs_options
) و ویژگیvold.encrypt_progress
vold.decrypt
روی 0 تنظیمvold
. - چارچوبی را برای نشان دادن پیشرفت بیاورید
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
را روی دستگاه بلوک ایجاد می کند تا دستگاه برای استفاده آماده شود. - Mount /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 رمزگذاری شده است زیرا flag
ro.crypto.state = "encrypted"
vold
vold.decrypt
رویtrigger_restart_min_framework
قرار میدهد زیرا/data
با رمز عبور رمزگذاری شده است. - tmpfs را سوار کنید
init
پنج ویژگی را برای ذخیره گزینه های mount اولیه ارائه شده برای/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 را به UI برمی گرداند. . اگر رمز عبور نادرست باشد، -1 را به UI برمی گرداند. - چارچوب را متوقف کنید
UI یک گرافیک بوت کریپتو قرار می دهد و سپس با دستور
cryptfs restart
vold
فراخوانی می کند.vold
ویژگیvold.decrypt
را رویtrigger_reset_main
تنظیم می کند که باعث می شودinit.rc
class_reset main
را انجام دهد. این کار تمام سرویسهای کلاس اصلی را متوقف میکند، که به tmpfs/data
اجازه میدهد تا از حالت نصب خارج شوند. - Mount
/data
سپس
vold
پارتیشن واقعی/data
رمزگشایی شده را نصب می کند و پارتیشن جدید را آماده می کند (که اگر با گزینه wipe رمزگذاری شده بود، که در اولین نسخه پشتیبانی نمی شود، ممکن بود هرگز آماده نمی شد). ویژگی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 بار رمز عبور را اشتباه وارد می کند
اگر این خطاها برطرف نشدند، از کاربر بخواهید تا Factory wipe کند :
اگر vold
در طول فرآیند رمزگذاری خطایی را تشخیص دهد، و اگر هنوز هیچ داده ای از بین نرفته باشد و چارچوب بالا باشد، vold
ویژگی vold.encrypt_progress
را روی error_not_encrypted
تنظیم می کند. UI از کاربر می خواهد که راه اندازی مجدد شود و به او هشدار می دهد که فرآیند رمزگذاری هرگز شروع نشده است. اگر خطا پس از پاره شدن چارچوب، اما قبل از بالا رفتن رابط کاربری نوار پیشرفت رخ دهد، vold
سیستم را راهاندازی مجدد میکند. اگر راهاندازی مجدد ناموفق باشد، vold.encrypt_progress
را روی error_shutting_down
تنظیم میکند و -1 را برمیگرداند. اما چیزی برای تشخیص خطا وجود نخواهد داشت. انتظار نمی رود این اتفاق بیفتد
اگر vold
در طول فرآیند رمزگذاری خطایی را تشخیص دهد، vold.encrypt_progress
را روی error_partially_encrypted
تنظیم می کند و -1 را برمی گرداند. سپس رابط کاربری باید پیامی مبنی بر عدم موفقیت رمزگذاری نمایش دهد و دکمهای را برای کاربر فراهم کند تا دستگاه را به تنظیمات کارخانه بازنشانی کند.
کلید رمزگذاری شده را ذخیره کنید
کلید رمزگذاری شده در فراداده رمزنگاری ذخیره می شود. پشتیبانی سخت افزاری با استفاده از قابلیت امضای Trusted Execution Environment (TEE) اجرا می شود. پیش از این، کلید اصلی را با کلیدی که با اعمال رمز روی رمز عبور کاربر و نمک ذخیره شده ایجاد میشد، رمزگذاری کردیم. به منظور انعطاف پذیری کلید در برابر حملات خارج از جعبه، این الگوریتم را با امضای کلید حاصل با یک کلید TEE ذخیره شده گسترش می دهیم. سپس امضای حاصل توسط یک برنامه دیگر از scrypt به یک کلید طول مناسب تبدیل می شود. سپس از این کلید برای رمزگذاری و رمزگشایی کلید اصلی استفاده می شود. برای ذخیره این کلید:
- کلید رمزگذاری دیسک تصادفی 16 بایتی (DEK) و نمک 16 بایتی ایجاد کنید.
- برای تولید کلید میانی 1 (IK1) 32 بایتی، رمزگذاری را روی رمز عبور کاربر و نمک اعمال کنید.
- پد IK1 با صفر بایت به اندازه کلید خصوصی سخت افزاری (HBK). به طور خاص، ما پد را به عنوان: 00 || IK1 || 00..00; یک بایت صفر، 32 بایت IK1، 223 بایت صفر.
- علامت IK1 با HBK برای تولید IK2 256 بایت.
- برای تولید IK3 32 بایتی، scrypt را روی IK2 و نمک (همان نمک مرحله 2) اعمال کنید.
- از 16 بایت اول IK3 به عنوان KEK و از 16 بایت آخر به عنوان IV استفاده کنید.
- رمزگذاری DEK با AES_CBC، با کلید KEK، و بردار مقداردهی اولیه IV.
رمز عبور را تغییر دهید
هنگامی که کاربر تصمیم می گیرد رمز عبور خود را در تنظیمات تغییر یا حذف کند، UI دستور cryptfs changepw
به vold
می فرستد و vold
مجدداً کلید اصلی دیسک را با رمز عبور جدید رمزگذاری می کند.
ویژگی های رمزگذاری
vold
و init
با تنظیم خواص با یکدیگر ارتباط برقرار می کنند. در اینجا لیستی از ویژگی های موجود برای رمزگذاری وجود دارد.
خواص ولد
اموال | توضیحات |
---|---|
vold.decrypt trigger_encryption | درایو را بدون رمز عبور رمزگذاری کنید. |
vold.decrypt trigger_default_encryption | درایو را بررسی کنید تا ببینید آیا بدون رمز عبور رمزگذاری شده است یا خیر. اگر چنین است، رمزگشایی و نصب کنید، در غیر این صورت vold.decrypt را روی trigger_restart_min_framework تنظیم کنید. |
vold.decrypt trigger_reset_main | با ولد تنظیم کنید تا رابط کاربری درخواست رمز عبور دیسک را خاموش کند. |
vold.decrypt trigger_post_fs_data | با ولد روی prep /data با دایرکتوری های لازم تنظیم کنید، و همکاران. |
vold.decrypt trigger_restart_framework | برای شروع فریم ورک واقعی و همه سرویس ها، با ولد تنظیم کنید. |
vold.decrypt trigger_shutdown_framework | با ولد تنظیم کنید تا چارچوب کامل برای شروع رمزگذاری خاموش شود. |
vold.decrypt trigger_restart_min_framework | بسته به مقدار ro.crypto.state ، با ولد تنظیم کنید تا رابط کاربری نوار پیشرفت برای رمزگذاری شروع شود یا رمز عبور را درخواست کنید. |
vold.encrypt_progress | هنگامی که فریم ورک راه اندازی می شود، اگر این ویژگی تنظیم شده است، وارد حالت UI نوار پیشرفت شوید. |
vold.encrypt_progress 0 to 100 | UI نوار پیشرفت باید مقدار درصد تنظیم شده را نمایش دهد. |
vold.encrypt_progress error_partially_encrypted | رابط کاربری نوار پیشرفت باید پیامی مبنی بر عدم موفقیت رمزگذاری نمایش دهد و به کاربر این امکان را بدهد که دستگاه را به تنظیمات کارخانه بازنشانی کند. |
vold.encrypt_progress error_reboot_failed | رابط کاربری نوار پیشرفت باید پیامی را نشان دهد که رمزگذاری تکمیل شد، و به کاربر دکمه ای برای راه اندازی مجدد دستگاه بدهد. انتظار نمی رود این خطا رخ دهد. |
vold.encrypt_progress error_not_encrypted | UI نوار پیشرفت باید پیامی را نشان دهد که خطایی رخ داده است، هیچ داده ای رمزگذاری نشده یا از بین رفته است و به کاربر دکمه ای برای راه اندازی مجدد سیستم بدهد. |
vold.encrypt_progress error_shutting_down | رابط کاربری نوار پیشرفت اجرا نمی شود، بنابراین مشخص نیست چه کسی به این خطا پاسخ می دهد. و به هر حال هرگز نباید اتفاق بیفتد. |
vold.post_fs_data_done 0 | درست قبل از تنظیم vold.decrypt روی trigger_post_fs_data با vold تنظیم کنید. |
vold.post_fs_data_done 1 | درست پس از اتمام کار post-fs-data توسط init.rc یا init.rc تنظیم کنید. |
خصوصیات 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 mount کند. 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،
رمزگذاری فول دیسک فرآیند رمزگذاری تمام داده های کاربر در دستگاه اندرویدی با استفاده از یک کلید رمزگذاری شده است. هنگامی که یک دستگاه رمزگذاری می شود، تمام داده های ایجاد شده توسط کاربر به طور خودکار قبل از انتقال آن به دیسک رمزگذاری می شوند و همه داده ها به طور خودکار قبل از بازگرداندن آنها به فرآیند تماس، رمزگشایی می شوند.
رمزگذاری فول دیسک در نسخه 4.4 به اندروید معرفی شد، اما اندروید 5.0 این ویژگی های جدید را معرفی کرد:
- رمزگذاری سریع ایجاد کرد، که فقط بلوک های استفاده شده در پارتیشن داده را رمزگذاری می کند تا از طولانی شدن زمان بوت اولیه جلوگیری شود. در حال حاضر فقط فایل سیستم های ext4 و f2fs از رمزگذاری سریع پشتیبانی می کنند.
- پرچم
forceencrypt
را برای رمزگذاری در اولین بوت اضافه کرد. - پشتیبانی از الگوها و رمزگذاری بدون رمز عبور اضافه شده است.
- ذخیره سازی سخت افزاری کلید رمزگذاری را با استفاده از قابلیت امضای Trusted Execution Environment (TEE) اضافه کرد (مانند TrustZone). برای جزئیات بیشتر به ذخیره کلید رمزگذاری شده مراجعه کنید.
احتیاط: دستگاههایی که به Android 5.0 ارتقا یافته و سپس رمزگذاری شدهاند را میتوان با بازنشانی دادههای کارخانه به حالت رمزگذاری نشده برگرداند. دستگاههای Android 5.0 جدید که در اولین راهاندازی رمزگذاری شدهاند را نمیتوان به حالت رمزگذاری نشده بازگرداند.
نحوه عملکرد رمزگذاری فول دیسک اندروید
رمزگذاری فول دیسک اندروید مبتنی بر dm-crypt
است که یک ویژگی هسته است که در لایه دستگاه بلوک کار می کند. به همین دلیل، رمزگذاری با کارت چند رسانه ای جاسازی شده ( eMMC) و دستگاه های فلش مشابه که خود را به عنوان دستگاه های بلوک به هسته نشان می دهند، کار می کند. رمزگذاری با YAFFS امکان پذیر نیست، که مستقیماً با یک تراشه فلش NAND خام صحبت می کند.
الگوریتم رمزگذاری 128 استاندارد رمزگذاری پیشرفته (AES) با زنجیره بلوک رمز (CBC) و ESSIV:SHA256 است. کلید اصلی با AES 128 بیتی از طریق تماس با کتابخانه OpenSSL رمزگذاری می شود. برای کلید باید از 128 بیت یا بیشتر استفاده کنید (که 256 اختیاری است).
توجه: OEM ها می توانند از 128 بیت یا بالاتر برای رمزگذاری کلید اصلی استفاده کنند.
در نسخه اندروید 5.0، چهار نوع حالت رمزگذاری وجود دارد:
- پیش فرض
- پین
- رمز عبور
- الگوی
پس از اولین راهاندازی، دستگاه یک کلید اصلی ۱۲۸ بیتی بهطور تصادفی ایجاد میکند و سپس آن را با رمز عبور پیشفرض و نمک ذخیرهشده هش میکند. رمز عبور پیشفرض این است: "default_password" با این حال، هش حاصل از طریق یک TEE (مانند TrustZone) نیز امضا میشود که از هش امضا برای رمزگذاری کلید اصلی استفاده میکند.
می توانید رمز عبور پیش فرض تعریف شده در فایل cryptfs.cpp پروژه متن باز Android را پیدا کنید.
هنگامی که کاربر پین/گذر یا رمز عبور را روی دستگاه تنظیم می کند، تنها کلید 128 بیتی دوباره رمزگذاری و ذخیره می شود. (یعنی تغییرات پین/گذر/الگوی کاربر باعث رمزگذاری مجدد دادههای کاربر نمیشود.) توجه داشته باشید که دستگاه مدیریتشده ممکن است مشمول محدودیتهای پین، الگو یا رمز عبور باشد.
رمزگذاری توسط init
و vold
مدیریت می شود. init
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 نسخه ۵.۰ و بالاتر).
- راهاندازی دستگاه رمزگذاریشده با رمز عبور: راهاندازی دستگاه رمزگذاریشده که رمز عبور تعیینشده دارد.
علاوه بر این جریانها، دستگاه ممکن است در رمزگذاری /data
نیز شکست بخورد. در زیر هر یک از جریان ها به تفصیل توضیح داده شده است.
یک دستگاه جدید را با رمزگذاری اجباری رمزگذاری کنید
این اولین بوت معمولی برای دستگاه اندروید 5.0 است.
- شناسایی سیستم فایل رمزگذاری نشده با پرچم
forceencrypt
/data
رمزگذاری نشده است، اما باید رمزگذاری شود زیراforceencrypt
آن را الزامی می کند. حذف/data
. - رمزگذاری
/data
شروع کنیدvold.decrypt = "trigger_encryption"
init.rc
راهاندازی میکند که باعث میشودvold
/data
بدون رمز عبور رمزگذاری کند. (هیچ کدام تنظیم نشده است زیرا باید دستگاه جدیدی باشد.) - tmpfs را سوار کنید
vold
یک tmpfs/data
/data
را نصبtrigger_restart_min_framework
(با استفاده از گزینههای tmpfs ازro.crypto.tmpfs_options
) و ویژگیvold.encrypt_progress
vold.decrypt
روی 0 تنظیمvold
. - چارچوبی را برای نشان دادن پیشرفت بیاورید
از آنجایی که دستگاه عملا هیچ داده ای برای رمزگذاری ندارد، نوار پیشرفت اغلب ظاهر نمی شود زیرا رمزگذاری خیلی سریع اتفاق می افتد. برای جزئیات بیشتر در مورد رابط کاربری پیشرفت، به رمزگذاری یک دستگاه موجود مراجعه کنید.
- هنگامی که
/data
رمزگذاری شده است، چارچوب را حذف کنیدvold
vold.decrypt
را رویtrigger_default_encryption
قرار میدهد که سرویسdefaultcrypto
را شروع میکند. (این کار جریان زیر را برای نصب دادههای کاربری رمزگذاری شده پیشفرض شروع میکند.)trigger_default_encryption
نوع رمزگذاری را بررسی میکند تا ببیند/data
با رمز عبور یا بدون رمزگذاری رمزگذاری شده است. از آنجایی که دستگاههای Android 5.0 در اولین بوت رمزگذاری میشوند، نباید رمز عبوری تنظیم شود. بنابراین ما/data
را رمزگشایی و mount می کنیم. - Mount
/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
را اجرا کنید.
- رمز عبور را بررسی کنید
UI با دستور
cryptfs enablecrypto inplace
در جایی کهpasswd
رمز عبور صفحه قفل کاربر است،vold
فراخوانی میکند. - چارچوب را بردارید
vold
خطاها را بررسی میکند، اگر نتواند رمزگذاری کند -1 را برمیگرداند و دلیلی را در گزارش چاپ میکند. اگر بتواند رمزگذاری کند، ویژگیvold.decrypt
را رویtrigger_shutdown_framework
تنظیم می کند. این باعث میشود کهinit.rc
سرویسها را در کلاسهایlate_start
وmain
متوقف کند. - یک پاورقی رمزنگاری ایجاد کنید
- یک فایل پودر سوخاری ایجاد کنید
- راه اندازی مجدد
- شناسایی فایل پودر سوخاری
- رمزگذاری
/data
شروع کنیدسپس
vold
نقشه رمزنگاری را راهاندازی میکند، که یک دستگاه بلوک کریپتو مجازی ایجاد میکند که بر روی دستگاه بلاک واقعی نقشه میگیرد، اما هر بخش را همانطور که نوشته شده رمزگذاری میکند، و هر بخش را هنگام خواندن رمزگشایی میکند.vold
سپس ابرداده رمزنگاری را ایجاد و می نویسد. - در حالی که در حال رمزگذاری است، tmpfs را سوار کنید
vold
یک tmpfs/data
/data
را نصبtrigger_restart_min_framework
(با استفاده از گزینههای tmpfs ازro.crypto.tmpfs_options
) و ویژگیvold.encrypt_progress
vold.decrypt
روی 0 تنظیمvold
. - چارچوبی را برای نشان دادن پیشرفت بیاورید
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
را روی دستگاه بلوک ایجاد می کند تا دستگاه برای استفاده آماده شود. - Mount /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 رمزگذاری شده است زیرا flag
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 رقمی HEX قبل از 0x)
-
- چارچوب را شروع کنید تا از رمز عبور استفاده کنید
این چارچوب شروع می شود و می بیند که
vold.decrypt
برایtrigger_restart_min_framework
تنظیم شده است. این به این چارچوب می گوید که در حال بوت شدن بر روی دیسک TMPFS/data
است و باید رمز عبور کاربر را بدست آورد.با این حال ، اول ، باید اطمینان حاصل کند که دیسک به درستی رمزگذاری شده است. این فرمان
cryptfs cryptocomplete
بهvold
ارسال می کند. اگر رمزگذاری با موفقیت به پایان رسید ، -1 بر روی خطای داخلی یا -2 در صورت انجام رمزگذاری با موفقیت انجام شد ،vold
0 را برمی گرداند.vold
این کار را با نگاه کردن به ابرداده رمزنگاری برای پرچمCRYPTO_ENCRYPTION_IN_PROGRESS
تعیین می کند. در صورت تنظیم ، فرآیند رمزگذاری قطع شد و هیچ داده قابل استفاده در دستگاه وجود ندارد. اگرvold
خطایی را برگرداند ، UI باید پیام را به کاربر نشان دهد تا مجدداً دستگاه را تنظیم مجدد کند و کارخانه را مجدداً تنظیم کند و دکمه ای را به کاربر بدهد تا این کار را انجام دهد. - داده های رمزگشایی را با رمز را رمزگشایی کنید
هنگامی که
cryptfs cryptocomplete
موفقیت آمیز است ، چارچوب یک UI را نشان می دهد که رمز عبور دیسک را درخواست می کند. UI با ارسال دستورcryptfs checkpw
بهvold
رمز عبور را بررسی می کند. اگر رمز عبور صحیح است (که با نصب موفقیت آمیز داده های رمزگشایی شده/data
در یک مکان موقت تعیین می شود ، سپس آن را از بین می برد) ،vold
نام دستگاه بلوک رمزگشایی شده را در ویژگیro.crypto.fs_crypto_blkdev
ذخیره می کند و وضعیت 0 را به UI باز می گرداند . اگر رمز عبور نادرست باشد ، -1 به UI باز می گردد. - چارچوب را متوقف کنید
UI یک گرافیک بوت Crypto را قرار می دهد و سپس با
cryptfs restart
vold
تماس می گیرد.vold
ویژگیvold.decrypt
را بهtrigger_reset_main
تنظیم می کند ، که باعث می شودinit.rc
class_reset main
را انجام دهد. این کار تمام خدمات را در کلاس اصلی متوقف می کند ، که اجازه می دهد تا TMPF/data
از بین بروند. - نصب
/data
vold
سپس پارتیشن واقعی/data
رمزگشایی شده را نصب می کند و پارتیشن جدید را تهیه می کند (که اگر با گزینه Wipe رمزگذاری شده باشد ، که در نسخه اول پشتیبانی نمی شود ، ممکن است هرگز تهیه نشده باشد). این ویژگیvold.post_fs_data_done
را روی 0 تنظیم می کند و سپسvold.decrypt
بهtrigger_post_fs_data
تنظیم می کند. این امر باعث می شود کهinit.rc
دستوراتpost-fs-data
خود را اجرا کند. آنها هر دایرکتوری یا پیوندهایی لازم را ایجاد می کنند و سپسvold.post_fs_data_done
را تنظیم می کنند. وقتیvold
1 را در آن خاصیت می بیند ، ویژگیvold.decrypt
را برایtrigger_restart_framework
تنظیم می کند. این امر باعث می شود کهinit.rc
دوباره خدمات را در کلاسmain
شروع کند و همچنین برای اولین بار از زمان بوت ، خدمات را در کلاسlate_start
شروع کند. - چارچوب کامل را شروع کنید
اکنون این چارچوب تمام خدمات خود را با استفاده از سیستم فایل رمزگشایی
/data
، بوت می کند و سیستم برای استفاده آماده است.
شکست
دستگاهی که در رمزگشایی نتواند به چند دلیل ناخوشایند باشد. دستگاه با سری عادی مراحل برای بوت شدن شروع می شود:
- دستگاه رمزگذاری شده را با یک رمز عبور تشخیص دهید
- کوه tmpfs
- چارچوب را شروع کنید تا از رمز عبور استفاده کنید
اما پس از باز شدن چارچوب ، دستگاه می تواند با برخی از خطاها روبرو شود:
- رمز عبور مطابقت دارد اما نمی تواند داده ها را رمزگشایی کند
- کاربر 30 بار رمز عبور اشتباه را وارد می کند
اگر این خطاها برطرف نشوند ، کاربر را سریعاً به پاک کردن کارخانه برسانید :
اگر vold
خطایی را در طی فرآیند رمزگذاری تشخیص دهد ، و اگر هنوز هیچ داده ای از بین نرفته است و چارچوب به پایان رسیده است ، vold
ویژگی vold.encrypt_progress
را به error_not_encrypted
تنظیم می کند. UI کاربر را وادار به راه اندازی مجدد و هشدار می دهد که روند رمزگذاری هرگز آغاز نشده است. اگر این خطا پس از پاره شدن چارچوب رخ دهد ، اما قبل از اینکه UI نوار پیشرفت بالا برود ، vold
سیستم را دوباره راه اندازی می کند. اگر راه اندازی مجدد شکست بخورد ، vold.encrypt_progress
به error_shutting_down
تنظیم می کند و -1 را برمی گرداند. اما چیزی برای گرفتن خطا وجود نخواهد داشت. انتظار نمی رود این اتفاق بیفتد.
اگر vold
خطایی را در طی فرآیند رمزگذاری تشخیص دهد ، vold.encrypt_progress
به error_partially_encrypted
تنظیم می کند و -1 را برمی گرداند. UI سپس باید پیامی را نشان دهد که می گوید رمزگذاری انجام نشده است و دکمه ای را برای کاربر فراهم می کند تا بتواند دستگاه را تنظیم کند.
کلید رمزگذاری شده را ذخیره کنید
کلید رمزگذاری شده در ابرداده رمزنگاری ذخیره می شود. پشتیبان سخت افزاری با استفاده از قابلیت امضای Trusted Excation Environment (TEE) اجرا می شود. پیش از این ، ما کلید اصلی را با یک کلید تولید شده با استفاده از scrypt بر روی رمز عبور کاربر و نمک ذخیره شده رمزگذاری کردیم. به منظور ایجاد مقاومت کلیدی در برابر حملات خارج از جعبه ، ما این الگوریتم را با امضای کلید حاصل با یک کلید TEE ذخیره شده گسترش می دهیم. امضای حاصل با یک کاربرد دیگر از Scrypt به یک کلید طول مناسب تبدیل می شود. سپس این کلید برای رمزگذاری و رمزگشایی کلید اصلی استفاده می شود. برای ذخیره این کلید:
- کلید رمزگذاری دیسک 16 بایت (DEK) و نمک 16 بایت تولید کنید.
- برای تولید کلید میانی 32 بایت 1 (IK1) Scrypt را روی رمز عبور کاربر و نمک اعمال کنید.
- پد IK1 با بایت صفر به اندازه کلید خصوصی محدود به سخت افزار (HBK). به طور خاص ، ما به عنوان: 00 || IK1 || 00..00 ؛ یک بایت صفر ، 32 بایت IK1 ، 223 بایت صفر.
- IK1 را با HBK علامت گذاری کنید تا 256 بایت IK2 تولید کند.
- Scrypt را به IK2 و نمک (همان نمک مرحله 2) بمالید تا 32 بایت IK3 تولید شود.
- از 16 بایت اول IK3 به عنوان Kek و 16 بایت آخر به عنوان IV استفاده کنید.
- رمزگذاری DEK با AES_CBC ، با Key Kek و بردار اولیه سازی IV.
رمز عبور را تغییر دهید
هنگامی که یک کاربر تصمیم به تغییر یا حذف رمز عبور خود در تنظیمات می کند ، UI دستور cryptfs changepw
به vold
ارسال می کند ، و vold
با رمز عبور جدید ، کلید اصلی دیسک را دوباره رمزگذاری می کند.
خواص رمزگذاری
vold
و init
با تنظیم خصوصیات با یکدیگر ارتباط برقرار می کنند. در اینجا لیستی از خصوصیات موجود برای رمزگذاری وجود دارد.
خواص ناخوشایند
اموال | توضیحات |
---|---|
vold.decrypt trigger_encryption | درایو را بدون رمز عبور رمزگذاری کنید. |
vold.decrypt trigger_default_encryption | درایو را بررسی کنید تا ببینید آیا بدون رمز عبور رمزگذاری شده است یا خیر. اگر اینطور باشد ، رمزگشایی و نصب کنید ، در غیر این صورت vold.decrypt تنظیم کنید تا trigger_restart_min_framework. |
vold.decrypt trigger_reset_main | تنظیم شده توسط ولد برای خاموش کردن UI درخواست رمز عبور دیسک. |
vold.decrypt trigger_post_fs_data | تنظیم شده توسط ولد برای آماده سازی /data با دایرکتوری های لازم ، و همکاران. |
vold.decrypt trigger_restart_framework | تنظیم شده توسط ولد برای شروع چارچوب واقعی و کلیه خدمات. |
vold.decrypt trigger_shutdown_framework | تنظیم شده توسط ولد برای خاموش کردن چارچوب کامل برای شروع رمزگذاری. |
vold.decrypt trigger_restart_min_framework | بسته به مقدار ro.crypto.state ، توسط Vold برای شروع UI نوار پیشرفت برای رمزگذاری یا درخواست رمز عبور تنظیم شده است. |
vold.encrypt_progress | هنگامی که چارچوب شروع به کار کرد ، اگر این ویژگی تنظیم شود ، حالت UI Progress Bar را وارد کنید. |
vold.encrypt_progress 0 to 100 | UI Progress Bar باید مجموعه درصد را نشان دهد. |
vold.encrypt_progress error_partially_encrypted | UI Progress Bar باید پیامی را نشان دهد که رمزگذاری شکست خورده است و گزینه ای را برای تنظیم مجدد دستگاه به کاربر می دهد. |
vold.encrypt_progress error_reboot_failed | UI نوار پیشرفت باید پیامی را نشان دهد که رمزگذاری تکمیل شده است و دکمه ای را برای راه اندازی مجدد دستگاه به کاربر می دهد. انتظار نمی رود این خطا اتفاق بیفتد. |
vold.encrypt_progress error_not_encrypted | UI نوار پیشرفت باید پیامی را نشان دهد که خطایی رخ داده است ، هیچ داده ای رمزگذاری شده یا گم نشده است و دکمه ای را برای استفاده مجدد از سیستم به کاربر می دهد. |
vold.encrypt_progress error_shutting_down | UI نوار پیشرفت در حال اجرا نیست ، بنابراین مشخص نیست چه کسی به این خطا پاسخ می دهد. و هرگز نباید به هر حال اتفاق بیفتد. |
vold.post_fs_data_done 0 | قبل از تنظیم vold.decrypt برای trigger_post_fs_data توسط vold تنظیم شده است. |
vold.post_fs_data_done 1 | تنظیم شده توسط init.rc یا init.rc درست پس از اتمام کار post-fs-data . |
خواص اولیه
اموال | توضیحات |
---|---|
ro.crypto.fs_crypto_blkdev | تنظیم شده توسط checkpw Command vold برای استفاده بعدی توسط restart دستور vold . |
ro.crypto.state unencrypted | تنظیم شده توسط init برای گفتن این سیستم با رمزگذاری بدون رمزگذاری /data ro.crypto.state encrypted است. تنظیم شده توسط init برای گفتن این سیستم با یک رمزگذاری /data در حال اجرا است. |
| این پنج ویژگی هنگامی که سعی در نصب /data با پارامترهای منتقل شده از init.rc دارد ، توسط init تنظیم می شوند. vold از اینها برای تنظیم نقشه برداری رمزنگاری استفاده می کند. |
ro.crypto.tmpfs_options | تنظیم شده توسط init.rc با گزینه های اولیه باید هنگام نصب سیستم فایل 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،
رمزگذاری کامل دیسک فرآیند رمزگذاری تمام داده های کاربر در دستگاه Android با استفاده از یک کلید رمزگذاری شده است. پس از رمزگذاری دستگاه ، تمام داده های ایجاد شده توسط کاربر به طور خودکار قبل از ارتکاب آن به دیسک رمزگذاری می شوند و همه قبل از بازگشت آن به فرآیند فراخوانی ، به طور خودکار داده ها را رمزگشایی می کنند.
رمزگذاری کامل دیسک در 4.4 به Android معرفی شد ، اما Android 5.0 این ویژگی های جدید را معرفی کرد:
- رمزگذاری سریع ایجاد شده است ، که فقط رمزگذاری ها از بلوک هایی در پارتیشن داده استفاده می کردند تا از مدت زمان طولانی استفاده کنند. فقط سیستم های فایل EXT4 و F2FS در حال حاضر از رمزگذاری سریع پشتیبانی می کنند.
- پرچم
forceencrypt
FSTAB را برای رمزگذاری در Boot First Boot اضافه کرد. - پشتیبانی از الگوهای و رمزگذاری بدون رمز عبور اضافه شد.
- با استفاده از قابلیت امضای Trusted Execution Environment (TEE) (مانند TrustZone) ، ذخیره سازی پشتیبان سخت افزاری از کلید رمزگذاری اضافه شده است. برای اطلاعات بیشتر به ذخیره کلید رمزگذاری شده مراجعه کنید.
احتیاط: دستگاه های به روز شده به Android 5.0 و سپس رمزگذاری شده را می توان با تنظیم مجدد داده های کارخانه به حالت رمزگذاری نشده بازگرداند. دستگاه های جدید Android 5.0 رمزگذاری شده در Boot نمی توانند به حالت رمزگذاری نشده برگردانده شوند.
رمزگذاری تمام دیسک Android چگونه کار می کند
رمزگذاری تمام دیسک Android بر اساس dm-crypt
است که یک ویژگی هسته است که در لایه دستگاه بلوک کار می کند. به همین دلیل ، رمزگذاری با تعبیه شده Multimediacard ( EMMC) و دستگاه های فلش مشابه کار می کند که خود را به عنوان دستگاه های بلوک به هسته معرفی می کنند. رمزگذاری با Yaffs امکان پذیر نیست ، که مستقیماً با یک تراشه فلش خام NAND صحبت می کند.
الگوریتم رمزگذاری 128 استاندارد رمزگذاری پیشرفته (AES) با زنجیره رمزنگاری مس (CBC) و Essiv: SHA256 است. Master Key با AES 128 بیتی از طریق تماس با کتابخانه OpenSSL رمزگذاری می شود. شما باید از 128 بیت یا بیشتر برای کلید استفاده کنید (با 256 اختیاری).
توجه: OEM ها می توانند از 128 بیتی یا بالاتر برای رمزگذاری کلید اصلی استفاده کنند.
در نسخه Android 5.0 ، چهار نوع حالت رمزگذاری وجود دارد:
- پیش فرض
- پین
- رمز عبور
- الگوی
پس از بوت اول ، دستگاه یک کلید اصلی 128 بیتی تولید شده به طور تصادفی ایجاد می کند و سپس آن را با یک رمزعبور پیش فرض و نمک ذخیره شده هش می دهد. رمزعبور پیش فرض این است: "Default_Password" با این حال ، هش حاصل از آن نیز از طریق یک TEE (مانند TrustZone) امضا می شود ، که از هش از امضای برای رمزگذاری کلید اصلی استفاده می کند.
می توانید رمزعبور پیش فرض تعریف شده در پرونده منبع باز Android Cryptfs.cpp را پیدا کنید.
هنگامی که کاربر پین/عبور یا رمز عبور را روی دستگاه تنظیم می کند ، فقط کلید 128 بیتی دوباره رمزگذاری و ذخیره می شود. .
رمزگذاری توسط init
و vold
اداره می شود. init
با vold
تماس می گیرد ، و ولد خواص را برای ایجاد وقایع در آغاز تنظیم می کند. سایر بخش های سیستم همچنین به خصوصیات مربوط به انجام وظایفی مانند وضعیت گزارش ، درخواست رمز عبور یا درخواست تنظیم مجدد کارخانه در صورت بروز خطای مهلک می پردازند. برای فراخوانی ویژگی های رمزگذاری در vold
، سیستم از دستورات cryptfs
Tool Line Tool 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
: رمزگذاری اجباری در Boot First (شروع از Android L). - رمزگذاری یک دستگاه موجود: رمزگذاری توسط کاربر (Android K و قبلاً).
- رمزگذاری یک دستگاه جدید با
- یک دستگاه رمزگذاری شده را بوت کنید:
- شروع یک دستگاه رمزگذاری شده بدون رمز عبور: بوت کردن یک دستگاه رمزگذاری شده که هیچ رمز عبور تعیین شده ای ندارد (مربوط به دستگاه هایی که Android 5.0 و بعد دارند).
- شروع یک دستگاه رمزگذاری شده با یک رمز عبور: بوت کردن یک دستگاه رمزگذاری شده که دارای یک رمز عبور تعیین شده است.
علاوه بر این جریان ها ، دستگاه همچنین می تواند در رمزگذاری /data
ناکام باشد. هر یک از جریان ها با جزئیات زیر توضیح داده شده است.
یک دستگاه جدید را با ForceNcrypt رمزگذاری کنید
این اولین بوت معمولی برای یک دستگاه Android 5.0 است.
- سیستم فایل بدون رمزگذاری را با پرچم
forceencrypt
تشخیص دهید/data
رمزگذاری نشده اند اما باید به این دلیل باشد کهforceencrypt
آن را الزامی می کند. Unmount/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
. - چارچوبی را برای نشان دادن پیشرفت ارائه دهید
از آنجا که دستگاه تقریباً هیچ داده ای برای رمزگذاری ندارد ، نوار پیشرفت اغلب ظاهر نمی شود زیرا رمزگذاری خیلی سریع اتفاق می افتد. برای اطلاعات بیشتر در مورد UI پیشرفت ، یک دستگاه موجود را مشاهده کنید.
- هنگامی که
/data
رمزگذاری می شوند ، چارچوب را پایین بیاوریدvold
vold.decrypt
بهtrigger_default_encryption
که سرویسdefaultcrypto
را شروع می کند ، تنظیم می کند. (این جریان زیر را برای نصب یک UserData رمزگذاری شده پیش فرض شروع می کند.)trigger_default_encryption
نوع رمزگذاری را بررسی می کند تا ببیند آیا/data
با رمز عبور یا بدون رمز عبور رمزگذاری شده است یا خیر. از آنجا که دستگاه های Android 5.0 در اولین بوت رمزگذاری شده اند ، نباید مجموعه رمز عبور وجود داشته باشد. بنابراین ما/data
را رمزگشایی و نصب می کنیم. - نصب
/data
init
سپس با استفاده از پارامترهایی که ازro.crypto.tmpfs_options
استفاده می کند ، که درinit.rc
تنظیم شده است ، روی یک ramdisk/data
نصب می کند. - چارچوب را شروع کنید
vold
vold.decrypt
برایtrigger_restart_framework
تنظیم می کند ، که روند بوت معمول را ادامه می دهد.
یک دستگاه موجود را رمزگذاری کنید
این همان اتفاقی است که هنگام رمزگذاری Android K یا دستگاه قبلی که به L. منتقل شده است ، رمزگذاری می کنید.
این فرآیند توسط کاربر آغاز شده و به عنوان "رمزگذاری در محل" در کد گفته می شود. هنگامی که یک کاربر برای رمزگذاری یک دستگاه انتخاب می کند ، UI اطمینان می دهد که باتری کاملاً شارژ شده و آداپتور AC به آن وصل شده است ، بنابراین قدرت کافی برای پایان دادن به فرآیند رمزگذاری وجود دارد.
هشدار: اگر دستگاه از قدرت خارج شود و قبل از پایان رمزگذاری خاموش شود ، داده های پرونده در حالت رمزگذاری شده جزئی باقی می مانند. دستگاه باید تنظیم مجدد کارخانه باشد و تمام داده ها از بین بروند.
برای فعال کردن رمزگذاری در محل ، vold
حلقه ای را برای خواندن هر بخش از دستگاه بلوک واقعی شروع می کند و سپس آن را در دستگاه بلوک رمزنگاری می نویسد. vold
بررسی می کند تا قبل از خواندن و نوشتن آن ، یک بخش در حال استفاده باشد ، و این باعث می شود رمزگذاری بسیار سریعتر از دستگاه جدیدی باشد که داده کمی ندارد.
حالت دستگاه : ro.crypto.state = "unencrypted"
را تنظیم کرده و برای ادامه بوت شدن ، ماشه init
on nonencrypted
را اجرا کنید.
- رمز عبور را بررسی کنید
UI با Command
cryptfs enablecrypto inplace
که در آنpasswd
رمز ورود صفحه قفل کاربر است ،vold
می کند. - چارچوب را پایین بیاورید
اگر نتواند رمزگذاری شود ، خطاها را بررسی
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 تنظیم شده است ، UI نوار پیشرفت را بالا می برد ، که هر پنج ثانیه از آن خاصیت پرس و جو می کند و یک نوار پیشرفت را به روز می کند. حلقه رمزگذاری هر بار که درصد دیگری از پارتیشن را رمزگذاری می کند ،vold.encrypt_progress
را به روز می کند. - هنگامی که
/data
رمزگذاری می شوند ، پاورقی رمزنگاری را به روز کنیدهنگامی که
/data
با موفقیت رمزگذاری می شوند ،vold
ENCRYPTION_IN_PROGRESS
پرچم را در ابرداده پاک می کند.هنگامی که دستگاه با موفقیت باز شد ، از رمز عبور برای رمزگذاری کلید اصلی استفاده می شود و پاورقی رمزنگاری به روز می شود.
اگر راه اندازی مجدد به دلایلی ناکام باشد ،
vold
ویژگیvold.encrypt_progress
را بهerror_reboot_failed
تنظیم می کند و UI باید پیامی را نشان دهد که از کاربر بخواهد یک دکمه را برای راه اندازی مجدد فشار دهد. انتظار نمی رود این اتفاق بیفتد.
یک دستگاه رمزگذاری شده را با رمزگذاری پیش فرض شروع کنید
این همان اتفاقی است که هنگام بوت شدن یک دستگاه رمزگذاری شده و بدون رمز عبور رخ می دهد. از آنجا که دستگاه های Android 5.0 در Boot First رمزگذاری شده اند ، نباید رمزعبور تعیین شده ای وجود داشته باشد و بنابراین این حالت رمزگذاری پیش فرض است.
- رمزگذاری شده
/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
با رمز عبور رمزگذاری می شوند. - کوه 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 رقمی HEX قبل از 0x)
-
- چارچوب را شروع کنید تا از رمز عبور استفاده کنید
این چارچوب شروع می شود و می بیند که
vold.decrypt
برایtrigger_restart_min_framework
تنظیم شده است. این به این چارچوب می گوید که در حال بوت شدن بر روی دیسک TMPFS/data
است و باید رمز عبور کاربر را بدست آورد.با این حال ، اول ، باید اطمینان حاصل کند که دیسک به درستی رمزگذاری شده است. این فرمان
cryptfs cryptocomplete
بهvold
ارسال می کند. اگر رمزگذاری با موفقیت به پایان رسید ، -1 بر روی خطای داخلی یا -2 در صورت انجام رمزگذاری با موفقیت انجام شد ،vold
0 را برمی گرداند.vold
این کار را با نگاه کردن به ابرداده رمزنگاری برای پرچمCRYPTO_ENCRYPTION_IN_PROGRESS
تعیین می کند. در صورت تنظیم ، فرآیند رمزگذاری قطع شد و هیچ داده قابل استفاده در دستگاه وجود ندارد. اگرvold
خطایی را برگرداند ، UI باید پیام را به کاربر نشان دهد تا مجدداً دستگاه را مجدداً تنظیم کند و به کاربر یک دکمه را برای فشار دادن به کاربر ارائه دهد. - داده های رمزگشایی را با رمز را رمزگشایی کنید
هنگامی که
cryptfs cryptocomplete
موفقیت آمیز است ، چارچوب یک UI را نشان می دهد که رمز عبور دیسک را درخواست می کند. UI با ارسال دستورcryptfs checkpw
بهvold
رمز عبور را بررسی می کند. اگر رمز عبور صحیح است (که با نصب موفقیت آمیز داده های رمزگشایی شده/data
در یک مکان موقت تعیین می شود ، سپس آن را از بین می برد) ،vold
نام دستگاه بلوک رمزگشایی شده را در ویژگیro.crypto.fs_crypto_blkdev
ذخیره می کند و وضعیت 0 را به UI باز می گرداند . اگر رمز عبور نادرست باشد ، -1 به UI باز می گردد. - چارچوب را متوقف کنید
UI یک گرافیک بوت Crypto را قرار می دهد و سپس با
cryptfs restart
vold
تماس می گیرد.vold
ویژگیvold.decrypt
را بهtrigger_reset_main
تنظیم می کند ، که باعث می شودinit.rc
class_reset main
را انجام دهد. این کار تمام خدمات را در کلاس اصلی متوقف می کند ، که اجازه می دهد تا TMPF/data
از بین بروند. - نصب
/data
vold
سپس پارتیشن واقعی/data
رمزگشایی شده را نصب می کند و پارتیشن جدید را تهیه می کند (که اگر با گزینه Wipe رمزگذاری شده باشد ، که در نسخه اول پشتیبانی نمی شود ، ممکن است هرگز تهیه نشده باشد). این ویژگیvold.post_fs_data_done
را روی 0 تنظیم می کند و سپسvold.decrypt
بهtrigger_post_fs_data
تنظیم می کند. این امر باعث می شود کهinit.rc
دستوراتpost-fs-data
خود را اجرا کند. آنها هر دایرکتوری یا پیوندهایی لازم را ایجاد می کنند و سپسvold.post_fs_data_done
را تنظیم می کنند. وقتیvold
1 را در آن خاصیت می بیند ، ویژگیvold.decrypt
را برایtrigger_restart_framework
تنظیم می کند. این امر باعث می شود کهinit.rc
دوباره خدمات را در کلاسmain
شروع کند و همچنین برای اولین بار از زمان بوت ، خدمات را در کلاسlate_start
شروع کند. - چارچوب کامل را شروع کنید
اکنون این چارچوب تمام خدمات خود را با استفاده از سیستم فایل رمزگشایی
/data
، بوت می کند و سیستم برای استفاده آماده است.
شکست
دستگاهی که در رمزگشایی نتواند به چند دلیل ناخوشایند باشد. دستگاه با سری عادی مراحل برای بوت شدن شروع می شود:
- دستگاه رمزگذاری شده را با یک رمز عبور تشخیص دهید
- کوه tmpfs
- چارچوب را شروع کنید تا از رمز عبور استفاده کنید
اما پس از باز شدن چارچوب ، دستگاه می تواند با برخی از خطاها روبرو شود:
- رمز عبور مطابقت دارد اما نمی تواند داده ها را رمزگشایی کند
- کاربر 30 بار رمز عبور اشتباه را وارد می کند
اگر این خطاها برطرف نشوند ، کاربر را سریعاً به پاک کردن کارخانه برسانید :
اگر vold
خطایی را در طی فرآیند رمزگذاری تشخیص دهد ، و اگر هنوز هیچ داده ای از بین نرفته است و چارچوب به پایان رسیده است ، vold
ویژگی vold.encrypt_progress
را به error_not_encrypted
تنظیم می کند. UI کاربر را وادار به راه اندازی مجدد و هشدار می دهد که روند رمزگذاری هرگز آغاز نشده است. اگر این خطا پس از پاره شدن چارچوب رخ دهد ، اما قبل از اینکه UI نوار پیشرفت بالا برود ، vold
سیستم را دوباره راه اندازی می کند. اگر راه اندازی مجدد شکست بخورد ، vold.encrypt_progress
به error_shutting_down
تنظیم می کند و -1 را برمی گرداند. اما چیزی برای گرفتن خطا وجود نخواهد داشت. انتظار نمی رود این اتفاق بیفتد.
اگر vold
خطایی را در طی فرآیند رمزگذاری تشخیص دهد ، vold.encrypt_progress
به error_partially_encrypted
تنظیم می کند و -1 را برمی گرداند. UI سپس باید پیامی را نشان دهد که می گوید رمزگذاری انجام نشده است و دکمه ای را برای کاربر فراهم می کند تا بتواند دستگاه را تنظیم کند.
کلید رمزگذاری شده را ذخیره کنید
کلید رمزگذاری شده در ابرداده رمزنگاری ذخیره می شود. پشتیبان سخت افزاری با استفاده از قابلیت امضای Trusted Excation Environment (TEE) اجرا می شود. پیش از این ، ما کلید اصلی را با یک کلید تولید شده با استفاده از scrypt بر روی رمز عبور کاربر و نمک ذخیره شده رمزگذاری کردیم. به منظور ایجاد مقاومت کلیدی در برابر حملات خارج از جعبه ، ما این الگوریتم را با امضای کلید حاصل با یک کلید TEE ذخیره شده گسترش می دهیم. امضای حاصل با یک کاربرد دیگر از Scrypt به یک کلید طول مناسب تبدیل می شود. سپس این کلید برای رمزگذاری و رمزگشایی کلید اصلی استفاده می شود. برای ذخیره این کلید:
- کلید رمزگذاری دیسک 16 بایت (DEK) و نمک 16 بایت تولید کنید.
- برای تولید کلید میانی 32 بایت 1 (IK1) Scrypt را روی رمز عبور کاربر و نمک اعمال کنید.
- پد IK1 با بایت صفر به اندازه کلید خصوصی محدود به سخت افزار (HBK). به طور خاص ، ما به عنوان: 00 || IK1 || 00..00 ؛ یک بایت صفر ، 32 بایت IK1 ، 223 بایت صفر.
- IK1 را با HBK علامت گذاری کنید تا 256 بایت IK2 تولید کند.
- Scrypt را به IK2 و نمک (همان نمک مرحله 2) بمالید تا 32 بایت IK3 تولید شود.
- از 16 بایت اول IK3 به عنوان Kek و 16 بایت آخر به عنوان IV استفاده کنید.
- رمزگذاری DEK با AES_CBC ، با Key Kek و بردار اولیه سازی IV.
رمز عبور را تغییر دهید
هنگامی که یک کاربر تصمیم به تغییر یا حذف رمز عبور خود در تنظیمات می کند ، UI دستور cryptfs changepw
به vold
ارسال می کند ، و vold
با رمز عبور جدید ، کلید اصلی دیسک را دوباره رمزگذاری می کند.
خواص رمزگذاری
vold
و init
با تنظیم خصوصیات با یکدیگر ارتباط برقرار می کنند. در اینجا لیستی از خصوصیات موجود برای رمزگذاری وجود دارد.
خواص ناخوشایند
اموال | توضیحات |
---|---|
vold.decrypt trigger_encryption | درایو را بدون رمز عبور رمزگذاری کنید. |
vold.decrypt trigger_default_encryption | درایو را بررسی کنید تا ببینید آیا بدون رمز عبور رمزگذاری شده است یا خیر. اگر اینطور باشد ، رمزگشایی و نصب کنید ، در غیر این صورت vold.decrypt تنظیم کنید تا trigger_restart_min_framework. |
vold.decrypt trigger_reset_main | تنظیم شده توسط ولد برای خاموش کردن UI درخواست رمز عبور دیسک. |
vold.decrypt trigger_post_fs_data | تنظیم شده توسط ولد برای آماده سازی /data با دایرکتوری های لازم ، و همکاران. |
vold.decrypt trigger_restart_framework | تنظیم شده توسط ولد برای شروع چارچوب واقعی و کلیه خدمات. |
vold.decrypt trigger_shutdown_framework | تنظیم شده توسط ولد برای خاموش کردن چارچوب کامل برای شروع رمزگذاری. |
vold.decrypt trigger_restart_min_framework | بسته به مقدار ro.crypto.state ، توسط Vold برای شروع UI نوار پیشرفت برای رمزگذاری یا درخواست رمز عبور تنظیم شده است. |
vold.encrypt_progress | هنگامی که چارچوب شروع به کار کرد ، اگر این ویژگی تنظیم شود ، حالت UI Progress Bar را وارد کنید. |
vold.encrypt_progress 0 to 100 | UI Progress Bar باید مجموعه درصد را نشان دهد. |
vold.encrypt_progress error_partially_encrypted | UI Progress Bar باید پیامی را نشان دهد که رمزگذاری شکست خورده است و گزینه ای را برای تنظیم مجدد دستگاه به کاربر می دهد. |
vold.encrypt_progress error_reboot_failed | UI نوار پیشرفت باید پیامی را نشان دهد که رمزگذاری تکمیل شده است و دکمه ای را برای راه اندازی مجدد دستگاه به کاربر می دهد. انتظار نمی رود این خطا اتفاق بیفتد. |
vold.encrypt_progress error_not_encrypted | UI نوار پیشرفت باید پیامی را نشان دهد که خطایی رخ داده است ، هیچ داده ای رمزگذاری شده یا گم نشده است و دکمه ای را برای استفاده مجدد از سیستم به کاربر می دهد. |
vold.encrypt_progress error_shutting_down | UI نوار پیشرفت در حال اجرا نیست ، بنابراین مشخص نیست چه کسی به این خطا پاسخ می دهد. و هرگز نباید به هر حال اتفاق بیفتد. |
vold.post_fs_data_done 0 | قبل از تنظیم vold.decrypt برای trigger_post_fs_data توسط vold تنظیم شده است. |
vold.post_fs_data_done 1 | تنظیم شده توسط init.rc یا init.rc درست پس از اتمام کار post-fs-data . |
خواص اولیه
اموال | توضیحات |
---|---|
ro.crypto.fs_crypto_blkdev | تنظیم شده توسط checkpw Command vold برای استفاده بعدی توسط restart دستور vold . |
ro.crypto.state unencrypted | تنظیم شده توسط init برای گفتن این سیستم با رمزگذاری بدون رمزگذاری /data ro.crypto.state encrypted است. تنظیم شده توسط init برای گفتن این سیستم با یک رمزگذاری /data در حال اجرا است. |
| این پنج ویژگی هنگامی که سعی در نصب /data با پارامترهای منتقل شده از init.rc دارد ، توسط init تنظیم می شوند. vold از اینها برای تنظیم نقشه برداری رمزنگاری استفاده می کند. |
ro.crypto.tmpfs_options | تنظیم شده توسط init.rc با گزینه های اولیه باید هنگام نصب سیستم فایل 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