رمزگذاری فول دیسک

رمزگذاری فول دیسک فرآیند رمزگذاری تمام داده های کاربر در دستگاه اندرویدی با استفاده از یک کلید رمزگذاری شده است. هنگامی که یک دستگاه رمزگذاری می شود، تمام داده های ایجاد شده توسط کاربر به طور خودکار قبل از انتقال آن به دیسک رمزگذاری می شوند و همه داده ها به طور خودکار قبل از بازگرداندن آنها به فرآیند تماس، رمزگشایی می شوند.

رمزگذاری فول دیسک در نسخه 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 نصب شده است. این به اندروید اجازه می‌دهد تا رمزهای عبور را درخواست کند، پیشرفت را نشان دهد یا در صورت نیاز پاک کردن داده‌ها را پیشنهاد کند. این محدودیت را تحمیل می کند که برای جابجایی از سیستم فایل موقت به سیستم فایل واقعی /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 است.

  1. شناسایی سیستم فایل رمزگذاری نشده با پرچم forceencrypt

    /data رمزگذاری نشده است، اما باید رمزگذاری شود زیرا forceencrypt آن را الزامی می کند. حذف /data .

  2. رمزگذاری /data شروع کنید

    vold.decrypt = "trigger_encryption" init.rc راه‌اندازی می‌کند که باعث می‌شود vold /data بدون رمز عبور رمزگذاری کند. (هیچ کدام تنظیم نشده است زیرا باید دستگاه جدیدی باشد.)

  3. tmpfs را سوار کنید

    vold یک tmpfs /data /data را نصب trigger_restart_min_framework (با استفاده از گزینه‌های tmpfs از ro.crypto.tmpfs_options ) و ویژگی vold.encrypt_progress vold.decrypt روی 0 تنظیم vold .

  4. چارچوبی را برای نشان دادن پیشرفت بیاورید

    از آنجایی که دستگاه عملا هیچ داده ای برای رمزگذاری ندارد، نوار پیشرفت اغلب ظاهر نمی شود زیرا رمزگذاری خیلی سریع اتفاق می افتد. برای جزئیات بیشتر در مورد رابط کاربری پیشرفت، به رمزگذاری یک دستگاه موجود مراجعه کنید.

  5. هنگامی که /data رمزگذاری شده است، چارچوب را حذف کنید

    vold vold.decrypt را روی trigger_default_encryption قرار می‌دهد که سرویس defaultcrypto را شروع می‌کند. (این کار جریان زیر را برای نصب داده‌های کاربری رمزگذاری شده پیش‌فرض شروع می‌کند.) trigger_default_encryption نوع رمزگذاری را بررسی می‌کند تا ببیند /data با رمز عبور یا بدون رمزگذاری رمزگذاری شده است. از آنجایی که دستگاه‌های Android 5.0 در اولین بوت رمزگذاری می‌شوند، نباید رمز عبوری تنظیم شود. بنابراین ما /data را رمزگشایی و mount می کنیم.

  6. Mount /data

    init سپس /data بر روی tmpfs RAMDisk با استفاده از پارامترهایی که از ro.crypto.tmpfs_options انتخاب می‌کند، که در init.rc تنظیم شده است، نصب می‌کند.

  7. چارچوب را شروع کنید

    vold vold.decrypt روی trigger_restart_framework قرار می‌دهد، که فرآیند بوت معمول را ادامه می‌دهد.

یک دستگاه موجود را رمزگذاری کنید

این چیزی است که زمانی اتفاق می افتد که یک Android K رمزگذاری نشده یا دستگاه قبلی را که به L منتقل شده است رمزگذاری کنید.

این فرآیند توسط کاربر آغاز می شود و در کد به آن "رمزگذاری درونی" می گویند. وقتی کاربر رمزگذاری دستگاهی را انتخاب می‌کند، رابط کاربری مطمئن می‌شود که باتری کاملاً شارژ شده و آداپتور برق متناوب به برق وصل است، بنابراین انرژی کافی برای تکمیل فرآیند رمزگذاری وجود دارد.

هشدار: اگر برق دستگاه تمام شود و قبل از پایان رمزگذاری خاموش شود، داده‌های فایل در حالت نیمه رمزگذاری شده باقی می‌مانند. دستگاه باید به حالت کارخانه بازنشانی شود و تمام داده ها از بین می روند.

