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

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

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

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

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

অ্যান্ড্রয়েড ফুল-ডিস্ক এনক্রিপশন কীভাবে কাজ করে

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

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

দ্রষ্টব্য: OEM গুলি মাস্টার কী এনক্রিপ্ট করার জন্য ১২৮-বিট বা তার বেশি ব্যবহার করতে পারে।

অ্যান্ড্রয়েড ৫.০ রিলিজে, চার ধরণের এনক্রিপশন অবস্থা রয়েছে:

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

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

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

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

এনক্রিপশন 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_start : একটি পরিষেবা পুনরায় চালু করে।
  • class_stop : একটি পরিষেবা বন্ধ করে এবং একটি SVC_DISABLED ফ্ল্যাগ যোগ করে। বন্ধ করা পরিষেবাগুলি class_start এ সাড়া দেয় না।

প্রবাহিত হয়

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

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

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

forceencrypt ব্যবহার করে একটি নতুন ডিভাইস এনক্রিপ্ট করুন

এটি একটি অ্যান্ড্রয়েড ৫.০ ডিভাইসের জন্য স্বাভাবিক প্রথম বুট।

  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 পরিষেবা শুরু করে। (এটি একটি ডিফল্ট এনক্রিপ্টেড userdata মাউন্ট করার জন্য নীচের প্রবাহ শুরু করে।) trigger_default_encryption এনক্রিপশনের ধরণ পরীক্ষা করে দেখে যে /data পাসওয়ার্ড সহ বা ছাড়াই এনক্রিপ্ট করা হয়েছে কিনা। যেহেতু Android 5.0 ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা হয়, তাই কোনও পাসওয়ার্ড সেট করা উচিত নয়; তাই আমরা /data ডিক্রিপ্ট এবং মাউন্ট করি।

  6. মাউন্ট /data

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

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

    vold vold.decrypt trigger_restart_framework এ সেট করে, যা স্বাভাবিক বুট প্রক্রিয়া চালিয়ে যায়।

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

