ফুল-ডিস্ক এনক্রিপশন হল একটি এনক্রিপ্ট করা কী ব্যবহার করে একটি অ্যান্ড্রয়েড ডিভাইসে ব্যবহারকারীর সমস্ত ডেটা এনকোড করার প্রক্রিয়া। একবার একটি ডিভাইস এনক্রিপ্ট হয়ে গেলে, ব্যবহারকারীর তৈরি করা সমস্ত ডেটা ডিস্কে কমিট করার আগে স্বয়ংক্রিয়ভাবে এনক্রিপ্ট হয়ে যায় এবং কলিং প্রক্রিয়ায় ফেরত দেওয়ার আগে সমস্ত পাঠ স্বয়ংক্রিয়ভাবে ডেটা ডিক্রিপ্ট করে।
4.4 সালে অ্যান্ড্রয়েডে ফুল-ডিস্ক এনক্রিপশন চালু করা হয়েছিল, কিন্তু অ্যান্ড্রয়েড 5.0 এই নতুন বৈশিষ্ট্যগুলি চালু করেছে:
- দ্রুত এনক্রিপশন তৈরি করা হয়েছে, যা শুধুমাত্র ডেটা পার্টিশনে ব্যবহৃত ব্লকগুলিকে এনক্রিপ্ট করে যাতে প্রথম বুটটি দীর্ঘ সময় নেয় না। শুধুমাত্র ext4 এবং f2fs ফাইল সিস্টেমগুলি বর্তমানে দ্রুত এনক্রিপশন সমর্থন করে।
- প্রথম বুটে এনক্রিপ্ট করতে
forceencryptfstab পতাকা যোগ করা হয়েছে। - একটি পাসওয়ার্ড ছাড়া নিদর্শন এবং এনক্রিপশন জন্য সমর্থন যোগ করা হয়েছে.
- ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্টের (টিইই) স্বাক্ষর করার ক্ষমতা ব্যবহার করে এনক্রিপশন কীটির হার্ডওয়্যার-ব্যাকড স্টোরেজ যোগ করা হয়েছে (যেমন একটি ট্রাস্টজোনে)। আরও বিস্তারিত জানার জন্য এনক্রিপ্ট করা কী সংরক্ষণ করা দেখুন।
সতর্কতা: অ্যান্ড্রয়েড 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 ডিভাইসের জন্য স্বাভাবিক প্রথম বুট।
-
forceencryptপতাকা সহ এনক্রিপ্ট করা ফাইল সিস্টেম সনাক্ত করুন/dataএনক্রিপ্ট করা হয় না কিন্তু হওয়া দরকার কারণforceencryptএনক্রিপ্ট এটিকে বাধ্যতামূলক করে। আনমাউন্ট/data। -
/dataএনক্রিপ্ট করা শুরু করুনvold.decrypt = "trigger_encryption"init.rcট্রিগার করে, যার ফলেvoldকোনো পাসওয়ার্ড ছাড়াই/dataএনক্রিপ্ট করে। (কোনও সেট নেই কারণ এটি একটি নতুন ডিভাইস হওয়া উচিত।) - মাউন্ট tmpfs
voldএকটি tmpfs/dataমাউন্ট করে (ro.crypto.tmpfs_optionsথেকে tmpfs বিকল্পগুলি ব্যবহার করে) এবং প্রপার্টিvold.encrypt_progress0 এ সেট করেtrigger_restart_min_frameworkvoldএকটি এনক্রিপ্ট করা সিস্টেম বুট করার জন্য tmpfs/dataপ্রস্তুত করে এবং প্রপার্টিvold.decryptএ সেট করে: - অগ্রগতি দেখানোর জন্য কাঠামো আনুন
যেহেতু ডিভাইসটিতে এনক্রিপ্ট করার জন্য কার্যত কোন ডেটা নেই, তাই অগ্রগতি বারটি প্রায়শই প্রদর্শিত হবে না কারণ এনক্রিপশন এত দ্রুত ঘটে। অগ্রগতি UI সম্পর্কে আরও বিস্তারিত জানার জন্য একটি বিদ্যমান ডিভাইস এনক্রিপ্ট করুন দেখুন।
- যখন
/dataএনক্রিপ্ট করা হয়, ফ্রেমওয়ার্ক নামিয়ে নিনvoldvold.decrypttrigger_default_encryptionএ সেট করে যাdefaultcryptoপরিষেবা শুরু করে। (এটি একটি ডিফল্ট এনক্রিপ্ট করা ব্যবহারকারীর ডেটা মাউন্ট করার জন্য নীচের প্রবাহ শুরু করে।)trigger_default_encryptionএনক্রিপশনের ধরনটি পরীক্ষা করে দেখতে পারে যে/dataপাসওয়ার্ড সহ বা ছাড়া এনক্রিপ্ট করা হয়েছে কিনা। যেহেতু অ্যান্ড্রয়েড 5.0 ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা হয়েছে, সেখানে কোনও পাসওয়ার্ড সেট করা উচিত নয়; তাই আমরা ডিক্রিপ্ট করি এবং/dataমাউন্ট করি। - মাউন্ট
/datainitতারপরro.crypto.tmpfs_optionsথেকে নেওয়া প্যারামিটার ব্যবহার করে tmpfs RAMDisk-এ/dataমাউন্ট করে, যাinit.rcএ সেট করা আছে। - ফ্রেমওয়ার্ক শুরু করুন
voldvold.decrypttrigger_restart_frameworkএ সেট করে, যা স্বাভাবিক বুট প্রক্রিয়া অব্যাহত রাখে।
একটি বিদ্যমান ডিভাইস এনক্রিপ্ট করুন
আপনি যখন এনক্রিপ্ট না করা Android K বা আগের ডিভাইসটিকে 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এ সেট করে। এর ফলেlate_startএবংmainক্লাসেinit.rcপরিষেবা বন্ধ করে দেয়। - একটি ক্রিপ্টো ফুটার তৈরি করুন
- একটি ব্রেডক্রাম্ব ফাইল তৈরি করুন
- রিবুট করুন
- ব্রেডক্রাম্ব ফাইল সনাক্ত করুন
-
/dataএনক্রিপ্ট করা শুরু করুনvoldতারপরে ক্রিপ্টো ম্যাপিং সেট আপ করে, যা একটি ভার্চুয়াল ক্রিপ্টো ব্লক ডিভাইস তৈরি করে যা আসল ব্লক ডিভাইসে ম্যাপ করে কিন্তু প্রতিটি সেক্টরকে যেমন লেখা আছে এনক্রিপ্ট করে, এবং প্রতিটি সেক্টর পড়ার সাথে সাথে ডিক্রিপ্ট করে।voldতারপর ক্রিপ্টো মেটাডেটা তৈরি করে এবং লেখে। - এটি এনক্রিপ্ট করার সময়, মাউন্ট tmpfs
voldএকটি tmpfs/dataমাউন্ট করে (ro.crypto.tmpfs_optionsথেকে tmpfs বিকল্পগুলি ব্যবহার করে) এবং প্রপার্টিvold.encrypt_progress0 এ সেট করেtrigger_restart_min_frameworkvoldএকটি এনক্রিপ্ট করা সিস্টেম বুট করার জন্য tmpfs/dataপ্রস্তুত করে এবং প্রপার্টিvold.decryptএ সেট করে: - অগ্রগতি দেখানোর জন্য কাঠামো আনুন
trigger_restart_min_frameworkinit.rcপরিষেবারmainক্লাস শুরু করে। যখন ফ্রেমওয়ার্ক দেখতে পায় যেvold.encrypt_progress0 এ সেট করা আছে, তখন এটি অগ্রগতি বার UI নিয়ে আসে, যা প্রতি পাঁচ সেকেন্ডে সেই বৈশিষ্ট্যটি অনুসন্ধান করে এবং একটি অগ্রগতি বার আপডেট করে। এনক্রিপশন লুপ যখনই পার্টিশনের অন্য শতাংশ এনক্রিপ্ট করেvold.encrypt_progressআপডেট করে। - যখন
/dataএনক্রিপ্ট করা হয়, তখন ক্রিপ্টো ফুটার আপডেট করুনযখন
/dataসফলভাবে এনক্রিপ্ট করা হয়,voldমেটাডেটাতেENCRYPTION_IN_PROGRESSপতাকা সাফ করে।যখন ডিভাইসটি সফলভাবে আনলক করা হয়, তখন পাসওয়ার্ডটি মাস্টার কী এনক্রিপ্ট করতে ব্যবহার করা হয় এবং ক্রিপ্টো ফুটার আপডেট করা হয়।
কোনো কারণে রিবুট ব্যর্থ হলে,
voldপ্রপার্টিvold.encrypt_progressকেerror_reboot_failedএ সেট করে এবং UI একটি বার্তা প্রদর্শন করবে যাতে ব্যবহারকারীকে রিবুট করার জন্য একটি বোতাম টিপতে বলা হয়। এটি কখনই ঘটবে বলে আশা করা যায় না।
ডিফল্ট এনক্রিপশন সহ একটি এনক্রিপ্ট করা ডিভাইস শুরু করুন
আপনি যখন পাসওয়ার্ড ছাড়াই একটি এনক্রিপ্ট করা ডিভাইস বুট আপ করেন তখন এটি ঘটে। যেহেতু Android 5.0 ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা হয়েছে, সেখানে কোনও সেট পাসওয়ার্ড থাকা উচিত নয় এবং তাই এটি ডিফল্ট এনক্রিপশন অবস্থা।
- কোনো পাসওয়ার্ড ছাড়াই এনক্রিপ্ট করা
/dataসনাক্ত করুনশনাক্ত করুন যে অ্যান্ড্রয়েড ডিভাইসটি এনক্রিপ্ট করা হয়েছে কারণ
/dataমাউন্ট করা যাবে না এবং পতাকাগুলির মধ্যে একটিencryptableবাforceencryptসেট করা আছে৷voldvold.decrypttrigger_default_encryptionএ সেট করে, যাdefaultcryptoপরিষেবা শুরু করে।trigger_default_encryptionএনক্রিপশন টাইপ চেক করে দেখতে পারে যে/dataপাসওয়ার্ড সহ বা ছাড়া এনক্রিপ্ট করা হয়েছে কিনা। - ডিক্রিপ্ট/ডেটা
ব্লক ডিভাইসের উপর
dm-cryptডিভাইস তৈরি করে যাতে ডিভাইসটি ব্যবহারের জন্য প্রস্তুত হয়। - মাউন্ট/ডেটা
voldতারপর ডিক্রিপ্ট করা বাস্তব/dataপার্টিশন মাউন্ট করে এবং তারপর নতুন পার্টিশন প্রস্তুত করে। এটিvold.post_fs_data_doneপ্রপার্টি 0 এ সেট করে এবং তারপরvold.decryptকেtrigger_post_fs_dataএ সেট করে। এর ফলেinit.rcএরpost-fs-dataকমান্ড চালানো হয়। তারা প্রয়োজনীয় ডিরেক্টরি বা লিঙ্ক তৈরি করে এবং তারপরvold.post_fs_data_done1 এ সেট করে।একবার
voldসেই প্রপার্টিতে 1 দেখতে পেলে, এটি প্রপার্টিvold.decryptকে এতে সেট করে:trigger_restart_framework.এর ফলেinit.rcআবার ক্লাসmainএ পরিষেবা শুরু করে এবং বুটের পর প্রথমবার ক্লাসlate_startএ পরিষেবা শুরু করে। - ফ্রেমওয়ার্ক শুরু করুন
এখন ফ্রেমওয়ার্ক ডিক্রিপ্ট করা
/dataব্যবহার করে তার সমস্ত পরিষেবা বুট করে এবং সিস্টেমটি ব্যবহারের জন্য প্রস্তুত।
ডিফল্ট এনক্রিপশন ছাড়াই একটি এনক্রিপ্ট করা ডিভাইস শুরু করুন
আপনি যখন একটি সেট পাসওয়ার্ড আছে এমন একটি এনক্রিপ্ট করা ডিভাইস বুট আপ করলে এটি ঘটে। ডিভাইসের পাসওয়ার্ড একটি পিন, প্যাটার্ন বা পাসওয়ার্ড হতে পারে।
- একটি পাসওয়ার্ড দিয়ে এনক্রিপ্ট করা ডিভাইস সনাক্ত করুন
সনাক্ত করুন যে Android ডিভাইসটি এনক্রিপ্ট করা হয়েছে কারণ পতাকা
ro.crypto.state = "encrypted"voldvold.decrypttrigger_restart_min_frameworkএ সেট করে কারণ/dataএকটি পাসওয়ার্ড দিয়ে এনক্রিপ্ট করা হয়। - মাউন্ট 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 8-সংখ্যার হেক্স নম্বর 0x এর আগে)
-
- পাসওয়ার্ডের জন্য প্রম্পট করার জন্য ফ্রেমওয়ার্ক শুরু করুন
ফ্রেমওয়ার্ক শুরু হয় এবং দেখতে পায় যে
vold.decrypttrigger_restart_min_frameworkএ সেট করা আছে। এটি ফ্রেমওয়ার্ককে বলে যে এটি একটি tmpfs/dataডিস্কে বুট করছে এবং এটি ব্যবহারকারীর পাসওয়ার্ড পেতে হবে।যাইহোক, প্রথমত, এটি নিশ্চিত করতে হবে যে ডিস্কটি সঠিকভাবে এনক্রিপ্ট করা হয়েছে। এটি
voldএcryptfs cryptocompleteকমান্ড পাঠায়। এনক্রিপশন সফলভাবে সম্পন্ন হলেvold0 প্রদান করে, অভ্যন্তরীণ ত্রুটিতে -1, অথবা এনক্রিপশন সফলভাবে সম্পন্ন না হলে -2 প্রদান করে।voldCRYPTO_ENCRYPTION_IN_PROGRESSপতাকার জন্য ক্রিপ্টো মেটাডেটা দেখে এটি নির্ধারণ করে। এটি সেট করা থাকলে, এনক্রিপশন প্রক্রিয়া বাধাগ্রস্ত হয়েছিল এবং ডিভাইসে কোনও ব্যবহারযোগ্য ডেটা নেই৷ যদিvoldএকটি ত্রুটি ফেরত দেয়, তাহলে UI ব্যবহারকারীকে ডিভাইসটি রিবুট এবং ফ্যাক্টরি রিসেট করার জন্য একটি বার্তা প্রদর্শন করবে এবং ব্যবহারকারীকে এটি করার জন্য একটি বোতাম টিপতে হবে। - পাসওয়ার্ড দিয়ে ডেটা ডিক্রিপ্ট করুন
একবার
cryptfs cryptocompleteসফল হলে, ফ্রেমওয়ার্ক ডিস্কের পাসওয়ার্ড চাওয়ার জন্য একটি UI প্রদর্শন করে। UIvoldএcryptfs checkpwকমান্ড পাঠিয়ে পাসওয়ার্ড পরীক্ষা করে। যদি পাসওয়ার্ডটি সঠিক হয় (যা সফলভাবে একটি অস্থায়ী অবস্থানে ডিক্রিপ্ট করা/dataমাউন্ট করার দ্বারা নির্ধারিত হয়, তারপর এটি আনমাউন্ট করা হয়),voldডিক্রিপ্ট করা ব্লক ডিভাইসের নামro.crypto.fs_crypto_blkdevপ্রপার্টিতে সংরক্ষণ করে এবং UI-তে স্থিতি 0 ফেরত দেয়। পাসওয়ার্ডটি ভুল হলে, এটি UI-তে -1 ফেরত দেয়। - ফ্রেমওয়ার্ক বন্ধ করুন
UI একটি ক্রিপ্টো বুট গ্রাফিক রাখে এবং তারপর
cryptfs restartকমান্ডের সাথেvoldকল করে।voldপ্রপার্টিvold.decryptকেtrigger_reset_mainএ সেট করে, যার ফলেinit.rcclass_reset mainকরতে পারে। এটি প্রধান শ্রেণীর সমস্ত পরিষেবা বন্ধ করে দেয়, যা tmpfs/dataআনমাউন্ট করার অনুমতি দেয়। - মাউন্ট
/datavoldতারপর ডিক্রিপ্ট করা রিয়েল/dataপার্টিশন মাউন্ট করে এবং নতুন পার্টিশন প্রস্তুত করে (যা wipe বিকল্পের সাথে এনক্রিপ্ট করা থাকলে, যা প্রথম রিলিজে সমর্থিত নয়) তৈরি করা হতো না। এটি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ফাইলসিস্টেম ব্যবহার করে তার সমস্ত পরিষেবা বুট করে এবং সিস্টেমটি ব্যবহারের জন্য প্রস্তুত।
ব্যর্থতা
একটি ডিভাইস যা ডিক্রিপ্ট করতে ব্যর্থ হয় তা কয়েকটি কারণে বিভ্রান্ত হতে পারে। ডিভাইসটি বুট করার জন্য ধাপগুলির স্বাভাবিক সিরিজ দিয়ে শুরু হয়:
- একটি পাসওয়ার্ড দিয়ে এনক্রিপ্ট করা ডিভাইস সনাক্ত করুন
- মাউন্ট tmpfs
- পাসওয়ার্ডের জন্য প্রম্পট করার জন্য ফ্রেমওয়ার্ক শুরু করুন
কিন্তু ফ্রেমওয়ার্ক খোলার পরে, ডিভাইসটি কিছু ত্রুটির সম্মুখীন হতে পারে:
- পাসওয়ার্ড মেলে কিন্তু ডেটা ডিক্রিপ্ট করতে পারে না
- ব্যবহারকারী 30 বার ভুল পাসওয়ার্ড প্রবেশ করান
যদি এই ত্রুটিগুলি সমাধান না করা হয়, ব্যবহারকারীকে ফ্যাক্টরি ওয়াইপ করতে অনুরোধ করুন :
যদি vold এনক্রিপশন প্রক্রিয়া চলাকালীন একটি ত্রুটি শনাক্ত করে, এবং যদি এখনও কোনো ডেটা ধ্বংস করা না হয় এবং ফ্রেমওয়ার্ক আপ হয়ে যায়, তাহলে vold বৈশিষ্ট্যটিকে vold.encrypt_progress error_not_encrypted এ সেট করে। UI ব্যবহারকারীকে পুনরায় বুট করার জন্য অনুরোধ করে এবং এনক্রিপশন প্রক্রিয়া কখনই শুরু হয়নি তা সতর্ক করে। ফ্রেমওয়ার্ক ছিঁড়ে যাওয়ার পরে যদি ত্রুটি ঘটে তবে প্রগ্রেস বার UI আপ হওয়ার আগে, vold রিবুট করে সিস্টেমটি। রিবুট ব্যর্থ হলে, এটি vold.encrypt_progress error_shutting_down এ সেট করে এবং -1 রিটার্ন করে; কিন্তু ত্রুটি ধরার কিছু হবে না। এটি ঘটবে প্রত্যাশিত নয়.
যদি vold এনক্রিপশন প্রক্রিয়া চলাকালীন একটি ত্রুটি সনাক্ত করে, তাহলে এটি vold.encrypt_progress error_partially_encrypted এ সেট করে এবং -1 প্রদান করে। UI এর তারপর একটি বার্তা প্রদর্শন করা উচিত যে এনক্রিপশন ব্যর্থ হয়েছে এবং ব্যবহারকারীকে ডিভাইসটি ফ্যাক্টরি রিসেট করার জন্য একটি বোতাম সরবরাহ করবে।
এনক্রিপ্ট করা কী সংরক্ষণ করুন
এনক্রিপ্ট করা কী ক্রিপ্টো মেটাডেটাতে সংরক্ষণ করা হয়। ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্ট (TEE) এর স্বাক্ষর করার ক্ষমতা ব্যবহার করে হার্ডওয়্যার ব্যাকিং প্রয়োগ করা হয়। পূর্বে, আমরা ব্যবহারকারীর পাসওয়ার্ড এবং সঞ্চিত লবণে স্ক্রিপ্ট প্রয়োগ করে তৈরি করা একটি কী দিয়ে মাস্টার কী এনক্রিপ্ট করেছি। অফ-বক্স আক্রমণের বিরুদ্ধে কীটিকে স্থিতিস্থাপক করার জন্য, আমরা একটি সংরক্ষিত TEE কী সহ ফলাফল কী স্বাক্ষর করে এই অ্যালগরিদমটি প্রসারিত করি। ফলস্বরূপ স্বাক্ষরটিকে তারপরে স্ক্রিপ্টের আরও একটি প্রয়োগের মাধ্যমে একটি উপযুক্ত দৈর্ঘ্যের কীতে পরিণত করা হয়। এই কীটি তারপর মাস্টার কী এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহৃত হয়। এই কী সংরক্ষণ করতে:
- এলোমেলো 16-বাইট ডিস্ক এনক্রিপশন কী (DEK) এবং 16-বাইট লবণ তৈরি করুন।
- 32-বাইট ইন্টারমিডিয়েট কী 1 (IK1) তৈরি করতে ব্যবহারকারীর পাসওয়ার্ড এবং লবণে স্ক্রিপ্ট প্রয়োগ করুন।
- হার্ডওয়্যার-বাউন্ড প্রাইভেট কী (HBK) এর আকারে শূন্য বাইট সহ প্যাড IK1। বিশেষভাবে, আমরা এইভাবে প্যাড করি: 00 || IK1 || 00..00; একটি শূন্য বাইট, 32 IK1 বাইট, 223 শূন্য বাইট।
- 256-বাইট IK2 তৈরি করতে HBK-এর সাথে প্যাডেড IK1 সাইন করুন।
- 32-বাইট IK3 তৈরি করতে IK2 এবং লবণ (ধাপ 2 হিসাবে একই লবণ) স্ক্রিপ্ট প্রয়োগ করুন।
- IK3 এর প্রথম 16 বাইট KEK হিসাবে এবং শেষ 16 বাইট IV হিসাবে ব্যবহার করুন।
- AES_CBC এর সাথে DEK এনক্রিপ্ট করুন, কী KEK সহ, এবং ইনিশিয়ালাইজেশন ভেক্টর IV।
পাসওয়ার্ড পরিবর্তন করুন
যখন কোনো ব্যবহারকারী সেটিংসে তাদের পাসওয়ার্ড পরিবর্তন বা অপসারণ করতে নির্বাচন করেন, তখন UI vold এ cryptfs 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 সহ চলছে। |
| এই পাঁচটি বৈশিষ্ট্য 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