সমর্থন সরাসরি বুট মোড

Android 7.0 একটি সুরক্ষিত, ডাইরেক্ট বুট মোডে চলে যখন ডিভাইসটি চালু থাকে কিন্তু ব্যবহারকারী ডিভাইসটি আনলক করেননি। এটি সমর্থন করার জন্য, সিস্টেমটি ডেটার জন্য দুটি স্টোরেজ অবস্থান সরবরাহ করে:

  • শংসাপত্র এনক্রিপ্ট করা সঞ্চয়স্থান , যা ডিফল্ট স্টোরেজ অবস্থান এবং ব্যবহারকারী ডিভাইসটি আনলক করার পরেই উপলব্ধ।
  • ডিভাইস এনক্রিপ্ট করা সঞ্চয়স্থান , যা ডাইরেক্ট বুট মোডের সময় এবং ব্যবহারকারী ডিভাইসটি আনলক করার পরে উভয় ক্ষেত্রেই উপলব্ধ একটি স্টোরেজ অবস্থান।

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

  • অ্যালার্ম ঘড়ি অ্যাপের মতো নির্ধারিত বিজ্ঞপ্তি রয়েছে এমন অ্যাপ।
  • যে অ্যাপগুলি গুরুত্বপূর্ণ ব্যবহারকারীর বিজ্ঞপ্তি প্রদান করে, যেমন SMS অ্যাপ।
  • যে অ্যাপগুলি অ্যাক্সেসিবিলিটি পরিষেবা প্রদান করে, যেমন Talkback৷

আপনার অ্যাপকে ডাইরেক্ট বুট মোডে চলাকালীন ডেটা অ্যাক্সেস করার প্রয়োজন হলে, ডিভাইস এনক্রিপ্ট করা স্টোরেজ ব্যবহার করুন। ডিভাইস এনক্রিপ্ট করা সঞ্চয়স্থানে একটি কী দিয়ে এনক্রিপ্ট করা ডেটা থাকে যা শুধুমাত্র একটি ডিভাইস সফলভাবে যাচাইকৃত বুট করার পরেই পাওয়া যায়।

ব্যবহারকারীর শংসাপত্রের সাথে যুক্ত একটি কী দিয়ে এনক্রিপ্ট করা আবশ্যক ডেটার জন্য, যেমন একটি পিন বা পাসওয়ার্ড, শংসাপত্র এনক্রিপ্ট করা স্টোরেজ ব্যবহার করুন৷ ব্যবহারকারী সফলভাবে ডিভাইসটি আনলক করার পরে এবং ব্যবহারকারী ডিভাইসটি পুনরায় চালু না করা পর্যন্ত শংসাপত্র এনক্রিপ্ট করা স্টোরেজ উপলব্ধ থাকে। যদি ব্যবহারকারী ডিভাইসটি আনলক করার পরে লক স্ক্রীন সক্ষম করে, তাহলে শংসাপত্র এনক্রিপ্ট করা সঞ্চয়স্থান উপলব্ধ থাকে।

সরাসরি বুটের সময় চালানোর জন্য অ্যাক্সেসের অনুরোধ করুন

ডাইরেক্ট বুট মোড চলাকালীন বা ডিভাইস এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করার আগে অ্যাপগুলিকে অবশ্যই তাদের উপাদানগুলিকে সিস্টেমের সাথে নিবন্ধন করতে হবে। অ্যাপ্লিকেশানগুলি উপাদানগুলিকে এনক্রিপশন সচেতন হিসাবে চিহ্নিত করে সিস্টেমের সাথে নিবন্ধন করে৷ আপনার উপাদানটিকে এনক্রিপশন সচেতন হিসাবে চিহ্নিত করতে, আপনার ম্যানিফেস্টে android:directBootAware বৈশিষ্ট্যটিকে সত্য হিসাবে সেট করুন৷

ডিভাইসটি পুনরায় চালু হলে এনক্রিপশন সচেতন উপাদানগুলি সিস্টেম থেকে একটি 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 12 এর মাধ্যমে Android 7.0 চালাচ্ছে সেগুলি ফাইল-ভিত্তিক এনক্রিপশনে রূপান্তরিত হতে পারে। এটি করার দুটি উপায় আছে:

      সতর্কতা: ফাইল-ভিত্তিক এনক্রিপশনে রূপান্তর করার যে কোনও পদ্ধতি ডিভাইসের সমস্ত ব্যবহারকারীর ডেটা মুছে দেয়৷

    • ডিভাইসে, বিকাশকারী বিকল্পগুলি সক্ষম করুন যদি আপনি ইতিমধ্যে সেটিংস > ফোন সম্পর্কে যান এবং বিল্ড নম্বরে সাতবার ট্যাপ করে থাকেন৷ তারপর সেটিংস > বিকাশকারী বিকল্পগুলিতে যান এবং ফাইল এনক্রিপশনে রূপান্তর নির্বাচন করুন।
    • বিকল্পভাবে, নিম্নলিখিত শেল কমান্ডগুলি চালান:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • অ্যান্ড্রয়েড 13 বা তার নীচের সংস্করণে চলমান ডিভাইসগুলি একটি "ইমুলেটেড" ডাইরেক্ট বুট মোড সমর্থন করে যা এনক্রিপ্ট করা ফাইলগুলি লক এবং আনলক করার প্রভাবগুলি অনুকরণ করতে ফাইল অনুমতি ব্যবহার করে৷ উন্নয়নের সময় শুধুমাত্র অনুকরণ মোড ব্যবহার করুন; এটি ডেটা ক্ষতির কারণ হতে পারে। এমুলেটেড ডাইরেক্ট বুট মোড সক্ষম করতে, ডিভাইসে একটি লক প্যাটার্ন সেট করুন, একটি লক প্যাটার্ন সেট করার সময় একটি নিরাপদ স্টার্ট-আপ স্ক্রীনের জন্য অনুরোধ করা হলে "না ধন্যবাদ" নির্বাচন করুন এবং তারপরে নিম্নলিখিত শেল কমান্ডটি চালান:

    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 উভয়ের জন্যই পরীক্ষা করা নিশ্চিত করুন৷

অতিরিক্ত কোড নমুনা

DirectBoot নমুনা এই পৃষ্ঠায় কভার করা API-এর ব্যবহার আরও প্রদর্শন করে।