যখন আপনি একটি আনএনক্রিপ্টেড অ্যান্ড্রয়েড কে বা তার আগের ডিভাইস এনক্রিপ্ট করেন যা 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 এ সেট করে। এর ফলে init.rc late_start এবং main ক্লাসে পরিষেবা বন্ধ করে দেয়।

  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 ব্যবহারকারীকে রিবুট করার জন্য একটি বোতাম টিপতে বলার জন্য একটি বার্তা প্রদর্শন করবে। এটি কখনও ঘটবে বলে আশা করা যায় না।

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

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

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

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

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

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

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

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

    vold তারপর ডিক্রিপ্ট করা real /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. পাসওয়ার্ড সহ এনক্রিপ্ট করা ডিভাইস সনাক্ত করুন

    ro.crypto.state = "encrypted" ফ্ল্যাগের কারণে Android ডিভাইসটি এনক্রিপ্ট করা আছে কিনা তা সনাক্ত করুন

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

  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 ৮-সংখ্যার হেক্স সংখ্যা যার পূর্বে ০x থাকে)
  3. পাসওয়ার্ডের জন্য অনুরোধ জানাতে ফ্রেমওয়ার্ক শুরু করুন

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

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

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

    cryptfs cryptocomplete সফল হলে, ফ্রেমওয়ার্কটি ডিস্ক পাসওয়ার্ড জিজ্ঞাসা করে একটি UI প্রদর্শন করে। UI cryptfs checkpw কমান্ডটি vold এ পাঠিয়ে পাসওয়ার্ডটি পরীক্ষা করে। যদি পাসওয়ার্ডটি সঠিক হয় (যা ডিক্রিপ্টেড /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 করতে বাধ্য হয়। এটি 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. পাসওয়ার্ডের জন্য অনুরোধ জানাতে ফ্রেমওয়ার্ক শুরু করুন

কিন্তু ফ্রেমওয়ার্ক খোলার পরে, ডিভাইসটি কিছু ত্রুটির সম্মুখীন হতে পারে:

  • পাসওয়ার্ড মিলেছে কিন্তু ডেটা ডিক্রিপ্ট করতে পারছে না
  • ব্যবহারকারী ৩০ বার ভুল পাসওয়ার্ড প্রবেশ করান

যদি এই ত্রুটিগুলি সমাধান না হয়, তাহলে ব্যবহারকারীকে ফ্যাক্টরি ওয়াইপ করতে বলুন :

যদি 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. এলোমেলোভাবে ১৬-বাইট ডিস্ক এনক্রিপশন কী (DEK) এবং ১৬-বাইট লবণ তৈরি করুন।
  2. ব্যবহারকারীর পাসওয়ার্ডে স্ক্রিপ্ট এবং ৩২-বাইট ইন্টারমিডিয়েট কী ১ (IK1) তৈরি করতে লবণ প্রয়োগ করুন।
  3. হার্ডওয়্যার-বাউন্ড প্রাইভেট কী (HBK) এর আকারে শূন্য বাইট দিয়ে IK1 প্যাড করুন। বিশেষ করে, আমরা এইভাবে প্যাড করি: 00 || IK1 || 00..00; একটি শূন্য বাইট, 32 IK1 বাইট, 223 শূন্য বাইট।
  4. ২৫৬-বাইট IK2 তৈরি করতে HBK দিয়ে প্যাডেড IK1 সাইন করুন।
  5. ৩২-বাইট IK3 তৈরি করতে IK2 এবং লবণে (ধাপ ২ এর মতো একই লবণ) স্ক্রিপ্ট প্রয়োগ করুন।
  6. IK3 এর প্রথম ১৬ বাইট KEK হিসেবে এবং শেষ ১৬ বাইট IV হিসেবে ব্যবহার করুন।
  7. AES_CBC দিয়ে DEK এনক্রিপ্ট করুন, 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 দ্বারা সেট করুন।
vold.decrypt trigger_post_fs_data vold দ্বারা প্রয়োজনীয় ডিরেক্টরি সহ prep /data সেট করা, ইত্যাদি।
vold.decrypt trigger_restart_framework আসল কাঠামো এবং সমস্ত পরিষেবা শুরু করার জন্য vold দ্বারা সেট করা হয়েছে।
vold.decrypt trigger_shutdown_framework এনক্রিপশন শুরু করার জন্য সম্পূর্ণ ফ্রেমওয়ার্ক বন্ধ করার জন্য vold দ্বারা সেট করা হয়েছে।
vold.decrypt trigger_restart_min_framework ro.crypto.state এর মানের উপর নির্ভর করে এনক্রিপশনের জন্য অগ্রগতি বার UI শুরু করতে অথবা পাসওয়ার্ডের জন্য অনুরোধ জানাতে vold দ্বারা সেট করুন।
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 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 পরবর্তীতে ব্যবহারের জন্য 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

init.rc থেকে পাস করা প্যারামিটার দিয়ে /data মাউন্ট করার চেষ্টা করার সময় init এই পাঁচটি বৈশিষ্ট্য সেট করে। vold ক্রিপ্টো ম্যাপিং সেটআপ করার জন্য এগুলি ব্যবহার করে।
ro.crypto.tmpfs_options tmpfs /data ফাইল সিস্টেম মাউন্ট করার সময় init-এর ব্যবহার করা উচিত এমন বিকল্পগুলির সাথে init.rc দ্বারা সেট করুন।

init অ্যাকশন

on post-fs-data
on nonencrypted
on property:vold.decrypt=trigger_reset_main
on property:vold.decrypt=trigger_post_fs_data
on property:vold.decrypt=trigger_restart_min_framework
on property:vold.decrypt=trigger_restart_framework
on property:vold.decrypt=trigger_shutdown_framework
on property:vold.decrypt=trigger_encryption
on property:vold.decrypt=trigger_default_encryption