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 कोई क्रिप्टोग्राफ़िक सुरक्षा प्रदान नहीं करता: XML फ़ाइल रूट एक्सेस वाली किसी भी प्रक्रिया या adb backup के माध्यम से पढ़ी जा सकती है। 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 लाइब्रेरी से Room with SQLCipher या 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें