Mobil
Mobil ilovada maxfiy ma'lumotlarni xavfsiz saqlash: Keystore va Keychain
Token va shaxsiy ma'lumotlarni SharedPreferences yoki UserDefaults'da saqlash ekspertizada yuqori xavf deb topiladi. Android Keystore va iOS Keychain'dan to'g'ri foydalanish.
· 6 daq. o'qish

O'z ilovamiz ekspertizasidagi Android topilmalaridan biri qisqa va aniq edi: "maxfiy ma'lumotlar ichki xotirada shifrlanmagan holda saqlangan". Xavf darajasi — yuqori. Ilova kirish tokenini oddiy sozlamalar faylida saqlardi. Oddiy telefonda bu faylni boshqa ilova o'qiy olmaydi, lekin root qilingan qurilmada yoki zaxira nusxa orqali u ochiq matn sifatida ko'rinadi.
Bu maqolada mobil ilovada nimani, qayerda va qanday saqlash kerakligini ko'rib chiqamiz.
Odatiy xato: "ichki xotira baribir yopiq"
Ko'p ishlab chiquvchilar shunday fikrlaydi: ilova papkasi sandbox ichida, boshqa ilovalar unga kira olmaydi, demak shifrlash shart emas. Bu faqat ideal sharoitda to'g'ri. Amalda ichki xotiradagi ma'lumot quyidagi yo'llar bilan chiqib ketishi mumkin:
- Root yoki jailbreak — eng yuqori huquqqa ega foydalanuvchi istalgan ilova papkasini o'qiy oladi.
- Zaxira nusxa — Android'da
allowBackupyoqilgan bo'lsa, ilova ma'lumotlari zaxiraga tushadi va boshqa qurilmada tiklanishi mumkin. - Fizik kirish va forensika — qurilma qo'lga tushsa, ochiq saqlangan ma'lumotni olish osonroq.
- Ilova ichidagi boshqa zaiflik — masalan, fayllarga noto'g'ri yo'l bergan WebView yoki content provider.
Shuning uchun MASVS'ning STORAGE guruhi maxfiy ma'lumotni platformaning himoyalangan saqlash mexanizmlarida saqlashni talab qiladi. OWASP Mobile Top 10 2024'da bu M9 (Insecure Data Storage) toifasi.
Nima maxfiy hisoblanadi
- Kirish (access) va yangilash (refresh) tokenlari, sessiya identifikatorlari.
- API kalitlari va shifrlash kalitlari.
- Shaxsiy ma'lumotlar: JSHSHIR, pasport ma'lumotlari, telefon raqami, moliyaviy ko'rsatkichlar.
- Biometrik yoki PIN bilan bog'liq ma'lumotlar.
Foydalanuvchi parolini qurilmada umuman saqlamaslik kerak. Uning o'rniga server bergan, muddati cheklangan token saqlanadi.
Platforma vositalari
Android Keystore
Android Keystore — kriptografik kalitlarni saqlash tizimi. Uning asosiy afzalligi: kalit ilova xotirasiga chiqarilmaydi. Ko'p qurilmalarda kalit apparat darajasida (TEE yoki StrongBox) saqlanadi. Ilova kalit bilan ma'lumotni shifrlashni so'raydi, lekin kalitning o'zini ko'rmaydi. Shifrlangan ma'lumot oddiy faylda turishi mumkin — kalitsiz u foydasiz.
iOS Keychain
iOS Keychain — parol, token va kalitlar uchun tizim darajasidagi shifrlangan ombor. Har bir yozuv uchun kirish sharti belgilanadi. Masalan:
WhenUnlockedThisDeviceOnly— ma'lumot faqat qurilma qulfdan chiqarilganda o'qiladi va boshqa qurilmaga zaxira orqali o'tmaydi.AfterFirstUnlockThisDeviceOnly— qayta yoqilgandan keyin birinchi qulfdan chiqarishdan so'ng o'qiladi. Fonda ishlaydigan so'rovlar uchun qulay.
ThisDeviceOnly qo'shimchasi muhim: u yozuvning iCloud zaxirasi orqali boshqa qurilmaga ko'chishiga yo'l qo'ymaydi.
Flutter'da amalda: flutter_secure_storage
Flutter ilovamizda biz flutter_secure_storage paketini ishlatdik. U Android'da Keystore asosidagi shifrlashdan, iOS'da Keychain'dan foydalanadi, kod esa ikkala platforma uchun bitta:
const storage = FlutterSecureStorage(
iOptions: IOSOptions(
accessibility: KeychainAccessibility.first_unlock_this_device,
),
);
await storage.write(key: 'access_token', value: token);
final token = await storage.read(key: 'access_token');
Shu bilan birga quyidagi o'zgarishlar ham kiritildi:
- Barcha tokenlar
SharedPreferences'dan ko'chirildi.SharedPreferencesfaqat maxfiy bo'lmagan sozlamalar uchun qoldi: til, mavzu, onboarding ko'rilganmi. - Zaxira nusxa o'chirildi.
AndroidManifest.xmlichida:
<application
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules">
data_extraction_rules Android 12 va undan yuqori versiyalarda bulut zaxirasi va qurilmadan qurilmaga ko'chirishni boshqaradi.
- Chiqishda hamma narsa tozalanadi. Foydalanuvchi tizimdan chiqqanda xavfsiz ombordagi yozuvlar o'chiriladi, WebView keshi, cookie'lari va saqlangan ma'lumotlari ham tozalanadi. Aks holda keyingi foydalanuvchi oldingi sessiya izlarini topishi mumkin.
Xavfsiz ombor ma'lumotni diskda himoya qiladi. Lekin u ilova ish vaqtida xotirada nimani ushlab turganini himoya qilmaydi. Shuning uchun u RASP va root aniqlash bilan birga ishlashi kerak.
E'tibor beriladigan nozik joylar
- iOS Keychain ilova o'chirilgandan keyin ham qolishi mumkin. Agar foydalanuvchi ilovani o'chirib, qayta o'rnatsa, eski token topilishi mumkin. Yechim: birinchi ishga tushirishda oddiy belgini tekshiring va u yo'q bo'lsa, Keychain'dagi eski yozuvlarni o'chiring.
- Loglarda maxfiy ma'lumot qolmasin. Release build'da tokenlar, so'rov tanalari va shaxsiy ma'lumotlar logga yozilmasligi kerak.
- Kesh va vaqtinchalik fayllar. Yuklab olingan hujjatlar, PDF hisobotlar va rasmlar ham maxfiy bo'lishi mumkin. Ularni ishlatib bo'lgach o'chiring.
- Ekran tasvirlari. Maxfiy ekranlarda Android'da
FLAG_SECUREishlatish va iOS'da ilova fonga o'tganda kontentni yashirish mumkin.
Tekshirib ko'ring
- Root qilingan test qurilmasida ilova papkasini (
/data/data/<paket>/) oching vashared_prefs, ma'lumotlar bazalari hamda fayllarda ochiq token yoki shaxsiy ma'lumot qidiring. adb backupyoki qurilma ko'chirish orqali ma'lumot chiqishini tekshiring.- Tizimdan chiqqandan keyin ilova papkasi va WebView ma'lumotlarida sessiya izlari qolmaganiga ishonch hosil qiling.
- iOS'da ilovani o'chirib, qayta o'rnating va avtomatik kirish bo'lmasligini tekshiring.
Xulosa
Maxfiy ma'lumotni xavfsiz saqlash murakkab ish emas: platforma buning uchun tayyor vositalarni beradi. Asosiy ish — ma'lumot qayerlarda saqlanayotganini aniqlash va uni Keystore yoki Keychain'ga ko'chirish, zaxira va chiqishdagi tozalashni to'g'ri sozlash.
Ilovangiz maxfiy ma'lumotlarni qanday saqlashini tekshirmoqchi bo'lsangiz, skanerlash uchun ariza qoldiring. Biz teshiklarni topamiz va ularni ekspertizadan oldin yopishga yordam beramiz.


