ফুল-ডিস্ক এনক্রিপশন হল একটি এনক্রিপ্টেড কী ব্যবহার করে একটি অ্যান্ড্রয়েড ডিভাইসে সমস্ত ব্যবহারকারীর ডেটা এনকোড করার প্রক্রিয়া। একবার একটি ডিভাইস এনক্রিপ্ট হয়ে গেলে, ব্যবহারকারীর তৈরি সমস্ত ডেটা ডিস্কে জমা দেওয়ার আগে স্বয়ংক্রিয়ভাবে এনক্রিপ্ট হয়ে যায় এবং সমস্ত রিড স্বয়ংক্রিয়ভাবে ডেটা ডিক্রিপ্ট করে কলিং প্রক্রিয়ায় ফিরিয়ে আনে।
৪.৪ সালে অ্যান্ড্রয়েডে ফুল-ডিস্ক এনক্রিপশন চালু করা হয়েছিল, কিন্তু অ্যান্ড্রয়েড ৫.০ এই নতুন বৈশিষ্ট্যগুলি চালু করেছে:
- দ্রুত এনক্রিপশন তৈরি করা হয়েছে, যা শুধুমাত্র ডেটা পার্টিশনে ব্যবহৃত ব্লকগুলিকে এনক্রিপ্ট করে যাতে প্রথম বুটে দীর্ঘ সময় না লাগে। বর্তমানে শুধুমাত্র ext4 এবং f2fs ফাইল সিস্টেম দ্রুত এনক্রিপশন সমর্থন করে।
- প্রথম বুটে এনক্রিপ্ট করার জন্য
forceencryptfstab পতাকা যোগ করা হয়েছে। - পাসওয়ার্ড ছাড়াই প্যাটার্ন এবং এনক্রিপশনের জন্য সমর্থন যোগ করা হয়েছে।
- ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্ট (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 ব্যবহার করে একটি নতুন ডিভাইস এনক্রিপ্ট করুন
এটি একটি অ্যান্ড্রয়েড ৫.০ ডিভাইসের জন্য স্বাভাবিক প্রথম বুট।
-
forceencryptপতাকা ব্যবহার করে এনক্রিপ্ট না করা ফাইল সিস্টেম সনাক্ত করুন/dataএনক্রিপ্ট করা হয়নি কিন্তু এটি করা প্রয়োজন কারণforceencryptএটিকে বাধ্যতামূলক করে।/dataআনমাউন্ট করুন। -
/dataএনক্রিপ্ট করা শুরু করুনvold.decrypt = "trigger_encryption"init.rcট্রিগার করে, যার ফলেvoldকোন পাসওয়ার্ড ছাড়াই/dataএনক্রিপ্ট করে। (কোনটিও সেট করা নেই কারণ এটি একটি নতুন ডিভাইস হওয়া উচিত।) - tmpfs মাউন্ট করুন
voldএকটি tmpfs/dataমাউন্ট করে (ro.crypto.tmpfs_optionsথেকে tmpfs বিকল্প ব্যবহার করে) এবংvold.encrypt_progressবৈশিষ্ট্যটি 0 তে সেট করে।voldএকটি এনক্রিপ্ট করা সিস্টেম বুট করার জন্য tmpfs/dataপ্রস্তুত করে এবংvold.decryptবৈশিষ্ট্যটি এতে সেট করে:trigger_restart_min_framework - অগ্রগতি দেখানোর জন্য কাঠামো তৈরি করুন
যেহেতু ডিভাইসটিতে এনক্রিপ্ট করার জন্য কার্যত কোনও ডেটা নেই, তাই এনক্রিপশন এত দ্রুত ঘটে বলে অগ্রগতি বারটি প্রায়শই প্রদর্শিত হবে না। অগ্রগতি UI সম্পর্কে আরও বিশদের জন্য একটি বিদ্যমান ডিভাইস এনক্রিপ্ট করুন দেখুন।
- যখন
/dataএনক্রিপ্ট করা হয়, তখন ফ্রেমওয়ার্কটি সরিয়ে ফেলুনvoldvold.decrypttrigger_default_encryptionএ সেট করে যাdefaultcryptoপরিষেবা শুরু করে। (এটি একটি ডিফল্ট এনক্রিপ্টেড userdata মাউন্ট করার জন্য নীচের প্রবাহ শুরু করে।)trigger_default_encryptionএনক্রিপশনের ধরণ পরীক্ষা করে দেখে যে/dataপাসওয়ার্ড সহ বা ছাড়াই এনক্রিপ্ট করা হয়েছে কিনা। যেহেতু Android 5.0 ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা হয়, তাই কোনও পাসওয়ার্ড সেট করা উচিত নয়; তাই আমরা/dataডিক্রিপ্ট এবং মাউন্ট করি। - মাউন্ট
/datainitতারপরro.crypto.tmpfs_optionsথেকে সংগ্রহ করা প্যারামিটার ব্যবহার করে একটি tmpfs RAMDisk-এ/dataমাউন্ট করে, যাinit.rcএ সেট করা আছে। - ফ্রেমওয়ার্ক শুরু করুন
voldvold.decrypttrigger_restart_frameworkএ সেট করে, যা স্বাভাবিক বুট প্রক্রিয়া চালিয়ে যায়।
একটি বিদ্যমান ডিভাইস এনক্রিপ্ট করুন
যখন আপনি একটি আনএনক্রিপ্টেড অ্যান্ড্রয়েড কে বা তার আগের ডিভাইস এনক্রিপ্ট করেন যা L তে মাইগ্রেট করা হয়েছে তখন এটি ঘটে।
এই প্রক্রিয়াটি ব্যবহারকারী-প্রবর্তিত এবং কোডে এটিকে "ইনপ্লেস এনক্রিপশন" বলা হয়। যখন একজন ব্যবহারকারী একটি ডিভাইস এনক্রিপ্ট করতে চান, তখন UI নিশ্চিত করে যে ব্যাটারিটি সম্পূর্ণরূপে চার্জ করা হয়েছে এবং AC অ্যাডাপ্টারটি প্লাগ ইন করা আছে যাতে এনক্রিপশন প্রক্রিয়াটি শেষ করার জন্য পর্যাপ্ত শক্তি থাকে।
সতর্কতা: যদি ডিভাইসটির বিদ্যুৎ শেষ হয়ে যায় এবং এনক্রিপ্ট করা শেষ হওয়ার আগেই এটি বন্ধ হয়ে যায়, তাহলে ফাইল ডেটা আংশিকভাবে এনক্রিপ্ট করা অবস্থায় থাকবে। ডিভাইসটি ফ্যাক্টরি রিসেট করতে হবে এবং সমস্ত ডেটা হারিয়ে যাবে।
ইনপ্লেস এনক্রিপশন সক্ষম করার জন্য, vold আসল ব্লক ডিভাইসের প্রতিটি সেক্টর পড়ার জন্য একটি লুপ শুরু করে এবং তারপর এটি ক্রিপ্টো ব্লক ডিভাইসে লিখে। vold কোনও সেক্টর পড়ার এবং লেখার আগে এটি ব্যবহার করা হচ্ছে কিনা তা পরীক্ষা করে, যা খুব কম বা কোনও ডেটা ছাড়াই একটি নতুন ডিভাইসে এনক্রিপশনকে অনেক দ্রুত করে তোলে।
ডিভাইসের অবস্থা : ro.crypto.state = "unencrypted" সেট করুন এবং বুট করা চালিয়ে যেতে on nonencrypted init ট্রিগারটি কার্যকর করুন।
- পাসওয়ার্ড পরীক্ষা করুন
UI
cryptfs enablecrypto inplaceকমান্ড ব্যবহার করেvoldকল করে যেখানেpasswdহল ব্যবহারকারীর লক স্ক্রিন পাসওয়ার্ড। - কাঠামোটি নামিয়ে ফেলুন
voldত্রুটি পরীক্ষা করে, এনক্রিপ্ট করতে না পারলে -1 প্রদান করে এবং লগে একটি কারণ প্রিন্ট করে। যদি এটি এনক্রিপ্ট করতে পারে, তাহলে এটিvold.decryptপ্রোপার্টিটিকেtrigger_shutdown_frameworkএ সেট করে। এর ফলেinit.rclate_startএবংmainক্লাসে পরিষেবা বন্ধ করে দেয়। - একটি ক্রিপ্টো ফুটার তৈরি করুন
- একটি ব্রেডক্রাম্ব ফাইল তৈরি করুন
- রিবুট করুন
- ব্রেডক্রাম্ব ফাইল সনাক্ত করুন
-
/dataএনক্রিপ্ট করা শুরু করুনএরপর
voldক্রিপ্টো ম্যাপিং সেট আপ করে, যা একটি ভার্চুয়াল ক্রিপ্টো ব্লক ডিভাইস তৈরি করে যা আসল ব্লক ডিভাইসে ম্যাপ করে কিন্তু প্রতিটি সেক্টরকে লেখার সাথে সাথে এনক্রিপ্ট করে এবং প্রতিটি সেক্টর পড়ার সাথে সাথে ডিক্রিপ্ট করে।voldতারপর ক্রিপ্টো মেটাডেটা তৈরি করে এবং লেখে। - এনক্রিপ্ট করার সময়, tmpfs মাউন্ট করুন
voldএকটি tmpfs/dataমাউন্ট করে (ro.crypto.tmpfs_optionsথেকে tmpfs বিকল্প ব্যবহার করে) এবংvold.encrypt_progressবৈশিষ্ট্যটি 0 তে সেট করে।voldএকটি এনক্রিপ্ট করা সিস্টেম বুট করার জন্য tmpfs/dataপ্রস্তুত করে এবংvold.decryptবৈশিষ্ট্যটি এতে সেট করে:trigger_restart_min_framework - অগ্রগতি দেখানোর জন্য কাঠামো তৈরি করুন
trigger_restart_min_frameworkফলেinit.rcmainশ্রেণীর পরিষেবা শুরু করে। যখন ফ্রেমওয়ার্কটি দেখে যেvold.encrypt_progress0 তে সেট করা আছে, তখন এটি প্রগতি বার UI নিয়ে আসে, যা প্রতি পাঁচ সেকেন্ডে সেই বৈশিষ্ট্যটি অনুসন্ধান করে এবং একটি প্রগতি বার আপডেট করে। এনক্রিপশন লুপ প্রতিবার পার্টিশনের অন্য শতাংশ এনক্রিপ্ট করার সময়vold.encrypt_progressআপডেট করে। -
/dataএনক্রিপ্ট করা হলে, ক্রিপ্টো ফুটার আপডেট করুনযখন
/dataসফলভাবে এনক্রিপ্ট করা হয়, তখনvoldমেটাডেটাতেENCRYPTION_IN_PROGRESSপতাকাটি সাফ করে।যখন ডিভাইসটি সফলভাবে আনলক করা হয়, তখন পাসওয়ার্ডটি মাস্টার কী এনক্রিপ্ট করতে ব্যবহার করা হয় এবং ক্রিপ্টো ফুটার আপডেট করা হয়।
যদি কোনও কারণে রিবুট ব্যর্থ হয়, তাহলে
voldvold.encrypt_progressপ্রপার্টিটিকেerror_reboot_failedএ সেট করে এবং UI ব্যবহারকারীকে রিবুট করার জন্য একটি বোতাম টিপতে বলার জন্য একটি বার্তা প্রদর্শন করবে। এটি কখনও ঘটবে বলে আশা করা যায় না।
ডিফল্ট এনক্রিপশন সহ একটি এনক্রিপ্ট করা ডিভাইস শুরু করুন
পাসওয়ার্ড ছাড়াই এনক্রিপ্ট করা ডিভাইস বুট করলে এটিই ঘটে। যেহেতু অ্যান্ড্রয়েড ৫.০ ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা থাকে, তাই কোনও সেট পাসওয়ার্ড থাকা উচিত নয় এবং তাই এটি ডিফল্ট এনক্রিপশন অবস্থা।
- পাসওয়ার্ড ছাড়াই এনক্রিপ্ট করা
/dataসনাক্ত করুন/dataমাউন্ট করা যাচ্ছে না এবংencryptableবাforceencryptফ্ল্যাগগুলির মধ্যে একটি সেট করা আছে বলে Android ডিভাইসটি এনক্রিপ্ট করা হয়েছে কিনা তা সনাক্ত করুন।voldvold.decrypttrigger_default_encryptionএ সেট করে, যাdefaultcryptoপরিষেবা শুরু করে।trigger_default_encryptionএনক্রিপশনের ধরণ পরীক্ষা করে দেখে যে/dataপাসওয়ার্ড সহ বা ছাড়া এনক্রিপ্ট করা আছে কিনা। - ডিক্রিপ্ট / ডেটা
ব্লক ডিভাইসের উপর
dm-cryptডিভাইস তৈরি করে যাতে ডিভাইসটি ব্যবহারের জন্য প্রস্তুত থাকে। - মাউন্ট /ডেটা
voldতারপর ডিক্রিপ্ট করা real/dataপার্টিশনটি মাউন্ট করে এবং তারপর নতুন পার্টিশন প্রস্তুত করে। এটিvold.post_fs_data_doneপ্রোপার্টিটিকে 0 তে সেট করে এবং তারপরvold.decryptকেtrigger_post_fs_dataতে সেট করে। এর ফলেinit.rcতারpost-fs-dataকমান্ড চালাতে পারে। তারা প্রয়োজনীয় ডিরেক্টরি বা লিঙ্ক তৈরি করে এবং তারপরvold.post_fs_data_done1 তে সেট করে।একবার
voldসেই প্রপার্টিতে 1 দেখতে পেলে, এটিvold.decryptপ্রপার্টিকে এইভাবে সেট করে:trigger_restart_framework.এর ফলেinit.rcআবার ক্লাসmain-এ পরিষেবা শুরু করে এবং বুট করার পর প্রথমবারের মতোlate_startক্লাসে পরিষেবা শুরু করে। - ফ্রেমওয়ার্ক শুরু করুন
এখন ফ্রেমওয়ার্কটি ডিক্রিপ্টেড
/dataব্যবহার করে তার সমস্ত পরিষেবা বুট করে এবং সিস্টেমটি ব্যবহারের জন্য প্রস্তুত।
ডিফল্ট এনক্রিপশন ছাড়াই একটি এনক্রিপ্ট করা ডিভাইস শুরু করুন
যখন আপনি একটি এনক্রিপ্টেড ডিভাইস বুট করেন যার একটি সেট পাসওয়ার্ড থাকে তখন এটি ঘটে। ডিভাইসের পাসওয়ার্ড একটি পিন, প্যাটার্ন, অথবা পাসওয়ার্ড হতে পারে।
- পাসওয়ার্ড সহ এনক্রিপ্ট করা ডিভাইস সনাক্ত করুন
ro.crypto.state = "encrypted"ফ্ল্যাগের কারণে Android ডিভাইসটি এনক্রিপ্ট করা আছে কিনা তা সনাক্ত করুন/dataএকটি পাসওয়ার্ড দিয়ে এনক্রিপ্ট করা থাকে বলেvoldvold.decryptকেtrigger_restart_min_frameworkএ সেট করে। - tmpfs মাউন্ট করুন
init.rcথেকে পাস করা প্যারামিটার সহ/dataজন্য প্রদত্ত প্রাথমিক মাউন্ট বিকল্পগুলি সংরক্ষণ করার জন্যinitপাঁচটি বৈশিষ্ট্য সেট করে।voldক্রিপ্টো ম্যাপিং সেট আপ করতে এই বৈশিষ্ট্যগুলি ব্যবহার করে:-
ro.crypto.fs_type -
ro.crypto.fs_real_blkdev -
ro.crypto.fs_mnt_point -
ro.crypto.fs_options -
ro.crypto.fs_flags(ASCII ৮-সংখ্যার হেক্স সংখ্যা যার পূর্বে ০x থাকে)
-
- পাসওয়ার্ডের জন্য অনুরোধ জানাতে ফ্রেমওয়ার্ক শুরু করুন
ফ্রেমওয়ার্কটি শুরু হয় এবং দেখে যে
vold.decrypttrigger_restart_min_frameworkএ সেট করা আছে। এটি ফ্রেমওয়ার্ককে বলে যে এটি একটি tmpfs/dataডিস্কে বুট হচ্ছে এবং এটিকে ব্যবহারকারীর পাসওয়ার্ড পেতে হবে।তবে প্রথমে, এটি নিশ্চিত করতে হবে যে ডিস্কটি সঠিকভাবে এনক্রিপ্ট করা হয়েছে। এটি
cryptfs cryptocompleteকমান্ডটিvoldএ পাঠায়। এনক্রিপশন সফলভাবে সম্পন্ন হলেvold0, অভ্যন্তরীণ ত্রুটিতে -1, অথবা এনক্রিপশন সফলভাবে সম্পন্ন না হলে -2 প্রদান করে।voldCRYPTO_ENCRYPTION_IN_PROGRESSফ্ল্যাগের জন্য ক্রিপ্টো মেটাডেটা দেখে এটি নির্ধারণ করে। যদি এটি সেট করা থাকে, তাহলে এনক্রিপশন প্রক্রিয়াটি ব্যাহত হয়েছে এবং ডিভাইসে কোনও ব্যবহারযোগ্য ডেটা নেই। যদিvoldএকটি ত্রুটি প্রদান করে, তাহলে UI ব্যবহারকারীকে ডিভাইসটি পুনরায় বুট করতে এবং ফ্যাক্টরি রিসেট করার জন্য একটি বার্তা প্রদর্শন করবে এবং ব্যবহারকারীকে এটি করার জন্য একটি বোতাম টিপতে দেবে। - পাসওয়ার্ড দিয়ে ডেটা ডিক্রিপ্ট করুন
cryptfs cryptocompleteসফল হলে, ফ্রেমওয়ার্কটি ডিস্ক পাসওয়ার্ড জিজ্ঞাসা করে একটি UI প্রদর্শন করে। UIcryptfs checkpwকমান্ডটিvoldএ পাঠিয়ে পাসওয়ার্ডটি পরীক্ষা করে। যদি পাসওয়ার্ডটি সঠিক হয় (যা ডিক্রিপ্টেড/dataসফলভাবে একটি অস্থায়ী স্থানে মাউন্ট করে, তারপর এটি আনমাউন্ট করে নির্ধারিত হয়),voldডিক্রিপ্টেড ব্লক ডিভাইসের নামro.crypto.fs_crypto_blkdevসম্পত্তিতে সংরক্ষণ করে এবং UI তে স্ট্যাটাস 0 ফেরত দেয়। যদি পাসওয়ার্ডটি ভুল হয়, তবে এটি UI তে -1 ফেরত দেয়। - ফ্রেমওয়ার্ক বন্ধ করুন
UI একটি ক্রিপ্টো বুট গ্রাফিক তৈরি করে এবং তারপর
cryptfs restartকমান্ড ব্যবহার করেvoldকল করে।voldvold.decryptপ্রোপার্টিটিকেtrigger_reset_mainএ সেট করে, যার ফলেinit.rcclass_reset mainকরতে বাধ্য হয়। এটি main ক্লাসের সমস্ত পরিষেবা বন্ধ করে দেয়, যা tmpfs/dataআনমাউন্ট করার অনুমতি দেয়। - মাউন্ট
/datavoldতারপর ডিক্রিপ্টেড রিয়েল/dataপার্টিশনটি মাউন্ট করে এবং নতুন পার্টিশনটি প্রস্তুত করে (যা wipe অপশন দিয়ে এনক্রিপ্ট করা থাকলে কখনও প্রস্তুত করা হত না, যা প্রথম রিলিজে সমর্থিত নয়)। এটিvold.post_fs_data_doneপ্রোপার্টিটিকে 0 তে সেট করে এবং তারপরvold.decrypttrigger_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 মাউন্ট করুন
- পাসওয়ার্ডের জন্য অনুরোধ জানাতে ফ্রেমওয়ার্ক শুরু করুন
কিন্তু ফ্রেমওয়ার্ক খোলার পরে, ডিভাইসটি কিছু ত্রুটির সম্মুখীন হতে পারে:
- পাসওয়ার্ড মিলেছে কিন্তু ডেটা ডিক্রিপ্ট করতে পারছে না
- ব্যবহারকারী ৩০ বার ভুল পাসওয়ার্ড প্রবেশ করান
যদি এই ত্রুটিগুলি সমাধান না হয়, তাহলে ব্যবহারকারীকে ফ্যাক্টরি ওয়াইপ করতে বলুন :
যদি 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 কী দিয়ে ফলাফল কী স্বাক্ষর করে এই অ্যালগরিদমটি প্রসারিত করি। ফলাফল স্বাক্ষরটি তারপর স্ক্রিপ্টের আরও একটি প্রয়োগের মাধ্যমে একটি উপযুক্ত দৈর্ঘ্য কীতে রূপান্তরিত হয়। এই কীটি মাস্টার কী এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহৃত হয়। এই কীটি সংরক্ষণ করতে:
- এলোমেলোভাবে ১৬-বাইট ডিস্ক এনক্রিপশন কী (DEK) এবং ১৬-বাইট লবণ তৈরি করুন।
- ব্যবহারকারীর পাসওয়ার্ডে স্ক্রিপ্ট এবং ৩২-বাইট ইন্টারমিডিয়েট কী ১ (IK1) তৈরি করতে লবণ প্রয়োগ করুন।
- হার্ডওয়্যার-বাউন্ড প্রাইভেট কী (HBK) এর আকারে শূন্য বাইট দিয়ে IK1 প্যাড করুন। বিশেষ করে, আমরা এইভাবে প্যাড করি: 00 || IK1 || 00..00; একটি শূন্য বাইট, 32 IK1 বাইট, 223 শূন্য বাইট।
- ২৫৬-বাইট IK2 তৈরি করতে HBK দিয়ে প্যাডেড IK1 সাইন করুন।
- ৩২-বাইট IK3 তৈরি করতে IK2 এবং লবণে (ধাপ ২ এর মতো একই লবণ) স্ক্রিপ্ট প্রয়োগ করুন।
- IK3 এর প্রথম ১৬ বাইট KEK হিসেবে এবং শেষ ১৬ বাইট IV হিসেবে ব্যবহার করুন।
- 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 দিয়ে চলছে। |
| 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