برای فعال کردن رمزگذاری داخلی، vold یک حلقه را برای خواندن هر بخش از دستگاه بلوک واقعی شروع می‌کند و سپس آن را در دستگاه بلوک کریپتو می‌نویسد. vold بررسی می کند که آیا یک بخش قبل از خواندن و نوشتن آن استفاده می شود یا خیر، که باعث می شود رمزگذاری در دستگاه جدیدی که داده کم یا بدون داده است، بسیار سریعتر شود.

وضعیت دستگاه : ro.crypto.state = "unencrypted" را تنظیم کنید و برای ادامه راه‌اندازی، ماشه init on nonencrypted را اجرا کنید.

  1. رمز عبور را بررسی کنید

    UI با دستور cryptfs enablecrypto inplace در جایی که passwd رمز عبور صفحه قفل کاربر است، vold فراخوانی می‌کند.

  2. چارچوب را بردارید

    vold خطاها را بررسی می‌کند، اگر نتواند رمزگذاری کند -1 را برمی‌گرداند و دلیلی را در گزارش چاپ می‌کند. اگر بتواند رمزگذاری کند، ویژگی vold.decrypt را روی trigger_shutdown_framework تنظیم می کند. این باعث می‌شود که init.rc سرویس‌ها را در کلاس‌های late_start و main متوقف کند.

  3. یک پاورقی رمزنگاری ایجاد کنید
  4. یک فایل پودر سوخاری ایجاد کنید
  5. راه اندازی مجدد
  6. شناسایی فایل پودر سوخاری
  7. رمزگذاری /data شروع کنید

    سپس vold نقشه رمزنگاری را راه‌اندازی می‌کند، که یک دستگاه بلوک کریپتو مجازی ایجاد می‌کند که بر روی دستگاه بلاک واقعی نقشه می‌گیرد، اما هر بخش را همانطور که نوشته شده رمزگذاری می‌کند، و هر بخش را هنگام خواندن رمزگشایی می‌کند. vold سپس ابرداده رمزنگاری را ایجاد و می نویسد.

  8. در حالی که در حال رمزگذاری است، tmpfs را سوار کنید

    vold یک tmpfs /data /data را نصب trigger_restart_min_framework (با استفاده از گزینه‌های tmpfs از ro.crypto.tmpfs_options ) و ویژگی vold.encrypt_progress vold.decrypt روی 0 تنظیم vold .

  9. چارچوبی را برای نشان دادن پیشرفت بیاورید

    trigger_restart_min_framework باعث می شود init.rc کلاس main خدمات را راه اندازی کند. هنگامی که فریم ورک می بیند که vold.encrypt_progress روی 0 تنظیم شده است، رابط کاربری نوار پیشرفت را نمایش می دهد، که هر پنج ثانیه یک بار آن ویژگی را درخواست می کند و یک نوار پیشرفت را به روز می کند. حلقه رمزگذاری هر بار که درصد دیگری از پارتیشن را رمزگذاری می کند، vold.encrypt_progress را به روز می کند.

  10. هنگامی که /data رمزگذاری شده است، پاورقی رمزنگاری را به روز کنید

    وقتی /data با موفقیت رمزگذاری شد، vold پرچم ENCRYPTION_IN_PROGRESS را در ابرداده پاک می‌کند.

    وقتی قفل دستگاه با موفقیت باز شد، رمز عبور برای رمزگذاری کلید اصلی استفاده می شود و پاورقی رمزنگاری به روز می شود.

    اگر راه‌اندازی مجدد به دلایلی ناموفق باشد، vold ویژگی vold.encrypt_progress را روی error_reboot_failed تنظیم می‌کند و رابط کاربری باید پیامی را نشان دهد که از کاربر می‌خواهد دکمه‌ای را برای راه‌اندازی مجدد فشار دهد. انتظار نمی رود که این هرگز رخ دهد.

یک دستگاه رمزگذاری شده را با رمزگذاری پیش فرض راه اندازی کنید

هنگامی که یک دستگاه رمزگذاری شده بدون رمز عبور را بوت می کنید، این اتفاق می افتد. از آنجایی که دستگاه‌های Android 5.0 در اولین بوت رمزگذاری می‌شوند، نباید رمز عبور تنظیم شده باشد و بنابراین این حالت رمزگذاری پیش‌فرض است.

  1. شناسایی /data رمزگذاری شده بدون رمز عبور

    تشخیص دهید که دستگاه Android رمزگذاری شده است زیرا /data قابل نصب نیست و یکی از پرچم‌های encryptable یا forceencrypt تنظیم شده است.

    vold vold.decrypt روی trigger_default_encryption قرار می‌دهد، که سرویس defaultcrypto را راه‌اندازی می‌کند. trigger_default_encryption نوع رمزگذاری را بررسی می کند تا ببیند آیا /data با رمز عبور یا بدون رمزگذاری رمزگذاری شده است.

  2. رمزگشایی /داده

    دستگاه dm-crypt را روی دستگاه بلوک ایجاد می کند تا دستگاه برای استفاده آماده شود.

  3. 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 شروع کند.

  4. چارچوب را شروع کنید

    اکنون فریم ورک تمام سرویس های خود را با استفاده از /data رمزگشایی شده بوت می کند و سیستم برای استفاده آماده است.

یک دستگاه رمزگذاری شده را بدون رمزگذاری پیش فرض راه اندازی کنید

این همان چیزی است که وقتی دستگاه رمزگذاری شده ای را که دارای رمز عبور تنظیم شده است بوت می کنید اتفاق می افتد. رمز عبور دستگاه می تواند پین، الگو یا رمز عبور باشد.

  1. دستگاه رمزگذاری شده را با رمز عبور شناسایی کنید

    تشخیص دهید که دستگاه Android رمزگذاری شده است زیرا flag ro.crypto.state = "encrypted"

    vold vold.decrypt روی trigger_restart_min_framework قرار می‌دهد زیرا /data با رمز عبور رمزگذاری شده است.

  2. tmpfs را سوار کنید

    init پنج ویژگی را برای ذخیره گزینه های mount اولیه ارائه شده برای /data با پارامترهای ارسال شده از init.rc تنظیم می کند. vold از این ویژگی ها برای تنظیم نقشه رمزنگاری استفاده می کند:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (عدد هگز 8 رقمی ASCII قبل از 0x)
  3. چارچوب را برای درخواست رمز عبور شروع کنید

    چارچوب راه اندازی می شود و می بیند که vold.decrypt روی trigger_restart_min_framework تنظیم شده است. این به فریمورک می گوید که در دیسک tmpfs /data بوت می شود و باید رمز عبور کاربر را دریافت کند.

    با این حال، ابتدا باید مطمئن شود که دیسک به درستی رمزگذاری شده است. دستور cryptfs cryptocomplete به vold می فرستد. اگر رمزگذاری با موفقیت انجام شد، vold 0، در صورت خطای داخلی -1، یا اگر رمزگذاری با موفقیت کامل نشد -2 را برمی‌گرداند. vold این را با نگاه کردن به فراداده رمزنگاری پرچم CRYPTO_ENCRYPTION_IN_PROGRESS تعیین می کند. اگر تنظیم شود، فرآیند رمزگذاری قطع شده است و هیچ داده قابل استفاده در دستگاه وجود ندارد. اگر vold خطایی را برگرداند، رابط کاربری باید پیغامی را به کاربر نشان دهد که دستگاه را راه‌اندازی مجدد و فکتوری ریست کند و دکمه‌ای را به کاربر بدهد تا برای انجام این کار فشار دهد.

  4. رمزگشایی داده ها با رمز عبور

    هنگامی که cryptfs cryptocomplete با موفقیت انجام شد، فریم ورک یک رابط کاربری نمایش می دهد که رمز عبور دیسک را درخواست می کند. رابط کاربری رمز عبور را با ارسال دستور cryptfs checkpw به vold بررسی می کند. اگر رمز عبور صحیح باشد (که با نصب موفقیت آمیز /data رمزگشایی شده در یک مکان موقت و سپس جدا کردن آن مشخص می شود)، vold نام دستگاه بلوک رمزگشایی شده را در ویژگی ro.crypto.fs_crypto_blkdev ذخیره می کند و وضعیت 0 را به UI برمی گرداند. . اگر رمز عبور نادرست باشد، -1 را به UI برمی گرداند.

  5. چارچوب را متوقف کنید

    UI یک گرافیک بوت کریپتو قرار می دهد و سپس با دستور cryptfs restart vold فراخوانی می کند. vold ویژگی vold.decrypt را روی trigger_reset_main تنظیم می کند که باعث می شود init.rc class_reset main را انجام دهد. این کار تمام سرویس‌های کلاس اصلی را متوقف می‌کند، که به tmpfs /data اجازه می‌دهد تا از حالت نصب خارج شوند.

  6. 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 شروع کند.

  7. فریمورک کامل را شروع کنید

    اکنون فریم ورک تمام سرویس های خود را با استفاده از سیستم فایل /data رمزگشایی شده بوت می کند و سیستم آماده استفاده است.

شکست

دستگاهی که رمزگشایی نمی کند ممکن است به چند دلیل نادرست باشد. دستگاه با یک سری مراحل معمولی برای راه اندازی شروع می شود:

  1. دستگاه رمزگذاری شده را با رمز عبور شناسایی کنید
  2. tmpfs را سوار کنید
  3. چارچوب را برای درخواست رمز عبور شروع کنید

اما پس از باز شدن فریم ورک، دستگاه ممکن است با برخی از خطاها مواجه شود:

  • رمز عبور مطابقت دارد اما نمی تواند داده ها را رمزگشایی کند
  • کاربر 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 به یک کلید طول مناسب تبدیل می شود. سپس از این کلید برای رمزگذاری و رمزگشایی کلید اصلی استفاده می شود. برای ذخیره این کلید:

  1. کلید رمزگذاری دیسک تصادفی 16 بایتی (DEK) و نمک 16 بایتی ایجاد کنید.
  2. برای تولید کلید میانی 1 (IK1) 32 بایتی، رمزگذاری را روی رمز عبور کاربر و نمک اعمال کنید.
  3. پد IK1 با صفر بایت به اندازه کلید خصوصی سخت افزاری (HBK). به طور خاص، ما پد را به عنوان: 00 || IK1 || 00..00; یک بایت صفر، 32 بایت IK1، 223 بایت صفر.
  4. علامت IK1 با HBK برای تولید IK2 256 بایت.
  5. برای تولید IK3 32 بایتی، scrypt را روی IK2 و نمک (همان نمک مرحله 2) اعمال کنید.
  6. از 16 بایت اول IK3 به عنوان KEK و از 16 بایت آخر به عنوان IV استفاده کنید.
  7. رمزگذاری 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 رمزگذاری شده اجرا می شود.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

این پنج ویژگی توسط 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 نصب شده است. این به اندروید اجازه می‌دهد تا رمزهای عبور را درخواست کند، پیشرفت را نشان دهد یا در صورت نیاز پاک کردن داده‌ها را پیشنهاد کند. این محدودیت را تحمیل می کند که برای جابجایی از سیستم فایل موقت به سیستم فایل واقعی /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 است.

  1. شناسایی سیستم فایل رمزگذاری نشده با پرچم forceencrypt

    /data رمزگذاری نشده است، اما باید رمزگذاری شود زیرا forceencrypt آن را الزامی می کند. حذف /data .

  2. رمزگذاری /data شروع کنید

    vold.decrypt = "trigger_encryption" init.rc راه‌اندازی می‌کند که باعث می‌شود vold /data بدون رمز عبور رمزگذاری کند. (هیچ کدام تنظیم نشده است زیرا باید دستگاه جدیدی باشد.)

  3. tmpfs را سوار کنید

    vold یک tmpfs /data /data را نصب trigger_restart_min_framework (با استفاده از گزینه‌های tmpfs از ro.crypto.tmpfs_options ) و ویژگی vold.encrypt_progress vold.decrypt روی 0 تنظیم vold .

  4. چارچوبی را برای نشان دادن پیشرفت بیاورید

    از آنجایی که دستگاه عملا هیچ داده ای برای رمزگذاری ندارد، نوار پیشرفت اغلب ظاهر نمی شود زیرا رمزگذاری خیلی سریع اتفاق می افتد. برای جزئیات بیشتر در مورد رابط کاربری پیشرفت، به رمزگذاری یک دستگاه موجود مراجعه کنید.

  5. هنگامی که /data رمزگذاری شده است، چارچوب را حذف کنید

    vold vold.decrypt را روی trigger_default_encryption قرار می‌دهد که سرویس defaultcrypto را شروع می‌کند. (این کار جریان زیر را برای نصب داده‌های کاربری رمزگذاری شده پیش‌فرض شروع می‌کند.) trigger_default_encryption نوع رمزگذاری را بررسی می‌کند تا ببیند /data با رمز عبور یا بدون رمزگذاری رمزگذاری شده است. از آنجایی که دستگاه‌های Android 5.0 در اولین بوت رمزگذاری می‌شوند، نباید رمز عبوری تنظیم شود. بنابراین ما /data را رمزگشایی و mount می کنیم.

  6. Mount /data

    init سپس /data بر روی tmpfs RAMDisk با استفاده از پارامترهایی که از ro.crypto.tmpfs_options انتخاب می‌کند، که در init.rc تنظیم شده است، نصب می‌کند.

  7. چارچوب را شروع کنید

    vold vold.decrypt روی trigger_restart_framework قرار می‌دهد، که فرآیند بوت معمول را ادامه می‌دهد.

