EncryptedSharedPreferences হল AndroidX Security লাইব্রেরির একটি কম্পোনেন্ট যা SharedPreferences API-এর মাধ্যমে সংরক্ষিত ডেটার স্বচ্ছ এনক্রিপশন প্রদান করে। সাধারণ SharedPreferences-এর বিপরীতে, যেখানে ডেটা একটি সাধারণ XML ফাইলে সংরক্ষিত থাকে, EncryptedSharedPreferences ডিস্কে লেখার আগে স্বয়ংক্রিয়ভাবে কী এবং মান এনক্রিপ্ট করে। Android Developers-এর মতে, লাইব্রেরিটি মানের জন্য AES-256 GCM এবং কী-গুলোর জন্য AES-256 SIV (RFC 5297) ব্যবহার করে, যা ডেটার গোপনীয়তা এবং অখণ্ডতা নিশ্চিত করে।
মূল পয়েন্ট
EncryptedSharedPreferences হল androidx.security.crypto প্যাকেজের একটি ক্লাস, যা AndroidX Security 1.0.0 (2019)-এ প্রবর্তিত হয়েছে। এটি SharedPreferences ইন্টারফেস বাস্তবায়ন করে, কিন্তু সমস্ত লেখার অপারেশন (putString, putInt, putBoolean, ইত্যাদি) আগে থেকেই ডেটা এনক্রিপ্ট করে এবং পড়ার অপারেশন ফেরত দেওয়ার আগে ডেটা ডিক্রিপ্ট করে।
স্ট্যান্ডার্ড SharedPreferences অ্যাপের ডিরেক্টরিতে (/data/data/package/shared_prefs/) একটি XML ফাইলে ডেটা সংরক্ষণ করে। ফাইলটি এনক্রিপ্টেড নয় — ডিভাইসে রুট অ্যাক্সেস থাকলে বা ব্যাকআপ বিশ্লেষণের সময়, সমস্ত ডেটা সাধারণ XML হিসেবে পড়া যায়। প্রমাণীকরণ টোকেন, API কী এবং ব্যবহারকারীর ব্যক্তিগত ডেটা আক্রমণকারীর জন্য অ্যাক্সেসযোগ্য হয়ে যায়।
EncryptedSharedPreferences এই সমস্যাটি লাইব্রেরি স্তরে সমাধান করে: ডেটা ডিস্কে লেখার আগে এনক্রিপ্ট করা হয় এবং পড়ার সময় ডিক্রিপ্ট করা হয়। ডেভেলপারের ম্যানুয়ালি ক্রিপ্টোগ্রাফিক ফাংশন কল করার প্রয়োজন নেই — API সাধারণ SharedPreferences-এর মতোই থাকে।
AndroidX Security লাইব্রেরি v1.0.0 ডিসেম্বর 2019-এ প্রকাশিত হয়েছিল। EncryptedSharedPreferences Cipher + SharedPreferences-এর মাধ্যমে ম্যানুয়াল এনক্রিপশনের পুরনো পদ্ধতি প্রতিস্থাপন করেছে। বর্তমান স্থিতিশীল সংস্করণ হল 1.1.0-alpha06 (2024), যা API 19+ সমর্থন করে। লাইব্রেরিটি Jetpack-এর অংশ এবং অতিরিক্ত অনুমতির প্রয়োজন নেই।
Google Security Blog (2024)-এর মতে, EncryptedSharedPreferences হল সংবেদনশীল অ্যাপ সেটিংস সংরক্ষণের প্রস্তাবিত উপায় যার ক্লাউড সিঙ্ক্রোনাইজেশনের প্রয়োজন নেই। আরও জটিল পরিস্থিতির জন্য, SQLCipher এনক্রিপশন সহ Room সুপারিশ করা হয়।
EncryptedSharedPreferences একটি দ্বি-স্তরের এনক্রিপশন স্কিম ব্যবহার করে: Master Key Android Keystore-এ সংরক্ষিত থাকে এবং ডেটা এনক্রিপশনের জন্য ডেরিভেটিভ কী ব্যবহার করা হয়। এটি Keystore সুরক্ষাকে সিমেট্রিক এনক্রিপশনের পারফরম্যান্সের সাথে একত্রিত করে।
মানের জন্য AES-256 GCM (Galois/Counter Mode) ব্যবহার করা হয় — একটি প্রমাণিত এনক্রিপশন মোড (AEAD) যা ডেটার গোপনীয়তা এবং অখণ্ডতা নিশ্চিত করে। কী-গুলোর জন্য (প্যারামিটারের নাম) AES-256 SIV (RFC 5297) প্রয়োগ করা হয় — ডিটারমিনিস্টিক এনক্রিপশন যা এর বিষয়বস্তু প্রকাশ না করেই কী অনুসন্ধানের জন্য প্রয়োজনীয়।
EncryptedSharedPreferences-এ প্রতিটি ফাইল-এ এনক্রিপ্টেড কী-মান জোড়া থাকে। ফাইল কাঠামোর মধ্যে রয়েছে: প্রথমে মেটাডেটা সহ একটি হেডার (সংস্করণ, কী শনাক্তকারী), তারপর এনক্রিপ্টেড এন্ট্রির একটি তালিকা। ফাইলটি বৈধ XML নয় এবং টেক্সট এডিটর দিয়ে পড়া যায় না।
MasterKey ক্লাস Android Keystore-এ সংরক্ষিত একটি 256-বিট মাস্টার কী তৈরি এবং পরিচালনার জন্য দায়ী। MasterKey.Builder কনফিগার করার অনুমতি দেয়: স্টোরেজ টাইপ (Keystore বা সফ্টওয়্যার), বায়োমেট্রিক সুরক্ষা এবং কী-এর জীবনকাল। ডিফল্টরূপে, মাস্টার কী Android Keystore-এ AES/GCM/NoPadding অ্যালগরিদম দিয়ে তৈরি হয়।
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences
fun getEncryptedPrefs() {
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.AES256_GCM_SPEC)
.build()
val prefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
}
EncryptedSharedPreferences.create পাঁচটি প্যারামিটার নেয়: কনটেক্সট, ফাইলের নাম, মাস্টার কী, কী এনক্রিপশন স্কিম এবং মান এনক্রিপশন স্কিম। স্কিমগুলির পছন্দ পারফরম্যান্স এবং সুরক্ষা স্তরকে প্রভাবিত করে।
AES256_SIV — ডিটারমিনিস্টিক এনক্রিপশন: অভিন্ন কী সবসময় একই সাইফারটেক্সট তৈরি করে। এটি কী অনুসন্ধানের জন্য প্রয়োজনীয় (SharedPreferences.getX(key))। ত্রুটি: একজন আক্রমণকারী পুনরাবৃত্ত সাইফারটেক্সট মিলিয়ে নির্ধারণ করতে পারে কোন কী ব্যবহার করা হচ্ছে। AES256_SIV2 — অতিরিক্ত র্যান্ডমাইজেশন সহ একটি উন্নত সংস্করণ।
মানের জন্য AES256_GCM ব্যবহার করা হয়। GCM প্রতিটি মানের সাথে একটি 12-বাইট IV (ইনিশিয়ালাইজেশন ভেক্টর) এবং একটি 16-বাইট প্রমাণীকরণ ট্যাগ যোগ করে। এটি গোপনীয়তা (কেউ মান পড়তে পারে না) এবং প্রমাণীকরণ (কেউ সনাক্ত না করে মান পরিবর্তন করতে পারে না) নিশ্চিত করে।
MasterKey.Builder-এ setUserAuthenticationRequired(true) পদ্ধতি Keystore থেকে মাস্টার কী পুনরুদ্ধার করার আগে বায়োমেট্রিক নিশ্চিতকরণ প্রয়োজন। এটি একটি অতিরিক্ত স্তর যোগ করে: এমনকি যদি অ্যাপটি আনলক করা ডিভাইসে চলছে, তবুও একজন আক্রমণকারী Face ID বা Touch ID ছাড়া EncryptedSharedPreferences পড়তে পারে না।
গুরুত্বপূর্ণ: setUserAuthenticationRequired-এর সাথে, ব্যবহারকারী বায়োমেট্রিক্স পরিবর্তন বা মুছে ফেললে মাস্টার কী অনুপলব্ধ হয়ে যায়। KeyPermanentlyInvalidatedException হ্যান্ডেল করা এবং ডেটা মাইগ্রেশন সহ একটি নতুন মাস্টার কী তৈরি করা প্রয়োজন।
fun createBiometricKey(): MasterKey {
return MasterKey.Builder(context)
.setKeyScheme(MasterKey.AES256_GCM_SPEC)
.setUserAuthenticationRequired(true)
.setRequestStrongBoxBacked(true)
.build()
}
fun writeSecureToken(token: String) {
try {
prefs.edit().putString("auth_token", token).apply()
} catch (e: KeyPermanentlyInvalidatedException) {
// বায়োমেট্রিক্স পরিবর্তিত হয়েছে — কী পুনরায় তৈরি করতে হবে
}
}
আসুন Kotlin ব্যবহার করে Android অ্যাপে EncryptedSharedPreferences সংহত করার একটি সম্পূর্ণ উদাহরণ দেখি। androidx.security:security-crypto লাইব্রেরিটি Gradle-এর মাধ্যমে যুক্ত করা হয়।
build.gradle (app) ফাইলে যোগ করুন: implementation "androidx.security:security-crypto:1.1.0-alpha06"। Kotlin প্রকল্পের জন্য, kotlin-stdlib-ও প্রয়োজন। MasterKey ইনিশিয়ালাইজেশন একবার হয়, সাধারণত Application.onCreate-এ বা DI কন্টেইনারের মাধ্যমে।
EncryptedSharedPreferences ইনস্ট্যান্স তৈরি করার পরে, API সাধারণ SharedPreferences থেকে আলাদা নয়। edit() একটি Editor ফেরত দেয়, সমস্ত পদ্ধতি (putString, getString, putBoolean, getBoolean) একইভাবে কাজ করে। একমাত্র পার্থক্য অভ্যন্তরীণ: ডেটা লেখার সময় এনক্রিপ্ট হয় এবং পড়ার সময় ডিক্রিপ্ট হয়।
class AuthRepository(context: Context) {
private val prefs = createEncryptedPrefs(context)
fun saveCredentials(login: String, password: String) {
prefs.edit()
.putString("login", login)
.putString("password", password)
.apply()
}
fun getToken(): String? {
return prefs.getString("auth_token", null)
}
fun clearAll() {
prefs.edit().clear().apply()
}
}
অনএনক্রিপ্টেড SharedPreferences থেকে EncryptedSharedPreferences-এ বিদ্যমান ডেটা মাইগ্রেট করতে: পুরানো ফাইল থেকে সমস্ত ডেটা পড়ুন, একটি নতুন EncryptedSharedPreferences তৈরি করুন, সমস্ত ডেটা লিখুন এবং পুরানো ফাইল মুছুন। Google কোনো বিল্ট-ইন মাইগ্রেটর সরবরাহ করে না — ডেভেলপার এটি ম্যানুয়ালি বাস্তবায়ন করে।
SharedPreferences এবং EncryptedSharedPreferences-এর মধ্যে পছন্দ সংরক্ষিত ডেটার ধরণের উপর নির্ভর করে। UI সেটিংস (থিম, ভাষা, সাজানোর) জন্য, সাধারণ SharedPreferences যথেষ্ট। গোপনীয় তথ্যের (টোকেন, পাসওয়ার্ড, কী) জন্য EncryptedSharedPreferences বাধ্যতামূলক।
EncryptedSharedPreferences ক্রিপ্টোগ্রাফিক অপারেশনের কারণে সাধারণের চেয়ে ধীর। একটি স্ট্রিং মান লিখতে ~5-15 ms লাগে (ডেটার আকার এবং AES হার্ডওয়্যার ত্বরণের উপর নির্ভর করে)। পড়তে 2-5 ms লাগে। বেশিরভাগ অ্যাপের জন্য এটি অলক্ষিত, কিন্তু ব্যাচ অপারেশনের (মাইগ্রেশন, পুনরুদ্ধার) জন্য commit()-এর পরিবর্তে apply() ব্যবহার করুন।
সাধারণ SharedPreferences কোনো ক্রিপ্টোগ্রাফিক সুরক্ষা প্রদান করে না: রুট অ্যাক্সেস আছে এমন কোনো প্রক্রিয়া বা adb backup-এর মাধ্যমে XML ফাইল পড়া যায়। EncryptedSharedPreferences অ্যাপ্লিকেশন স্তরে ডেটা এনক্রিপ্ট করে এবং মাস্টার কী ঐচ্ছিক হার্ডওয়্যার সুরক্ষা (StrongBox) সহ Android Keystore-এ সংরক্ষিত থাকে।
| বৈশিষ্ট্য | SharedPreferences | EncryptedSharedPreferences |
|---|---|---|
| সংরক্ষণ | সাধারণ XML | এনক্রিপ্টেড বাইনারি ফাইল |
| এনক্রিপশন | কোনোটিই নয় | AES-256 GCM + SIV |
| কী সুরক্ষা | কোনোটিই নয় | Android Keystore + StrongBox |
| পারফরম্যান্স | 0.1-1 ms | 2-15 ms |
| সুপারিশ | UI সেটিংস | টোকেন, কী, PII |
EncryptedSharedPreferences ব্যবহার করুন: OAuth রিফ্রেশ টোকেন, বাহ্যিক পরিষেবার জন্য API কী, ব্যবহারকারীর ইমেল বা ফোন নম্বর এবং সংবেদনশীল অ্যাপ সেটিংস (PIN, প্রমাণীকরণ ফ্ল্যাগ) সংরক্ষণের জন্য। EncryptedSharedPreferences বায়োমেট্রিক ডেটা বা বড় ডকুমেন্টের জন্য উপযুক্ত নয় — পরিবর্তে EncryptedFile বা SQLCipher সহ Room ব্যবহার করুন।
সাধারণ নিয়ম: যদি ডেটা ফাঁস ব্যবহারকারী বা ব্যবসার ক্ষতি করবে — EncryptedSharedPreferences ব্যবহার করুন। যদি ডেটা শুধুমাত্র প্রসাধনী হয় (থিম, ভাষা, সাজানো) — সাধারণ SharedPreferences। প্রথম থেকেই EncryptedSharedPreferences প্রয়োগ করা বোধগম্য, রিফ্যাক্টরিং ছাড়াই: বিদ্যমান প্রকল্পে এটি প্রতিস্থাপনের জন্য মাইগ্রেশন এবং পুরানো অনএনক্রিপ্টেড ডেটা পরিচালনার প্রয়োজন হবে।
মনে রাখবেন EncryptedSharedPreferences অ্যাপ চলাকালীন ডেটা সুরক্ষা করে না — শুধুমাত্র ডিস্কে। যদি আক্রমণকারীর প্রক্রিয়া মেমরিতে অ্যাক্সেস থাকে, তবে ডিক্রিপ্টেড ডেটা আটকানো যেতে পারে। অতিরিক্ত সুরক্ষা ব্যবহার করুন: অস্পষ্টতার জন্য ProGuard/DexGuard।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Jetpack DataStore SharedPreferences-এর একটি আরও আধুনিক বিকল্প, যা Flow এবং Kotlin coroutines-এর উপর ভিত্তি করে। DataStore ডিফল্টরূপে ডেটা এনক্রিপ্ট করে না, কিন্তু EncryptedSharedPreferences-এর সাথে একত্রিত করা যেতে পারে বা ক্রিপ্টোগ্রাফিক প্রোটোকলের সাথে Proto DataStore-এর মাধ্যমে ম্যানুয়াল এনক্রিপশন ব্যবহার করা যেতে পারে।
সুপারিশ করা হয় না। EncryptedSharedPreferences ছোট ভলিউমের (100-200 KB পর্যন্ত) জন্য ডিজাইন করা হয়েছে। বড় ডেটার জন্য, একই AndroidX Security লাইব্রেরি থেকে SQLCipher সহ Room বা EncryptedFile-এর মাধ্যমে ফাইল এনক্রিপশন ব্যবহার করুন।
না, কোনো স্বয়ংক্রিয় স্কিমা মাইগ্রেশন নেই। ডেটা কাঠামো পরিবর্তন করার সময়, ডেভেলপারকে পুরানো KeyGen-এর মাধ্যমে ম্যানুয়ালি পুরানো ডেটা পড়তে হবে এবং নতুনটির মাধ্যমে লিখতে হবে। একটি পৃথক প্যারামিটারে স্কিমা সংস্করণ সংরক্ষণ করার সুপারিশ করা হয়।
AndroidX Security 1.0.0 API 19+ (Android KitKat) সমর্থন করে। সংস্করণ 1.1.0-alpha06 API 19+ সমর্থন করে। StrongBox-এর জন্য API 28+ এবং হার্ডওয়্যার সমর্থন সহ ডিভাইস প্রয়োজন (Google Pixel 3+, Samsung Galaxy S9+)।
হ্যাঁ, refresh token প্রধান ব্যবহারের ক্ষেত্রগুলির মধ্যে একটি। AES-256 GCM এনক্রিপশন, Keystore-এ মাস্টার কী, বায়োমেট্রিক সুরক্ষা — OAuth টোকেনের জন্য যথেষ্ট স্তর। স্বল্পমেয়াদী অ্যাক্সেস টোকেনের জন্যও উপযুক্ত, যদিও কিছু দল সেগুলি মেমরিতে সংরক্ষণ করতে পছন্দ করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন