যখন ডিভাইসটি চালু থাকে কিন্তু ব্যবহারকারী ডিভাইসটি আনলক না করে, তখন অ্যান্ড্রয়েড ৭.০ একটি নিরাপদ, ডাইরেক্ট বুট মোডে চলে। এটি সমর্থন করার জন্য, সিস্টেমটি ডেটা সংরক্ষণের জন্য দুটি অবস্থান প্রদান করে:
- ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ , যা ডিফল্ট স্টোরেজ লোকেশন এবং ব্যবহারকারী ডিভাইসটি আনলক করার পরেই কেবল উপলব্ধ।
- ডিভাইস এনক্রিপ্টেড স্টোরেজ , যা ডাইরেক্ট বুট মোডের সময় এবং ব্যবহারকারীর ডিভাইস আনলক করার পরে উভয় ক্ষেত্রেই উপলব্ধ একটি স্টোরেজ অবস্থান।
ডিফল্টরূপে, ডাইরেক্ট বুট মোডের সময় অ্যাপগুলি চলে না। যদি আপনার অ্যাপটিকে ডাইরেক্ট বুট মোডের সময় কোনও পদক্ষেপ নেওয়ার প্রয়োজন হয়, তাহলে আপনি এই মোডের সময় চালানোর জন্য অ্যাপ উপাদানগুলি নিবন্ধন করতে পারেন। ডাইরেক্ট বুট মোডের সময় চালানোর জন্য প্রয়োজনীয় অ্যাপগুলির জন্য কিছু সাধারণ ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত রয়েছে:
- যেসব অ্যাপে বিজ্ঞপ্তির সময়সূচী থাকে, যেমন অ্যালার্ম ঘড়ি অ্যাপ।
- গুরুত্বপূর্ণ ব্যবহারকারীর বিজ্ঞপ্তি প্রদানকারী অ্যাপ, যেমন SMS অ্যাপ।
- টকব্যাকের মতো অ্যাক্সেসিবিলিটি পরিষেবা প্রদানকারী অ্যাপ।
যদি আপনার অ্যাপটি ডাইরেক্ট বুট মোডে চলাকালীন ডেটা অ্যাক্সেসের প্রয়োজন হয়, তাহলে ডিভাইস এনক্রিপ্টেড স্টোরেজ ব্যবহার করুন। ডিভাইস এনক্রিপ্টেড স্টোরেজে একটি কী দিয়ে এনক্রিপ্টেড ডেটা থাকে যা কেবলমাত্র একটি ডিভাইস সফলভাবে যাচাইকৃত বুট করার পরেই উপলব্ধ থাকে।
ব্যবহারকারীর শংসাপত্রের সাথে সম্পর্কিত একটি কী, যেমন পিন বা পাসওয়ার্ড দিয়ে এনক্রিপ্ট করা ডেটার জন্য, ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ ব্যবহার করুন। ব্যবহারকারী ডিভাইসটি সফলভাবে আনলক করার পরে এবং ব্যবহারকারী ডিভাইসটি পুনরায় চালু না করা পর্যন্ত ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ উপলব্ধ থাকে। ডিভাইসটি আনলক করার পরে ব্যবহারকারী যদি লক স্ক্রিন সক্ষম করে, তবে ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ উপলব্ধ থাকে।
ডাইরেক্ট বুট চলাকালীন চালানোর জন্য অ্যাক্সেসের অনুরোধ করুন
ডাইরেক্ট বুট মোডে চালানোর আগে অথবা ডিভাইস এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করার আগে অ্যাপগুলিকে সিস্টেমে তাদের কম্পোনেন্ট নিবন্ধন করতে হবে। কম্পোনেন্টগুলিকে এনক্রিপশন সচেতন হিসেবে চিহ্নিত করে অ্যাপগুলি সিস্টেমে নিবন্ধন করে। আপনার কম্পোনেন্টকে এনক্রিপশন সচেতন হিসেবে চিহ্নিত করতে, আপনার ম্যানিফেস্টে android:directBootAware অ্যাট্রিবিউটটিকে true হিসেবে সেট করুন।
ডিভাইসটি পুনরায় চালু করার সময় এনক্রিপশন সচেতন উপাদানগুলি সিস্টেম থেকে একটি ACTION_LOCKED_BOOT_COMPLETED সম্প্রচার বার্তা পাওয়ার জন্য নিবন্ধন করতে পারে। এই মুহুর্তে ডিভাইস এনক্রিপ্ট করা স্টোরেজ উপলব্ধ থাকে এবং আপনার উপাদানটি ডাইরেক্ট বুট মোডের সময় চালানোর জন্য প্রয়োজনীয় কাজগুলি সম্পাদন করতে পারে, যেমন একটি নির্ধারিত অ্যালার্ম ট্রিগার করা।
অ্যাপ ম্যানিফেস্টে BroadcastReceiver কে এনক্রিপশন সচেতন হিসেবে নিবন্ধন করার এবং ACTION_LOCKED_BOOT_COMPLETED এর জন্য একটি ইন্টেন্ট ফিল্টার যোগ করার একটি উদাহরণ হল নিম্নলিখিত কোড স্নিপেট:
<receiver android:directBootAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
ব্যবহারকারী একবার ডিভাইসটি আনলক করলে, সমস্ত উপাদান ডিভাইসের এনক্রিপ্ট করা স্টোরেজের পাশাপাশি ক্রেডেনশিয়াল এনক্রিপ্ট করা স্টোরেজ উভয়ই অ্যাক্সেস করতে পারবে।
ডিভাইস এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করুন
ডিভাইস এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করতে, Context.createDeviceProtectedStorageContext() কল করে একটি দ্বিতীয় Context ইনস্ট্যান্স তৈরি করুন। এই কনটেক্সট ব্যবহার করে করা সমস্ত স্টোরেজ API কল ডিভাইস এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করে। নিম্নলিখিত উদাহরণটি ডিভাইস এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করে এবং একটি বিদ্যমান অ্যাপ ডেটা ফাইল খোলে:
কোটলিন
val directBootContext: Context = appContext.createDeviceProtectedStorageContext() // Access appDataFilename that lives in device encrypted storage val inStream: InputStream = directBootContext.openFileInput(appDataFilename) // Use inStream to read content...
জাভা
Context directBootContext = appContext.createDeviceProtectedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
কেবলমাত্র সেই তথ্যের জন্য ডিভাইস এনক্রিপ্টেড স্টোরেজ ব্যবহার করুন যা ডাইরেক্ট বুট মোডের সময় অ্যাক্সেসযোগ্য হতে হবে। ডিভাইস এনক্রিপ্টেড স্টোরেজকে সাধারণ উদ্দেশ্যে এনক্রিপ্টেড স্টোর হিসাবে ব্যবহার করবেন না। ব্যক্তিগত ব্যবহারকারীর তথ্যের জন্য, অথবা ডাইরেক্ট বুট মোডের সময় প্রয়োজন হয় না এমন এনক্রিপ্টেড ডেটার জন্য, ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ ব্যবহার করুন।
ব্যবহারকারী আনলকের বিজ্ঞপ্তি পান
ব্যবহারকারী যখন রিস্টার্ট করার পর ডিভাইসটি আনলক করেন, তখন আপনার অ্যাপটি ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ অ্যাক্সেস করতে পারে এবং ব্যবহারকারীর ক্রেডেনশিয়ালের উপর নির্ভরশীল নিয়মিত সিস্টেম পরিষেবা ব্যবহার করতে পারে।
রিবুট করার পর ব্যবহারকারী যখন ডিভাইসটি আনলক করে তখন বিজ্ঞপ্তি পেতে, আনলক বিজ্ঞপ্তি বার্তা শোনার জন্য একটি চলমান উপাদান থেকে একটি BroadcastReceiver নিবন্ধন করুন। বুট করার পর ব্যবহারকারী যখন ডিভাইসটি আনলক করে:
- যদি আপনার অ্যাপের ফোরগ্রাউন্ডে এমন কোনও প্রক্রিয়া থাকে যার জন্য তাৎক্ষণিক বিজ্ঞপ্তির প্রয়োজন হয়, তাহলে
ACTION_USER_UNLOCKEDবার্তাটি শুনুন। - যদি আপনার অ্যাপটি শুধুমাত্র ব্যাকগ্রাউন্ড প্রক্রিয়া ব্যবহার করে যা বিলম্বিত বিজ্ঞপ্তির উপর কাজ করতে পারে, তাহলে
ACTION_BOOT_COMPLETEDবার্তাটি শুনুন।
ব্যবহারকারী যদি ডিভাইসটি আনলক করে থাকেন, তাহলে আপনি UserManager.isUserUnlocked() এ কল করে তা জানতে পারবেন।
বিদ্যমান ডেটা স্থানান্তর করুন
যদি কোনও ব্যবহারকারী তাদের ডিভাইসটি ডাইরেক্ট বুট মোড ব্যবহার করার জন্য আপডেট করে, তাহলে আপনার কাছে এমন কিছু ডেটা থাকতে পারে যা ডিভাইস এনক্রিপ্ট করা স্টোরেজে স্থানান্তরিত করতে হবে। ক্রেডেনশিয়াল এনক্রিপ্ট করা স্টোরেজ এবং ডিভাইস এনক্রিপ্ট করা স্টোরেজের মধ্যে পছন্দ এবং ডাটাবেস ডেটা স্থানান্তর করতে, Context.moveSharedPreferencesFrom() এবং Context.moveDatabaseFrom() ব্যবহার করুন, গন্তব্য প্রসঙ্গকে মেথড কলার এবং সোর্স প্রসঙ্গকে আর্গুমেন্ট হিসাবে রেখে।
পাসওয়ার্ড বা অনুমোদন টোকেনের মতো ব্যক্তিগত ব্যবহারকারীর তথ্য, ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ থেকে ডিভাইস এনক্রিপ্টেড স্টোরেজে স্থানান্তর করবেন না। ডিভাইস এনক্রিপ্টেড স্টোরেজে অন্য কোন ডেটা স্থানান্তরিত করবেন তা নির্ধারণ করার সময় আপনার সেরা বিচারবুদ্ধি ব্যবহার করুন। কিছু পরিস্থিতিতে, আপনাকে দুটি এনক্রিপ্টেড স্টোরে পৃথক ডেটা সেট পরিচালনা করতে হতে পারে।
আপনার এনক্রিপশন সচেতন অ্যাপটি পরীক্ষা করুন
ডাইরেক্ট বুট মোড সক্ষম করে আপনার এনক্রিপশন সচেতন অ্যাপটি পরীক্ষা করুন।
অ্যান্ড্রয়েডের সাম্প্রতিক সংস্করণগুলি ব্যবহার করে এমন বেশিরভাগ ডিভাইসই লকস্ক্রিন শংসাপত্র (পিন, প্যাটার্ন, বা পাসওয়ার্ড) সেট করা হলে ডাইরেক্ট বুট মোড সক্ষম করে। বিশেষ করে, ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে এমন সমস্ত ডিভাইসের ক্ষেত্রে এটি প্রযোজ্য। কোনও ডিভাইস ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে কিনা তা পরীক্ষা করতে, নিম্নলিখিত শেল কমান্ডটি চালান:
adb shell getprop ro.crypto.type
যদি আউটপুট file হয়, তাহলে ডিভাইসটিতে ফাইল-ভিত্তিক এনক্রিপশন সক্ষম করা আছে।
যেসব ডিভাইস ডিফল্টভাবে ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে না, সেখানে ডাইরেক্ট বুট মোড পরীক্ষা করার জন্য অন্যান্য বিকল্প থাকতে পারে:
কিছু ডিভাইস যা ফুল-ডিস্ক এনক্রিপশন (
ro.crypto.type=block) ব্যবহার করে এবং Android 7.0 থেকে Android 12 পর্যন্ত চলে, সেগুলিকে ফাইল-ভিত্তিক এনক্রিপশনে রূপান্তর করা যেতে পারে। এটি করার দুটি উপায় রয়েছে:- ডিভাইসে, যদি আপনি ইতিমধ্যেই ডেভেলপার অপশনগুলি সক্ষম না করে থাকেন, তাহলে সেটিংস > ফোন সম্পর্কে এবং বিল্ড নম্বরটি সাতবার ট্যাপ করে এটি চালু করুন। তারপর সেটিংস > ডেভেলপার অপশনগুলিতে যান এবং ফাইল এনক্রিপশনে রূপান্তর করুন নির্বাচন করুন।
- বিকল্পভাবে, নিম্নলিখিত শেল কমান্ডগুলি চালান:
adb reboot-bootloaderfastboot --wipe-and-use-fbe
সতর্কতা: ফাইল-ভিত্তিক এনক্রিপশনে রূপান্তরের যেকোনো পদ্ধতিই ডিভাইসের সমস্ত ব্যবহারকারীর ডেটা মুছে ফেলবে।
অ্যান্ড্রয়েড ১৩ বা তার আগের ভার্সনে চলমান ডিভাইসগুলি একটি "ইমুলেটেড" ডাইরেক্ট বুট মোড সমর্থন করে যা এনক্রিপ্ট করা ফাইলগুলি লক এবং আনলক করার প্রভাব অনুকরণ করতে ফাইল অনুমতি ব্যবহার করে। ডেভেলপমেন্টের সময় শুধুমাত্র ইমুলেটেড মোড ব্যবহার করুন; এটি ডেটা ক্ষতির কারণ হতে পারে। ইমুলেটেড ডাইরেক্ট বুট মোড সক্ষম করতে, ডিভাইসে একটি লক প্যাটার্ন সেট করুন, লক প্যাটার্ন সেট করার সময় একটি নিরাপদ স্টার্ট-আপ স্ক্রিনের জন্য অনুরোধ করা হলে "না ধন্যবাদ" নির্বাচন করুন এবং তারপরে নিম্নলিখিত শেল কমান্ডটি চালান:
adb shell sm set-emulate-fbe true
এমুলেটেড ডাইরেক্ট বুট মোড বন্ধ করতে, নিম্নলিখিত শেল কমান্ডটি চালান:
adb shell sm set-emulate-fbe false
এই কমান্ডগুলির যেকোনো একটি চালানোর ফলে ডিভাইসটি রিবুট হবে।
ডিভাইস নীতি এনক্রিপশনের স্থিতি পরীক্ষা করুন
ডিভাইস অ্যাডমিনিস্ট্রেশন অ্যাপগুলি ডিভাইসের বর্তমান এনক্রিপশন স্থিতি পরীক্ষা করতে DevicePolicyManager.getStorageEncryptionStatus() ব্যবহার করতে পারে।
যদি আপনার অ্যাপটি Android 7.0 (API 24) এর চেয়ে কম API লেভেলের জন্য কাজ করে, তাহলে ডিভাইসটি যদি ফুল-ডিস্ক এনক্রিপশন অথবা ডাইরেক্ট বুট সহ ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে, তাহলে getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE প্রদান করে। এই উভয় ক্ষেত্রেই, ডেটা সর্বদা বিশ্রামে এনক্রিপ্ট করা অবস্থায় সংরক্ষণ করা হয়।
যদি আপনার অ্যাপটি Android 7.0 (API 24) বা তার উচ্চতর ভার্সনের হয়, তাহলে ডিভাইসটি ফুল-ডিস্ক এনক্রিপশন ব্যবহার করলে getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE প্রদান করে। যদি ডিভাইসটি ডাইরেক্ট বুট সহ ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে তবে এটি ENCRYPTION_STATUS_ACTIVE_PER_USER প্রদান করে।
যদি আপনি এমন একটি ডিভাইস অ্যাডমিনিস্ট্রেশন অ্যাপ তৈরি করেন যা Android 7.0 কে লক্ষ্য করে, তাহলে ডিভাইসটি এনক্রিপ্ট করা আছে কিনা তা নির্ধারণ করতে ENCRYPTION_STATUS_ACTIVE এবং ENCRYPTION_STATUS_ACTIVE_PER_USER উভয়ই পরীক্ষা করে দেখুন।
অতিরিক্ত কোড নমুনা
ডাইরেক্টবুট নমুনাটি এই পৃষ্ঠায় বর্ণিত API গুলির ব্যবহার আরও প্রদর্শন করে।