یک دستگاه موجود را رمزگذاری کنید

این چیزی است که زمانی اتفاق می افتد که یک Android K رمزگذاری نشده یا دستگاه قبلی را که به L منتقل شده است رمزگذاری کنید.

این فرآیند توسط کاربر آغاز می شود و در کد به آن "رمزگذاری درونی" می گویند. وقتی کاربر رمزگذاری دستگاهی را انتخاب می‌کند، رابط کاربری مطمئن می‌شود که باتری کاملاً شارژ شده و آداپتور برق متناوب به برق وصل است، بنابراین انرژی کافی برای تکمیل فرآیند رمزگذاری وجود دارد.

هشدار: اگر برق دستگاه تمام شود و قبل از پایان رمزگذاری خاموش شود، داده‌های فایل در حالت نیمه رمزگذاری شده باقی می‌مانند. دستگاه باید به حالت کارخانه بازنشانی شود و تمام داده ها از بین می روند.

برای فعال کردن رمزگذاری داخلی، vold یک حلقه را برای خواندن هر بخش از دستگاه بلوک واقعی شروع می‌کند و سپس آن را در دستگاه بلوک کریپتو می‌نویسد. vold بررسی می کند که آیا یک بخش قبل از خواندن و نوشتن آن استفاده می شود یا خیر، که باعث می شود رمزگذاری در دستگاه جدیدی که داده کم یا بدون داده است، بسیار سریعتر شود.

وضعیت دستگاه : ro.crypto.state = "unencrypted" را تنظیم کنید و برای ادامه راه‌اندازی، ماشه init on nonencrypted را اجرا کنید.

  1. رمز عبور را بررسی کنید

    UI با دستور cryptfs enablecrypto inplace در جایی که passwd رمز عبور صفحه قفل کاربر است، vold فراخوانی می‌کند.

  2. چارچوب را بردارید

    vold خطاها را بررسی می‌کند، اگر نتواند رمزگذاری کند -1 را برمی‌گرداند و دلیلی را در گزارش چاپ می‌کند. اگر بتواند رمزگذاری کند، ویژگی vold.decrypt را روی trigger_shutdown_framework تنظیم می کند. این باعث می‌شود که init.rc سرویس‌ها را در کلاس‌های late_start و main متوقف کند.

  3. یک پاورقی رمزنگاری ایجاد کنید
  4. یک فایل پودر سوخاری ایجاد کنید
  5. راه اندازی مجدد
  6. شناسایی فایل پودر سوخاری
  7. رمزگذاری /data شروع کنید

    سپس vold نقشه رمزنگاری را راه‌اندازی می‌کند، که یک دستگاه بلوک کریپتو مجازی ایجاد می‌کند که بر روی دستگاه بلاک واقعی نقشه می‌گیرد، اما هر بخش را همانطور که نوشته شده رمزگذاری می‌کند، و هر بخش را هنگام خواندن رمزگشایی می‌کند. vold سپس ابرداده رمزنگاری را ایجاد و می نویسد.

  8. در حالی که در حال رمزگذاری است، tmpfs را سوار کنید

    vold یک tmpfs /data /data را نصب trigger_restart_min_framework (با استفاده از گزینه‌های tmpfs از ro.crypto.tmpfs_options ) و ویژگی vold.encrypt_progress vold.decrypt روی 0 تنظیم vold .

  9. چارچوبی را برای نشان دادن پیشرفت بیاورید

    trigger_restart_min_framework باعث می شود init.rc کلاس main خدمات را راه اندازی کند. هنگامی که فریم ورک می بیند که vold.encrypt_progress روی 0 تنظیم شده است، رابط کاربری نوار پیشرفت را نمایش می دهد، که هر پنج ثانیه یک بار آن ویژگی را درخواست می کند و یک نوار پیشرفت را به روز می کند. حلقه رمزگذاری هر بار که درصد دیگری از پارتیشن را رمزگذاری می کند، vold.encrypt_progress را به روز می کند.

  10. هنگامی که /data رمزگذاری شده است، پاورقی رمزنگاری را به روز کنید

    وقتی /data با موفقیت رمزگذاری شد، vold پرچم ENCRYPTION_IN_PROGRESS را در ابرداده پاک می‌کند.

    وقتی قفل دستگاه با موفقیت باز شد، رمز عبور برای رمزگذاری کلید اصلی استفاده می شود و پاورقی رمزنگاری به روز می شود.

    اگر راه‌اندازی مجدد به دلایلی ناموفق باشد، vold ویژگی vold.encrypt_progress را روی error_reboot_failed تنظیم می‌کند و رابط کاربری باید پیامی را نشان دهد که از کاربر می‌خواهد دکمه‌ای را برای راه‌اندازی مجدد فشار دهد. انتظار نمی رود که این هرگز رخ دهد.

یک دستگاه رمزگذاری شده را با رمزگذاری پیش فرض راه اندازی کنید

هنگامی که یک دستگاه رمزگذاری شده بدون رمز عبور را بوت می کنید، این اتفاق می افتد. از آنجایی که دستگاه‌های Android 5.0 در اولین بوت رمزگذاری می‌شوند، نباید رمز عبور تنظیم شده باشد و بنابراین این حالت رمزگذاری پیش‌فرض است.

  1. شناسایی /data رمزگذاری شده بدون رمز عبور

    تشخیص دهید که دستگاه Android رمزگذاری شده است زیرا /data قابل نصب نیست و یکی از پرچم‌های encryptable یا forceencrypt تنظیم شده است.

    vold vold.decrypt روی trigger_default_encryption قرار می‌دهد، که سرویس defaultcrypto را راه‌اندازی می‌کند. trigger_default_encryption نوع رمزگذاری را بررسی می کند تا ببیند آیا /data با رمز عبور یا بدون رمزگذاری رمزگذاری شده است.

  2. رمزگشایی /داده

    دستگاه dm-crypt را روی دستگاه بلوک ایجاد می کند تا دستگاه برای استفاده آماده شود.

  3. 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 شروع کند.

  4. چارچوب را شروع کنید

    اکنون فریم ورک تمام سرویس های خود را با استفاده از /data رمزگشایی شده بوت می کند و سیستم برای استفاده آماده است.

یک دستگاه رمزگذاری شده را بدون رمزگذاری پیش فرض راه اندازی کنید

