EncryptedSharedPreferences: এটি কী, API এবং কীভাবে ব্যবহার করবেন

লেখক: IT Sectr প্রকাশিত: 2026-03-14 পড়ার সময়: 10 মিনিট

EncryptedSharedPreferences হল AndroidX Security লাইব্রেরির একটি কম্পোনেন্ট যা SharedPreferences API-এর মাধ্যমে সংরক্ষিত ডেটার স্বচ্ছ এনক্রিপশন প্রদান করে। সাধারণ SharedPreferences-এর বিপরীতে, যেখানে ডেটা একটি সাধারণ XML ফাইলে সংরক্ষিত থাকে, EncryptedSharedPreferences ডিস্কে লেখার আগে স্বয়ংক্রিয়ভাবে কী এবং মান এনক্রিপ্ট করে। Android Developers-এর মতে, লাইব্রেরিটি মানের জন্য AES-256 GCM এবং কী-গুলোর জন্য AES-256 SIV (RFC 5297) ব্যবহার করে, যা ডেটার গোপনীয়তা এবং অখণ্ডতা নিশ্চিত করে।

মূল পয়েন্ট

  • EncryptedSharedPreferences — সমস্ত সংরক্ষিত ডেটার স্বয়ংক্রিয় এনক্রিপশন সহ SharedPreferences-এর উপর একটি র্যাপার
  • এনক্রিপশন Android Keystore-এর মাধ্যমে মানের জন্য AES-256 GCM এবং কী-গুলোর জন্য AES-256 SIV ব্যবহার করে
  • Authenticated Encryption (AEAD) গ্যারান্টি দেয় যে লেখার পর ডেটা পরিবর্তন করা হয়নি
  • Master Key Android Keystore-এ সংরক্ষিত থাকে এবং TEE আছে এমন ডিভাইসে হার্ডওয়্যার-সুরক্ষিত
  • API সম্পূর্ণরূপে SharedPreferences-এর সাথে সামঞ্জস্যপূর্ণ — রিড এবং রাইট কোড পরিবর্তন না করেই প্রতিস্থাপন ঘটে

EncryptedSharedPreferences কী?

EncryptedSharedPreferences হল androidx.security.crypto প্যাকেজের একটি ক্লাস, যা AndroidX Security 1.0.0 (2019)-এ প্রবর্তিত হয়েছে। এটি SharedPreferences ইন্টারফেস বাস্তবায়ন করে, কিন্তু সমস্ত লেখার অপারেশন (putString, putInt, putBoolean, ইত্যাদি) আগে থেকেই ডেটা এনক্রিপ্ট করে এবং পড়ার অপারেশন ফেরত দেওয়ার আগে ডেটা ডিক্রিপ্ট করে।

সাধারণ SharedPreferences-এর সমস্যা

স্ট্যান্ডার্ড 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 কীভাবে কাজ করে?

EncryptedSharedPreferences একটি দ্বি-স্তরের এনক্রিপশন স্কিম ব্যবহার করে: Master Key Android Keystore-এ সংরক্ষিত থাকে এবং ডেটা এনক্রিপশনের জন্য ডেরিভেটিভ কী ব্যবহার করা হয়। এটি Keystore সুরক্ষাকে সিমেট্রিক এনক্রিপশনের পারফরম্যান্সের সাথে একত্রিত করে।

এনক্রিপশন স্কিম: AES-256 GCM + SIV

মানের জন্য AES-256 GCM (Galois/Counter Mode) ব্যবহার করা হয় — একটি প্রমাণিত এনক্রিপশন মোড (AEAD) যা ডেটার গোপনীয়তা এবং অখণ্ডতা নিশ্চিত করে। কী-গুলোর জন্য (প্যারামিটারের নাম) AES-256 SIV (RFC 5297) প্রয়োগ করা হয় — ডিটারমিনিস্টিক এনক্রিপশন যা এর বিষয়বস্তু প্রকাশ না করেই কী অনুসন্ধানের জন্য প্রয়োজনীয়।

EncryptedSharedPreferences-এ প্রতিটি ফাইল-এ এনক্রিপ্টেড কী-মান জোড়া থাকে। ফাইল কাঠামোর মধ্যে রয়েছে: প্রথমে মেটাডেটা সহ একটি হেডার (সংস্করণ, কী শনাক্তকারী), তারপর এনক্রিপ্টেড এন্ট্রির একটি তালিকা। ফাইলটি বৈধ XML নয় এবং টেক্সট এডিটর দিয়ে পড়া যায় না।

MasterKey এবং KeyStore

MasterKey ক্লাস Android Keystore-এ সংরক্ষিত একটি 256-বিট মাস্টার কী তৈরি এবং পরিচালনার জন্য দায়ী। MasterKey.Builder কনফিগার করার অনুমতি দেয়: স্টোরেজ টাইপ (Keystore বা সফ্টওয়্যার), বায়োমেট্রিক সুরক্ষা এবং কী-এর জীবনকাল। ডিফল্টরূপে, মাস্টার কী Android Keystore-এ AES/GCM/NoPadding অ্যালগরিদম দিয়ে তৈরি হয়।

