ফুল-ডিস্ক এনক্রিপশন

ফুল-ডিস্ক এনক্রিপশন হল একটি এনক্রিপ্ট করা কী ব্যবহার করে একটি অ্যান্ড্রয়েড ডিভাইসে ব্যবহারকারীর সমস্ত ডেটা এনকোড করার প্রক্রিয়া। একবার একটি ডিভাইস এনক্রিপ্ট হয়ে গেলে, ব্যবহারকারীর তৈরি করা সমস্ত ডেটা ডিস্কে কমিট করার আগে স্বয়ংক্রিয়ভাবে এনক্রিপ্ট হয়ে যায় এবং কলিং প্রক্রিয়ায় ফেরত দেওয়ার আগে সমস্ত পাঠ স্বয়ংক্রিয়ভাবে ডেটা ডিক্রিপ্ট করে।

4.4 সালে অ্যান্ড্রয়েডে ফুল-ডিস্ক এনক্রিপশন চালু করা হয়েছিল, কিন্তু অ্যান্ড্রয়েড 5.0 এই নতুন বৈশিষ্ট্যগুলি চালু করেছে:

  • দ্রুত এনক্রিপশন তৈরি করা হয়েছে, যা শুধুমাত্র ডেটা পার্টিশনে ব্যবহৃত ব্লকগুলিকে এনক্রিপ্ট করে যাতে প্রথম বুটে বেশি সময় লাগে না। শুধুমাত্র ext4 এবং f2fs ফাইল সিস্টেমগুলি বর্তমানে দ্রুত এনক্রিপশন সমর্থন করে।
  • প্রথম বুটে এনক্রিপ্ট করতে forceencrypt fstab পতাকা যোগ করা হয়েছে।
  • একটি পাসওয়ার্ড ছাড়া নিদর্শন এবং এনক্রিপশন জন্য সমর্থন যোগ করা হয়েছে.
  • ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্টের (টিইই) স্বাক্ষর করার ক্ষমতা ব্যবহার করে এনক্রিপশন কীটির হার্ডওয়্যার-ব্যাকড স্টোরেজ যোগ করা হয়েছে (যেমন একটি ট্রাস্টজোনে)। আরও বিস্তারিত জানার জন্য এনক্রিপ্ট করা কী সংরক্ষণ করা দেখুন।

সতর্কতা: অ্যান্ড্রয়েড 5.0-এ আপগ্রেড করা এবং তারপর এনক্রিপ্ট করা ডিভাইসগুলি ফ্যাক্টরি ডেটা রিসেট করে একটি এনক্রিপ্ট করা অবস্থায় ফিরে যেতে পারে। প্রথম বুটে এনক্রিপ্ট করা নতুন অ্যান্ড্রয়েড 5.0 ডিভাইসগুলি এনক্রিপ্ট করা অবস্থায় ফেরত দেওয়া যাবে না।

কিভাবে Android ফুল-ডিস্ক এনক্রিপশন কাজ করে

অ্যান্ড্রয়েড ফুল-ডিস্ক এনক্রিপশন dm-crypt এর উপর ভিত্তি করে তৈরি করা হয়েছে, যা একটি কার্নেল বৈশিষ্ট্য যা ব্লক ডিভাইস স্তরে কাজ করে। এই কারণে, এনক্রিপশন এমবেডেড মাল্টিমিডিয়াকার্ড ( eMMC) এবং অনুরূপ ফ্ল্যাশ ডিভাইসগুলির সাথে কাজ করে যা ব্লক ডিভাইস হিসাবে কার্নেলের কাছে নিজেদের উপস্থাপন করে। YAFFS এর সাথে এনক্রিপশন সম্ভব নয়, যা সরাসরি একটি কাঁচা NAND ফ্ল্যাশ চিপের সাথে কথা বলে।

এনক্রিপশন অ্যালগরিদম হল 128 অ্যাডভান্সড এনক্রিপশন স্ট্যান্ডার্ড (AES) সাইফার-ব্লক চেইনিং (CBC) এবং ESSIV:SHA256 সহ। ওপেনএসএসএল লাইব্রেরিতে কল করার মাধ্যমে মাস্টার কীটি 128-বিট AES দিয়ে এনক্রিপ্ট করা হয়েছে। কীটির জন্য আপনাকে অবশ্যই 128 বিট বা তার বেশি ব্যবহার করতে হবে (256টি ঐচ্ছিক)।

দ্রষ্টব্য: OEMগুলি মাস্টার কী এনক্রিপ্ট করতে 128-বিট বা উচ্চতর ব্যবহার করতে পারে৷

অ্যান্ড্রয়েড 5.0 রিলিজে, চার ধরনের এনক্রিপশন স্টেট রয়েছে:

  • ডিফল্ট
  • পিন
  • পাসওয়ার্ড
  • প্যাটার্ন

প্রথম বুট করার পরে, ডিভাইসটি এলোমেলোভাবে তৈরি করা 128-বিট মাস্টার কী তৈরি করে এবং তারপর এটিকে একটি ডিফল্ট পাসওয়ার্ড এবং সঞ্চিত লবণ দিয়ে হ্যাশ করে। ডিফল্ট পাসওয়ার্ড হল: "default_password" যাইহোক, ফলস্বরূপ হ্যাশটি একটি TEE (যেমন TrustZone) এর মাধ্যমেও স্বাক্ষরিত হয়, যা মাস্টার কী এনক্রিপ্ট করতে স্বাক্ষরের একটি হ্যাশ ব্যবহার করে।

আপনি Android Open Source Project cryptfs.cpp ফাইলে সংজ্ঞায়িত ডিফল্ট পাসওয়ার্ড খুঁজে পেতে পারেন।

যখন ব্যবহারকারী ডিভাইসে পিন/পাস বা পাসওয়ার্ড সেট করে, তখন শুধুমাত্র 128-বিট কী পুনরায় এনক্রিপ্ট করা হয় এবং সংরক্ষণ করা হয়। (অর্থাৎ ব্যবহারকারীর পিন/পাস/প্যাটার্ন পরিবর্তন ব্যবহারকারীর ডেটার পুনঃএনক্রিপশন ঘটায় না।) মনে রাখবেন যে পরিচালিত ডিভাইস পিন, প্যাটার্ন বা পাসওয়ার্ড সীমাবদ্ধতার বিষয় হতে পারে।

এনক্রিপশন init এবং vold দ্বারা পরিচালিত হয়। init কল করে vold , এবং vold বৈশিষ্ট্যগুলিকে init-এ ইভেন্টগুলি ট্রিগার করতে সেট করে। সিস্টেমের অন্যান্য অংশগুলিও কাজগুলি পরিচালনা করার জন্য বৈশিষ্ট্যগুলি দেখে যেমন রিপোর্ট স্ট্যাটাস, একটি পাসওয়ার্ড চাওয়া, বা মারাত্মক ত্রুটির ক্ষেত্রে ফ্যাক্টরি রিসেট করার প্রম্পট। vold এ এনক্রিপশন বৈশিষ্ট্যগুলি চালু করতে, সিস্টেমটি কমান্ড লাইন টুল vdc এর cryptfs কমান্ডগুলি ব্যবহার করে: 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_stop : একটি পরিষেবা বন্ধ করে এবং একটি SVC_DISABLED পতাকা যোগ করে। বন্ধ করা পরিষেবাগুলি class_start সাড়া দেয় না।

প্রবাহিত হয়

একটি এনক্রিপ্ট করা ডিভাইসের জন্য চারটি প্রবাহ রয়েছে। একটি ডিভাইস শুধুমাত্র একবার এনক্রিপ্ট করা হয় এবং তারপর একটি স্বাভাবিক বুট প্রবাহ অনুসরণ করে।

  • পূর্বে এনক্রিপ্ট করা একটি ডিভাইস এনক্রিপ্ট করুন:
    • forceencrypt সহ একটি নতুন ডিভাইস এনক্রিপ্ট করুন: প্রথম বুটে বাধ্যতামূলক এনক্রিপশন (অ্যান্ড্রয়েড এল থেকে শুরু)।
    • একটি বিদ্যমান ডিভাইস এনক্রিপ্ট করুন: ব্যবহারকারী-সূচিত এনক্রিপশন (Android K এবং পূর্ববর্তী)।
  • একটি এনক্রিপ্ট করা ডিভাইস বুট করুন:
    • কোনো পাসওয়ার্ড ছাড়াই একটি এনক্রিপ্ট করা ডিভাইস শুরু করা: একটি এনক্রিপ্ট করা ডিভাইস বুট করা যার কোনো সেট পাসওয়ার্ড নেই (অ্যান্ড্রয়েড 5.0 এবং তার পরের ডিভাইসের জন্য প্রাসঙ্গিক)।
    • একটি পাসওয়ার্ড দিয়ে একটি এনক্রিপ্ট করা ডিভাইস শুরু করা: একটি সেট পাসওয়ার্ড আছে এমন একটি এনক্রিপ্ট করা ডিভাইস বুট করা।

এই প্রবাহগুলি ছাড়াও, ডিভাইসটি /data এনক্রিপ্ট করতেও ব্যর্থ হতে পারে। প্রতিটি প্রবাহ নীচে বিশদভাবে ব্যাখ্যা করা হয়েছে।

ফোর্সএনক্রিপ্ট দিয়ে একটি নতুন ডিভাইস এনক্রিপ্ট করুন

এটি একটি Android 5.0 ডিভাইসের জন্য স্বাভাবিক প্রথম বুট।

  1. forceencrypt পতাকা সহ এনক্রিপ্ট করা ফাইল সিস্টেম সনাক্ত করুন

    /data এনক্রিপ্ট করা হয় না কিন্তু হওয়া দরকার কারণ forceencrypt এটিকে বাধ্যতামূলক করে। আনমাউন্ট /data

  2. /data এনক্রিপ্ট করা শুরু করুন

    vold.decrypt = "trigger_encryption" init.rc ট্রিগার করে, যার ফলে vold কোনো পাসওয়ার্ড ছাড়াই /data এনক্রিপ্ট করবে। (কোনও সেট নেই কারণ এটি একটি নতুন ডিভাইস হওয়া উচিত।)

  3. মাউন্ট tmpfs

    vold একটি tmpfs /data মাউন্ট করে ( ro.crypto.tmpfs_options থেকে tmpfs বিকল্পগুলি ব্যবহার করে) এবং প্রপার্টি vold.encrypt_progress 0 এ সেট করে। vold একটি এনক্রিপ্ট করা সিস্টেম বুট করার জন্য tmpfs /data প্রস্তুত করে এবং প্রপার্টি vold.decrypt trigger_restart_min_framework সেট করে:

  4. অগ্রগতি দেখানোর জন্য কাঠামো আনুন

    যেহেতু ডিভাইসটিতে এনক্রিপ্ট করার জন্য কার্যত কোন ডেটা নেই, তাই অগ্রগতি বারটি প্রায়শই প্রদর্শিত হবে না কারণ এনক্রিপশন এত দ্রুত ঘটে। অগ্রগতি UI সম্পর্কে আরও বিস্তারিত জানার জন্য একটি বিদ্যমান ডিভাইস এনক্রিপ্ট করুন দেখুন।

  5. যখন /data এনক্রিপ্ট করা হয়, ফ্রেমওয়ার্ক নামিয়ে নিন

    vold vold.decrypt trigger_default_encryption এ সেট করে যা defaultcrypto পরিষেবা শুরু করে। (এটি একটি ডিফল্ট এনক্রিপ্ট করা ব্যবহারকারীর ডেটা মাউন্ট করার জন্য নীচের প্রবাহ শুরু করে।) trigger_default_encryption এনক্রিপশনের ধরনটি পরীক্ষা করে দেখতে পারে যে /data পাসওয়ার্ড সহ বা ছাড়া এনক্রিপ্ট করা হয়েছে কিনা। যেহেতু অ্যান্ড্রয়েড 5.0 ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা হয়েছে, সেখানে কোনও পাসওয়ার্ড সেট করা উচিত নয়; তাই আমরা ডিক্রিপ্ট করি এবং /data মাউন্ট করি।

  6. মাউন্ট /data

    init তারপর ro.crypto.tmpfs_options থেকে নেওয়া প্যারামিটার ব্যবহার করে tmpfs RAMDisk-এ /data মাউন্ট করে, যা init.rc এ সেট করা আছে।

  7. ফ্রেমওয়ার্ক শুরু করুন

    vold vold.decrypt trigger_restart_framework এ সেট করে, যা স্বাভাবিক বুট প্রক্রিয়া অব্যাহত রাখে।

একটি বিদ্যমান ডিভাইস এনক্রিপ্ট করুন

আপনি যখন এনক্রিপ্ট না করা Android K বা আগের ডিভাইসটিকে L-এ স্থানান্তরিত করা হয়েছে এনক্রিপ্ট করেন তখন এটি ঘটে।

এই প্রক্রিয়াটি ব্যবহারকারীর দ্বারা শুরু করা হয়েছে এবং কোডে "ইনপ্লেস এনক্রিপশন" হিসাবে উল্লেখ করা হয়েছে। যখন একজন ব্যবহারকারী একটি ডিভাইস এনক্রিপ্ট করার জন্য নির্বাচন করেন, তখন UI নিশ্চিত করে যে ব্যাটারি সম্পূর্ণরূপে চার্জ করা হয়েছে এবং AC অ্যাডাপ্টারটি প্লাগ ইন করা আছে যাতে এনক্রিপশন প্রক্রিয়াটি শেষ করার জন্য পর্যাপ্ত শক্তি থাকে।

সতর্কতা: এনক্রিপ্ট করা শেষ হওয়ার আগেই ডিভাইসটির পাওয়ার ফুরিয়ে গেলে এবং বন্ধ হয়ে গেলে, ফাইল ডেটা আংশিকভাবে এনক্রিপ্ট করা অবস্থায় রেখে দেওয়া হয়। ডিভাইসটিকে অবশ্যই ফ্যাক্টরি রিসেট করতে হবে এবং সমস্ত ডেটা হারিয়ে যাবে৷

ইনপ্লেস এনক্রিপশন সক্ষম করতে, vold আসল ব্লক ডিভাইসের প্রতিটি সেক্টর পড়ার জন্য একটি লুপ শুরু করে এবং তারপরে এটি ক্রিপ্টো ব্লক ডিভাইসে লিখুন। একটি সেক্টর পড়ার এবং লেখার আগে এটি ব্যবহার করা হচ্ছে কিনা তা দেখতে vold চেক করে, যা একটি নতুন ডিভাইসে এনক্রিপশনকে অনেক দ্রুত করে তোলে যাতে খুব কম ডেটা নেই।

ডিভাইসের অবস্থা : ro.crypto.state = "unencrypted" সেট করুন এবং বুটিং চালিয়ে যেতে on nonencrypted init ট্রিগারটি চালান।

  1. পাসওয়ার্ড চেক করুন

    UI cryptfs enablecrypto inplace কমান্ড সহ vold কল করে যেখানে passwd হল ব্যবহারকারীর লক স্ক্রীন পাসওয়ার্ড।

  2. ফ্রেমওয়ার্ক নামিয়ে নিন

    ভুলের জন্য vold চেক করে, এনক্রিপ্ট করতে না পারলে -1 রিটার্ন করে এবং লগে একটি কারণ প্রিন্ট করে। যদি এটি এনক্রিপ্ট করতে পারে তবে এটি প্রপার্টি vold.decrypt কে trigger_shutdown_framework এ সেট করে। এর ফলে late_start এবং main ক্লাসে init.rc পরিষেবা বন্ধ করে দেয়।

  3. একটি ক্রিপ্টো ফুটার তৈরি করুন
  4. একটি ব্রেডক্রাম্ব ফাইল তৈরি করুন
  5. রিবুট করুন
  6. ব্রেডক্রাম্ব ফাইল সনাক্ত করুন
  7. /data এনক্রিপ্ট করা শুরু করুন

    vold তারপরে ক্রিপ্টো ম্যাপিং সেট আপ করে, যা একটি ভার্চুয়াল ক্রিপ্টো ব্লক ডিভাইস তৈরি করে যা আসল ব্লক ডিভাইসে ম্যাপ করে কিন্তু প্রতিটি সেক্টরকে যেমন লেখা আছে এনক্রিপ্ট করে এবং প্রতিটি সেক্টর পড়ার সাথে সাথে ডিক্রিপ্ট করে। vold তারপর ক্রিপ্টো মেটাডেটা তৈরি করে এবং লেখে।

  8. এটি এনক্রিপ্ট করার সময়, মাউন্ট tmpfs

    vold একটি tmpfs /data মাউন্ট করে ( ro.crypto.tmpfs_options থেকে tmpfs বিকল্পগুলি ব্যবহার করে) এবং প্রপার্টি vold.encrypt_progress 0 এ সেট করে। vold একটি এনক্রিপ্ট করা সিস্টেম বুট করার জন্য tmpfs /data প্রস্তুত করে এবং প্রপার্টি vold.decrypt trigger_restart_min_framework সেট করে:

  9. অগ্রগতি দেখানোর জন্য কাঠামো আনুন

    trigger_restart_min_framework init.rc পরিষেবার main ক্লাস শুরু করে। যখন ফ্রেমওয়ার্ক দেখতে পায় যে vold.encrypt_progress 0 এ সেট করা আছে, তখন এটি অগ্রগতি বার UI নিয়ে আসে, যা প্রতি পাঁচ সেকেন্ডে সেই বৈশিষ্ট্যটি অনুসন্ধান করে এবং একটি অগ্রগতি বার আপডেট করে। এনক্রিপশন লুপ যখনই পার্টিশনের অন্য শতাংশ এনক্রিপ্ট করে vold.encrypt_progress আপডেট করে।

  10. যখন /data এনক্রিপ্ট করা হয়, তখন ক্রিপ্টো ফুটার আপডেট করুন

    যখন /data সফলভাবে এনক্রিপ্ট করা হয়, vold মেটাডেটাতে ENCRYPTION_IN_PROGRESS পতাকা সাফ করে।

    যখন ডিভাইসটি সফলভাবে আনলক করা হয়, তখন পাসওয়ার্ডটি মাস্টার কী এনক্রিপ্ট করতে ব্যবহার করা হয় এবং ক্রিপ্টো ফুটার আপডেট করা হয়।

    কোনো কারণে রিবুট ব্যর্থ হলে, vold প্রপার্টি vold.encrypt_progress কে error_reboot_failed এ সেট করে এবং UI একটি বার্তা প্রদর্শন করবে যাতে ব্যবহারকারীকে রিবুট করার জন্য একটি বোতাম টিপতে বলা হয়। এটি কখনই ঘটবে বলে আশা করা যায় না।

ডিফল্ট এনক্রিপশন সহ একটি এনক্রিপ্ট করা ডিভাইস শুরু করা হচ্ছে

আপনি যখন পাসওয়ার্ড ছাড়াই একটি এনক্রিপ্ট করা ডিভাইস বুট আপ করেন তখন এটি ঘটে। যেহেতু Android 5.0 ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা হয়েছে, সেখানে কোনও সেট পাসওয়ার্ড থাকা উচিত নয় এবং তাই এটি ডিফল্ট এনক্রিপশন অবস্থা।

  1. কোনো পাসওয়ার্ড ছাড়াই এনক্রিপ্ট করা /data সনাক্ত করুন

    শনাক্ত করুন যে অ্যান্ড্রয়েড ডিভাইসটি এনক্রিপ্ট করা হয়েছে কারণ /data মাউন্ট করা যাবে না এবং পতাকাগুলির মধ্যে একটি encryptable বা forceencrypt সেট করা আছে৷

    vold vold.decrypt trigger_default_encryption এ সেট করে, যা defaultcrypto পরিষেবা শুরু করে। trigger_default_encryption এনক্রিপশন টাইপ চেক করে দেখতে পারে যে /data পাসওয়ার্ড সহ বা ছাড়া এনক্রিপ্ট করা হয়েছে কিনা।

  2. ডিক্রিপ্ট/ডেটা

    ব্লক ডিভাইসের উপর dm-crypt ডিভাইস তৈরি করে যাতে ডিভাইসটি ব্যবহারের জন্য প্রস্তুত হয়।

  3. মাউন্ট/ডেটা

    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 ডিভাইসটি এনক্রিপ্ট করা হয়েছে কারণ পতাকা ro.crypto.state = "encrypted"

    vold vold.decrypt trigger_restart_min_framework এ সেট করে কারণ /data একটি পাসওয়ার্ড দিয়ে এনক্রিপ্ট করা হয়।

  2. মাউন্ট tmpfs

    init.rc থেকে পাস করা পরামিতি সহ /data র জন্য প্রদত্ত প্রাথমিক মাউন্ট বিকল্পগুলি সংরক্ষণ করতে init পাঁচটি বৈশিষ্ট্য সেট করে। 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 (ASCII 8-সংখ্যার হেক্স নম্বর 0x এর আগে)
  3. পাসওয়ার্ডের জন্য প্রম্পট করার জন্য ফ্রেমওয়ার্ক শুরু করুন

    ফ্রেমওয়ার্ক শুরু হয় এবং দেখতে পায় যে vold.decrypt trigger_restart_min_framework এ সেট করা আছে। এটি ফ্রেমওয়ার্ককে বলে যে এটি একটি tmpfs /data ডিস্কে বুট করছে এবং এটি ব্যবহারকারীর পাসওয়ার্ড পেতে হবে।

    যাইহোক, প্রথমত, এটি নিশ্চিত করতে হবে যে ডিস্কটি সঠিকভাবে এনক্রিপ্ট করা হয়েছে। এটি voldcryptfs cryptocomplete কমান্ড পাঠায়। এনক্রিপশন সফলভাবে সম্পন্ন হলে vold 0 প্রদান করে, অভ্যন্তরীণ ত্রুটিতে -1, অথবা এনক্রিপশন সফলভাবে সম্পন্ন না হলে -2 প্রদান করে। vold CRYPTO_ENCRYPTION_IN_PROGRESS পতাকার জন্য ক্রিপ্টো মেটাডেটা দেখে এটি নির্ধারণ করে। এটি সেট করা থাকলে, এনক্রিপশন প্রক্রিয়া বাধাগ্রস্ত হয়েছিল এবং ডিভাইসে কোনও ব্যবহারযোগ্য ডেটা নেই৷ যদি vold একটি ত্রুটি ফেরত দেয়, তাহলে UI ব্যবহারকারীকে ডিভাইসটি রিবুট এবং ফ্যাক্টরি রিসেট করার জন্য একটি বার্তা প্রদর্শন করবে এবং ব্যবহারকারীকে এটি করার জন্য একটি বোতাম টিপতে হবে।

  4. পাসওয়ার্ড দিয়ে ডেটা ডিক্রিপ্ট করুন

    একবার cryptfs cryptocomplete সফল হলে, ফ্রেমওয়ার্ক ডিস্কের পাসওয়ার্ড চাওয়ার জন্য একটি UI প্রদর্শন করে। UI voldcryptfs checkpw কমান্ড পাঠিয়ে পাসওয়ার্ড পরীক্ষা করে। যদি পাসওয়ার্ডটি সঠিক হয় (যা সফলভাবে একটি অস্থায়ী অবস্থানে ডিক্রিপ্ট করা /data মাউন্ট করার মাধ্যমে নির্ধারিত হয়, তারপর এটি আনমাউন্ট করা হয়), vold ডিক্রিপ্ট করা ব্লক ডিভাইসের নাম ro.crypto.fs_crypto_blkdev প্রপার্টিতে সংরক্ষণ করে এবং UI-তে স্থিতি 0 ফেরত দেয়। . পাসওয়ার্ডটি ভুল হলে, এটি UI-তে -1 ফেরত দেয়।

  5. ফ্রেমওয়ার্ক বন্ধ করুন

    UI একটি ক্রিপ্টো বুট গ্রাফিক রাখে এবং তারপর cryptfs restart কমান্ডের সাথে vold কল করে। vold প্রপার্টি vold.decrypt trigger_reset_main এ সেট করে, যার ফলে init.rc class_reset main করতে পারে। এটি প্রধান শ্রেণীর সমস্ত পরিষেবা বন্ধ করে দেয়, যা tmpfs /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 1 এ সেট করবে। একবার 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 এর তারপর একটি বার্তা প্রদর্শন করা উচিত যে এনক্রিপশন ব্যর্থ হয়েছে এবং ব্যবহারকারীকে ডিভাইসটি ফ্যাক্টরি রিসেট করার জন্য একটি বোতাম সরবরাহ করবে।

এনক্রিপ্ট করা কী সংরক্ষণ করা হচ্ছে

এনক্রিপ্ট করা কী ক্রিপ্টো মেটাডেটাতে সংরক্ষণ করা হয়। ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্টের (TEE) স্বাক্ষর করার ক্ষমতা ব্যবহার করে হার্ডওয়্যার ব্যাকিং প্রয়োগ করা হয়। পূর্বে, আমরা ব্যবহারকারীর পাসওয়ার্ড এবং সঞ্চিত লবণে স্ক্রিপ্ট প্রয়োগ করে তৈরি করা একটি কী দিয়ে মাস্টার কী এনক্রিপ্ট করেছি। অফ-বক্স আক্রমণের বিরুদ্ধে কীটিকে স্থিতিস্থাপক করার জন্য, আমরা একটি সংরক্ষিত TEE কী সহ ফলাফল কী স্বাক্ষর করে এই অ্যালগরিদমটি প্রসারিত করি। ফলস্বরূপ স্বাক্ষরটিকে তারপরে স্ক্রিপ্টের আরও একটি প্রয়োগের মাধ্যমে একটি উপযুক্ত দৈর্ঘ্যের কীতে পরিণত করা হয়। এই কীটি তারপর মাস্টার কী এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহৃত হয়। এই কী সংরক্ষণ করতে:

  1. এলোমেলো 16-বাইট ডিস্ক এনক্রিপশন কী (DEK) এবং 16-বাইট লবণ তৈরি করুন।
  2. 32-বাইট ইন্টারমিডিয়েট কী 1 (IK1) তৈরি করতে ব্যবহারকারীর পাসওয়ার্ড এবং লবণে স্ক্রিপ্ট প্রয়োগ করুন।
  3. হার্ডওয়্যার-বাউন্ড প্রাইভেট কী (HBK) এর আকারে শূন্য বাইট সহ প্যাড IK1। বিশেষভাবে, আমরা এইভাবে প্যাড করি: 00 || IK1 || 00..00; একটি শূন্য বাইট, 32 IK1 বাইট, 223 শূন্য বাইট।
  4. 256-বাইট IK2 তৈরি করতে HBK-এর সাথে প্যাডেড IK1 সাইন করুন।
  5. 32-বাইট IK3 তৈরি করতে IK2 এবং লবণ (ধাপ 2 হিসাবে একই লবণ) স্ক্রিপ্ট প্রয়োগ করুন।
  6. IK3 এর প্রথম 16 বাইট KEK হিসাবে এবং শেষ 16 বাইট IV হিসাবে ব্যবহার করুন।
  7. AES_CBC এর সাথে DEK এনক্রিপ্ট করুন, কী KEK সহ, এবং ইনিশিয়ালাইজেশন ভেক্টর IV।

পাসওয়ার্ড পরিবর্তন করা হচ্ছে

যখন কোনো ব্যবহারকারী সেটিংসে তাদের পাসওয়ার্ড পরিবর্তন বা অপসারণ করতে নির্বাচন করেন, তখন UI voldcryptfs changepw কমান্ড পাঠায় এবং 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 দ্বারা সেট করুন।
vold.decrypt trigger_restart_min_framework ro.crypto.state এর মানের উপর নির্ভর করে এনক্রিপশন বা পাসওয়ার্ডের জন্য প্রম্পটের জন্য প্রগ্রেস বার UI শুরু করতে ভল্ড দ্বারা সেট করুন।
vold.encrypt_progress যখন ফ্রেমওয়ার্ক শুরু হয়, যদি এই বৈশিষ্ট্যটি সেট করা থাকে, তাহলে অগ্রগতি বার UI মোডে প্রবেশ করুন।
vold.encrypt_progress 0 to 100 অগ্রগতি বার UI-তে শতকরা মান সেট প্রদর্শন করা উচিত।
vold.encrypt_progress error_partially_encrypted অগ্রগতি বার UI একটি বার্তা প্রদর্শন করবে যে এনক্রিপশন ব্যর্থ হয়েছে, এবং ব্যবহারকারীকে ডিভাইসটিকে ফ্যাক্টরি রিসেট করার একটি বিকল্প দিতে হবে।
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 to 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 কমান্ড restart পরবর্তীতে ব্যবহারের জন্য vold কমান্ড checkpw দ্বারা সেট করুন।
ro.crypto.state unencrypted init দ্বারা সেট করুন যে এই সিস্টেমটি একটি unencrypted /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 দ্বারা সেট করা হয় যখন এটি init.rc থেকে পাস করা পরামিতি সহ /data মাউন্ট করার চেষ্টা করে। vold ক্রিপ্টো ম্যাপিং সেটআপ করতে এগুলি ব্যবহার করে।
ro.crypto.tmpfs_options tmpfs /data ফাইলসিস্টেম মাউন্ট করার সময় init ব্যবহার করা উচিত বিকল্পগুলির সাথে init.rc দ্বারা সেট করুন।

ক্রিয়া শুরু করুন

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