این همان چیزی است که وقتی دستگاه رمزگذاری شده ای را که دارای رمز عبور تنظیم شده است بوت می کنید اتفاق می افتد. رمز عبور دستگاه می تواند پین، الگو یا رمز عبور باشد.

  1. دستگاه رمزگذاری شده را با رمز عبور شناسایی کنید

    تشخیص دهید که دستگاه Android رمزگذاری شده است زیرا flag ro.crypto.state = "encrypted"

    vold vold.decrypt روی trigger_restart_min_framework قرار می‌دهد زیرا /data با رمز عبور رمزگذاری شده است.

  2. tmpfs را سوار کنید

    init پنج ویژگی را برای ذخیره گزینه های mount اولیه ارائه شده برای /data با پارامترهای ارسال شده از init.rc تنظیم می کند. vold از این ویژگی ها برای تنظیم نقشه رمزنگاری استفاده می کند:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (عدد هگز 8 رقمی ASCII قبل از 0x)
  3. چارچوب را شروع کنید تا از رمز عبور استفاده کنید

    این چارچوب شروع می شود و می بیند که vold.decrypt برای trigger_restart_min_framework تنظیم شده است. این به این چارچوب می گوید که در حال بوت شدن بر روی دیسک TMPFS /data است و باید رمز عبور کاربر را بدست آورد.

    با این حال ، اول ، باید اطمینان حاصل کند که دیسک به درستی رمزگذاری شده است. این فرمان cryptfs cryptocomplete به vold ارسال می کند. اگر رمزگذاری با موفقیت به پایان رسید ، -1 بر روی خطای داخلی یا -2 در صورت انجام رمزگذاری با موفقیت انجام شد ، vold 0 را برمی گرداند. vold این کار را با نگاه کردن به ابرداده رمزنگاری برای پرچم CRYPTO_ENCRYPTION_IN_PROGRESS تعیین می کند. در صورت تنظیم ، فرآیند رمزگذاری قطع شد و هیچ داده قابل استفاده در دستگاه وجود ندارد. اگر vold خطایی را برگرداند ، UI باید پیام را به کاربر نشان دهد تا مجدداً دستگاه را مجدداً تنظیم کند و به کاربر یک دکمه را برای فشار دادن به کاربر ارائه دهد.

  4. داده های رمزگشایی را با رمز را رمزگشایی کنید

    هنگامی که cryptfs cryptocomplete موفقیت آمیز است ، چارچوب یک UI را نشان می دهد که رمز عبور دیسک را درخواست می کند. UI با ارسال دستور cryptfs checkpw به vold رمز عبور را بررسی می کند. اگر رمز عبور صحیح است (که با نصب موفقیت آمیز داده های رمزگشایی شده /data در یک مکان موقت تعیین می شود ، سپس آن را از بین می برد) ، vold نام دستگاه بلوک رمزگشایی شده را در ویژگی ro.crypto.fs_crypto_blkdev ذخیره می کند و وضعیت 0 را به UI باز می گرداند . اگر رمز عبور نادرست باشد ، -1 به UI باز می گردد.

  5. چارچوب را متوقف کنید

    UI یک گرافیک بوت Crypto را قرار می دهد و سپس با cryptfs restart vold تماس می گیرد. vold ویژگی vold.decrypt را به trigger_reset_main تنظیم می کند ، که باعث می شود init.rc class_reset main را انجام دهد. این کار تمام خدمات را در کلاس اصلی متوقف می کند ، که اجازه می دهد تا TMPF /data از بین بروند.

  6. نصب /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 شروع کند.

  7. چارچوب کامل را شروع کنید

    اکنون این چارچوب تمام خدمات خود را با استفاده از سیستم فایل رمزگشایی /data ، بوت می کند و سیستم برای استفاده آماده است.

شکست

دستگاهی که در رمزگشایی نتواند به چند دلیل ناخوشایند باشد. دستگاه با سری عادی مراحل برای بوت شدن شروع می شود:

  1. دستگاه رمزگذاری شده را با یک رمز عبور تشخیص دهید
  2. کوه tmpfs
  3. چارچوب را شروع کنید تا از رمز عبور استفاده کنید

اما پس از باز شدن چارچوب ، دستگاه می تواند با برخی از خطاها روبرو شود:

  • رمز عبور مطابقت دارد اما نمی تواند داده ها را رمزگشایی کند
  • کاربر 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 به یک کلید طول مناسب تبدیل می شود. سپس این کلید برای رمزگذاری و رمزگشایی کلید اصلی استفاده می شود. برای ذخیره این کلید:

  1. کلید رمزگذاری دیسک 16 بایت (DEK) و نمک 16 بایت تولید کنید.
  2. برای تولید کلید میانی 32 بایت 1 (IK1) Scrypt را روی رمز عبور کاربر و نمک اعمال کنید.
  3. پد IK1 با بایت صفر به اندازه کلید خصوصی محدود به سخت افزار (HBK). به طور خاص ، ما به عنوان: 00 || IK1 || 00..00 ؛ یک بایت صفر ، 32 بایت IK1 ، 223 بایت صفر.
  4. IK1 را با HBK علامت گذاری کنید تا 256 بایت IK2 تولید کند.
  5. Scrypt را به IK2 و نمک (همان نمک مرحله 2) بمالید تا 32 بایت IK3 تولید شود.
  6. از 16 بایت اول IK3 به عنوان Kek و 16 بایت آخر به عنوان IV استفاده کنید.
  7. رمزگذاری 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 در حال اجرا است.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

این پنج ویژگی هنگامی که سعی در نصب /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