kotlin
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 হ্যান্ডেল করা এবং ডেটা মাইগ্রেশন সহ একটি নতুন মাস্টার কী তৈরি করা প্রয়োজন।

kotlin
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-এ ব্যবহারের উদাহরণ

আসুন 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) একইভাবে কাজ করে। একমাত্র পার্থক্য অভ্যন্তরীণ: ডেটা লেখার সময় এনক্রিপ্ট হয় এবং পড়ার সময় ডিক্রিপ্ট হয়।

kotlin
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 থেকে মাইগ্রেশন

অনএনক্রিপ্টেড SharedPreferences থেকে EncryptedSharedPreferences-এ বিদ্যমান ডেটা মাইগ্রেট করতে: পুরানো ফাইল থেকে সমস্ত ডেটা পড়ুন, একটি নতুন EncryptedSharedPreferences তৈরি করুন, সমস্ত ডেটা লিখুন এবং পুরানো ফাইল মুছুন। Google কোনো বিল্ট-ইন মাইগ্রেটর সরবরাহ করে না — ডেভেলপার এটি ম্যানুয়ালি বাস্তবায়ন করে।

সাধারণ SharedPreferences-এর সাথে তুলনা

SharedPreferences এবং EncryptedSharedPreferences-এর মধ্যে পছন্দ সংরক্ষিত ডেটার ধরণের উপর নির্ভর করে। UI সেটিংস (থিম, ভাষা, সাজানোর) জন্য, সাধারণ SharedPreferences যথেষ্ট। গোপনীয় তথ্যের (টোকেন, পাসওয়ার্ড, কী) জন্য EncryptedSharedPreferences বাধ্যতামূলক।

পারফরম্যান্স

EncryptedSharedPreferences ক্রিপ্টোগ্রাফিক অপারেশনের কারণে সাধারণের চেয়ে ধীর। একটি স্ট্রিং মান লিখতে ~5-15 ms লাগে (ডেটার আকার এবং AES হার্ডওয়্যার ত্বরণের উপর নির্ভর করে)। পড়তে 2-5 ms লাগে। বেশিরভাগ অ্যাপের জন্য এটি অলক্ষিত, কিন্তু ব্যাচ অপারেশনের (মাইগ্রেশন, পুনরুদ্ধার) জন্য commit()-এর পরিবর্তে apply() ব্যবহার করুন।

নিরাপত্তা

সাধারণ SharedPreferences কোনো ক্রিপ্টোগ্রাফিক সুরক্ষা প্রদান করে না: রুট অ্যাক্সেস আছে এমন কোনো প্রক্রিয়া বা adb backup-এর মাধ্যমে XML ফাইল পড়া যায়। EncryptedSharedPreferences অ্যাপ্লিকেশন স্তরে ডেটা এনক্রিপ্ট করে এবং মাস্টার কী ঐচ্ছিক হার্ডওয়্যার সুরক্ষা (StrongBox) সহ Android Keystore-এ সংরক্ষিত থাকে।

বৈশিষ্ট্যSharedPreferencesEncryptedSharedPreferences
সংরক্ষণসাধারণ XMLএনক্রিপ্টেড বাইনারি ফাইল
এনক্রিপশনকোনোটিই নয়AES-256 GCM + SIV
কী সুরক্ষাকোনোটিই নয়Android Keystore + StrongBox
পারফরম্যান্স0.1-1 ms2-15 ms
সুপারিশUI সেটিংসটোকেন, কী, PII

কখন EncryptedSharedPreferences নির্বাচন করবেন

EncryptedSharedPreferences ব্যবহার করুন: OAuth রিফ্রেশ টোকেন, বাহ্যিক পরিষেবার জন্য API কী, ব্যবহারকারীর ইমেল বা ফোন নম্বর এবং সংবেদনশীল অ্যাপ সেটিংস (PIN, প্রমাণীকরণ ফ্ল্যাগ) সংরক্ষণের জন্য। EncryptedSharedPreferences বায়োমেট্রিক ডেটা বা বড় ডকুমেন্টের জন্য উপযুক্ত নয় — পরিবর্তে EncryptedFile বা SQLCipher সহ Room ব্যবহার করুন।

সাধারণ নিয়ম: যদি ডেটা ফাঁস ব্যবহারকারী বা ব্যবসার ক্ষতি করবে — EncryptedSharedPreferences ব্যবহার করুন। যদি ডেটা শুধুমাত্র প্রসাধনী হয় (থিম, ভাষা, সাজানো) — সাধারণ SharedPreferences। প্রথম থেকেই EncryptedSharedPreferences প্রয়োগ করা বোধগম্য, রিফ্যাক্টরিং ছাড়াই: বিদ্যমান প্রকল্পে এটি প্রতিস্থাপনের জন্য মাইগ্রেশন এবং পুরানো অনএনক্রিপ্টেড ডেটা পরিচালনার প্রয়োজন হবে।

মনে রাখবেন EncryptedSharedPreferences অ্যাপ চলাকালীন ডেটা সুরক্ষা করে না — শুধুমাত্র ডিস্কে। যদি আক্রমণকারীর প্রক্রিয়া মেমরিতে অ্যাক্সেস থাকে, তবে ডিক্রিপ্টেড ডেটা আটকানো যেতে পারে। অতিরিক্ত সুরক্ষা ব্যবহার করুন: অস্পষ্টতার জন্য ProGuard/DexGuard।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

EncryptedSharedPreferences DataStore থেকে কীভাবে আলাদা?

Jetpack DataStore SharedPreferences-এর একটি আরও আধুনিক বিকল্প, যা Flow এবং Kotlin coroutines-এর উপর ভিত্তি করে। DataStore ডিফল্টরূপে ডেটা এনক্রিপ্ট করে না, কিন্তু EncryptedSharedPreferences-এর সাথে একত্রিত করা যেতে পারে বা ক্রিপ্টোগ্রাফিক প্রোটোকলের সাথে Proto DataStore-এর মাধ্যমে ম্যানুয়াল এনক্রিপশন ব্যবহার করা যেতে পারে।

বড় পরিমাণ ডেটার জন্য কি EncryptedSharedPreferences ব্যবহার করা যাবে?

সুপারিশ করা হয় না। EncryptedSharedPreferences ছোট ভলিউমের (100-200 KB পর্যন্ত) জন্য ডিজাইন করা হয়েছে। বড় ডেটার জন্য, একই AndroidX Security লাইব্রেরি থেকে SQLCipher সহ Room বা EncryptedFile-এর মাধ্যমে ফাইল এনক্রিপশন ব্যবহার করুন।

স্কিমা আপডেট করার সময় EncryptedSharedPreferences কি মাইগ্রেশন সমর্থন করে?

না, কোনো স্বয়ংক্রিয় স্কিমা মাইগ্রেশন নেই। ডেটা কাঠামো পরিবর্তন করার সময়, ডেভেলপারকে পুরানো KeyGen-এর মাধ্যমে ম্যানুয়ালি পুরানো ডেটা পড়তে হবে এবং নতুনটির মাধ্যমে লিখতে হবে। একটি পৃথক প্যারামিটারে স্কিমা সংস্করণ সংরক্ষণ করার সুপারিশ করা হয়।

সর্বনিম্ন প্রয়োজনীয় API স্তর কী?

AndroidX Security 1.0.0 API 19+ (Android KitKat) সমর্থন করে। সংস্করণ 1.1.0-alpha06 API 19+ সমর্থন করে। StrongBox-এর জন্য API 28+ এবং হার্ডওয়্যার সমর্থন সহ ডিভাইস প্রয়োজন (Google Pixel 3+, Samsung Galaxy S9+)।

EncryptedSharedPreferences-এ refresh token সংরক্ষণ করা কি নিরাপদ?

হ্যাঁ, refresh token প্রধান ব্যবহারের ক্ষেত্রগুলির মধ্যে একটি। AES-256 GCM এনক্রিপশন, Keystore-এ মাস্টার কী, বায়োমেট্রিক সুরক্ষা — OAuth টোকেনের জন্য যথেষ্ট স্তর। স্বল্পমেয়াদী অ্যাক্সেস টোকেনের জন্যও উপযুক্ত, যদিও কিছু দল সেগুলি মেমরিতে সংরক্ষণ করতে পছন্দ করে।

সারসংক্ষেপ

  • EncryptedSharedPreferences — AES-256 GCM (মান) এবং SIV (কী) এর মাধ্যমে স্বয়ংক্রিয় এনক্রিপশন সহ SharedPreferences র্যাপার
  • Master Key MasterKey.Builder-এর মাধ্যমে তৈরি হয় এবং বায়োমেট্রিক এবং StrongBox বিকল্প সহ Android Keystore-এ সংরক্ষিত হয়
  • API সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ: edit, putString, getString, apply, clear — সবকিছু সাধারণ SharedPreferences-এর মতো
  • পারফরম্যান্স: 2-15 ms প্রতি অপারেশন, সাধারণ পরিস্থিতিতে ব্যবহারকারীর কাছে অলক্ষিত
  • নিরাপত্তা: প্রমাণিত এনক্রিপশন (AEAD) ডেটা পড়া এবং পরিবর্তন উভয়ই প্রতিরোধ করে
  • মাইগ্রেশন সাধারণ SharedPreferences থেকে পুরানো এবং নতুন ফাইলের মাধ্যমে ম্যানুয়াল ডেটা স্থানান্তর প্রয়োজন
  • টোকেন, API কী, পাসওয়ার্ড এবং অন্যান্য সংবেদনশীল সেটিংসের জন্য EncryptedSharedPreferences ব্যবহার করুন

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন