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 کوئی خفیہ نگاری تحفظ فراہم نہیں کرتا: XML فائل روٹ رسائی والے کسی بھی عمل یا adb backup کے ذریعے پڑھی جا سکتی ہے۔ 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں